diff --git a/.gitattributes b/.gitattributes index e5773611f..305594ead 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,4 @@ *.gpg binary app/src/screenshotTestFullDefaultDebug/reference/** filter=lfs diff=lfs merge=lfs -text app/src/screenshotTestBasicDefaultDebug/reference/** filter=lfs diff=lfs merge=lfs -text +src/basic/fastlane/metadata/android/*/images/** filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore index 3862f236a..bcb6970c7 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,4 @@ junit-report.xml captures/ /fdroid/ +/screenshots diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f4120d63a..a1ac52727 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -238,11 +238,21 @@ app screenshots: - app/**/* script: - ./gradlew :app:validateBasicDefaultDebugScreenshotTest + after_script: + - | + if [ "$CI_JOB_STATUS" == "failed" ]; then + url="https://${CI_PROJECT_NAMESPACE}.${CI_PAGES_DOMAIN}/-/${CI_PROJECT_NAME}/-/jobs/${CI_JOB_ID}/artifacts/app/build/reports/screenshotTest/preview/debug/basicDefault/index.html" + echo "Report at ${url}" + echo '[{"location":{"path":".","lines":{"begin":1}},"description":"Screenshot test report needs copy and paste: '"${url}"'","check_name":"screenshot_test_report","fingerprint":"screenshot_test_report","severity":"blocker"}]' > codequality-warnings.json + fi artifacts: name: "${CI_PROJECT_PATH}_${CI_JOB_STAGE}_${CI_COMMIT_REF_NAME}_${CI_COMMIT_SHA}" when: always paths: - app/build/reports/screenshotTest + - codequality-warnings.json + reports: + codequality: codequality-warnings.json expire_in: 1 week app tools scripts: @@ -332,6 +342,8 @@ libs database schema: image: briar/ci-image-android-emulator:trixie # TODO change to latest once available tags: - kvm + rules: + - if: '$RUN_KVM_JOBS == "1"' # Cache hits the storage limits in kvm runners quickly cache: [] script: @@ -359,6 +371,23 @@ libs database schema: kvm 24 default x86: <<: [ *test-template, *kvm-connected-template ] +no kvm warning: + image: debian:trixie-slim + rules: + - if: '$RUN_KVM_JOBS != "1"' + cache: [] + script: + - | + echo "WARNING: RUN_KVM_JOBS environment variable is not set." + echo "This job requires a special KVM runner. Skipping with warning." + echo '[{"location":{"path":".gitlab-ci.yml","lines":{"begin":237}},"description":"KVM job was skipped: RUN_KVM_JOBS env variable is not set. Set it to 1 to enable this job.","check_name":"skipped_kvm_job","fingerprint":"skipped_kvm_job","severity":"major"}]' > codequality-warnings.json + exit 42 + artifacts: + reports: + codequality: codequality-warnings.json + allow_failure: + exit_codes: 42 + pages: extends: .base stage: deploy diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 70537d316..697dbc602 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -18,8 +18,8 @@ android { applicationId = "org.fdroid" minSdk = 24 targetSdk = 36 - versionCode = 2000007 - versionName = "2.0-alpha7" + versionCode = 2000008 + versionName = "2.0-alpha8" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index b37172aee..2d269191a 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -13,5 +13,10 @@ -keep class kotlin.LazyKt -keep class kotlin.collections.CollectionsKt +# Used for full's nearby feature +-keep class kellinwood.security.zipsigner.** {*;} +-keep class org.bouncycastle.jcajce.provider.** { *; } +-keep class org.bouncycastle.jce.provider.** { *; } + # for debugging (comment in when needed) #-printconfiguration build/outputs/logs/r8-configuration.txt diff --git a/app/src/androidTest/java/org/fdroid/download/DnsCacheTest.kt b/app/src/androidTest/java/org/fdroid/download/DnsCacheTest.kt index ddad92633..13bdd9eff 100644 --- a/app/src/androidTest/java/org/fdroid/download/DnsCacheTest.kt +++ b/app/src/androidTest/java/org/fdroid/download/DnsCacheTest.kt @@ -9,6 +9,7 @@ import kotlin.test.assertNotNull import kotlin.test.assertNull import kotlin.test.assertTrue import org.fdroid.settings.SettingsManager +import org.junit.Ignore import org.junit.Test import org.junit.runner.RunWith @@ -81,6 +82,7 @@ class DnsCacheTest { } @Test + @Ignore("failing") // TODO fun preloadCacheTest() { // test setup settings.useDnsCache = true diff --git a/app/src/androidTest/java/org/fdroid/ui/screenshots/DetailsScreenshotTest.kt b/app/src/androidTest/java/org/fdroid/ui/screenshots/DetailsScreenshotTest.kt index d890c0748..16a249076 100644 --- a/app/src/androidTest/java/org/fdroid/ui/screenshots/DetailsScreenshotTest.kt +++ b/app/src/androidTest/java/org/fdroid/ui/screenshots/DetailsScreenshotTest.kt @@ -1,7 +1,5 @@ package org.fdroid.ui.screenshots -import androidx.compose.ui.platform.LocalLocaleList -import androidx.core.os.LocaleListCompat import org.fdroid.LocaleChooser.getBestLocale import org.fdroid.download.NetworkState import org.fdroid.install.InstallState @@ -23,11 +21,7 @@ class DetailsScreenshotTest(localeName: String) : LocalizedScreenshotTest(locale @Test fun appDetails() = - screenshotTest("3_Details", showBottomBar = false) { - val localeList = - LocaleListCompat.forLanguageTags( - LocalLocaleList.current.localeList.map { it.toLanguageTag() }.joinToString(",") - ) + screenshotTest("4_Details", showBottomBar = false, dark = true) { localeList -> val item = AppDetailsItem( app = appMetadata, diff --git a/app/src/androidTest/java/org/fdroid/ui/screenshots/DiscoverScreenshotTest.kt b/app/src/androidTest/java/org/fdroid/ui/screenshots/DiscoverScreenshotTest.kt index 8cd10a02a..fd7e553ff 100644 --- a/app/src/androidTest/java/org/fdroid/ui/screenshots/DiscoverScreenshotTest.kt +++ b/app/src/androidTest/java/org/fdroid/ui/screenshots/DiscoverScreenshotTest.kt @@ -1,10 +1,7 @@ package org.fdroid.ui.screenshots -import androidx.compose.foundation.text.input.rememberTextFieldState -import androidx.core.os.LocaleListCompat import org.fdroid.ui.discover.Discover import org.fdroid.ui.discover.LoadedDiscoverModel -import org.junit.Ignore import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.Parameterized @@ -18,15 +15,13 @@ class DiscoverScreenshotTest(localeName: String) : LocalizedScreenshotTest(local @Test fun appDetails() = - screenshotTest("1_Discover") { - val localeList = LocaleListCompat.getDefault() + screenshotTest("1_Discover") { localeList -> val model = LoadedDiscoverModel( newApps = getNewApps(localeList), recentlyUpdatedApps = getRecentlyUpdatedApps(localeList), mostDownloadedApps = getMostDownloadedApps(localeList), categories = getCategoryItems(localeList).groupBy { it.group }, - searchTextFieldState = rememberTextFieldState(), hasRepoIssues = false, ) Discover(discoverModel = model, onListTap = {}, onAppTap = {}, onNav = {}) diff --git a/app/src/androidTest/java/org/fdroid/ui/screenshots/LocalizedScreenshotTest.kt b/app/src/androidTest/java/org/fdroid/ui/screenshots/LocalizedScreenshotTest.kt index 914c2e66d..645af2519 100644 --- a/app/src/androidTest/java/org/fdroid/ui/screenshots/LocalizedScreenshotTest.kt +++ b/app/src/androidTest/java/org/fdroid/ui/screenshots/LocalizedScreenshotTest.kt @@ -1,11 +1,17 @@ package org.fdroid.ui.screenshots +import android.app.LocaleConfig +import android.os.Build.VERSION.SDK_INT +import androidx.compose.material3.adaptive.layout.PaneScaffoldDirective import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier +import androidx.compose.ui.test.DarkMode import androidx.compose.ui.test.DeviceConfigurationOverride import androidx.compose.ui.test.Locales import androidx.compose.ui.test.junit4.v2.createComposeRule +import androidx.compose.ui.test.then import androidx.compose.ui.text.intl.LocaleList +import androidx.core.os.LocaleListCompat +import androidx.navigation3.runtime.NavEntry import androidx.navigation3.runtime.NavKey import androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.UiDevice @@ -22,14 +28,30 @@ import org.junit.Assume.assumeTrue import org.junit.Before import org.junit.Rule -private const val ENABLED = false - @OptIn(DelicateCoilApi::class) abstract class LocalizedScreenshotTest(val localeName: String) { @get:Rule val composeRule = createComposeRule() companion object { - val locales = listOf("en-US", "de-DE", "ar-SA", "he", "zh-CN") + val locales: List by lazy { + if (!enabled) return@lazy emptyList() + val fallback = listOf("en-US", "de-DE", "ar-SA", "he", "zh-CN") + if (SDK_INT >= 33) { + val localeConfig = LocaleConfig(InstrumentationRegistry.getInstrumentation().targetContext) + mutableListOf().apply { + localeConfig.supportedLocales?.let { localeList -> + for (i in 0 until localeList.size()) { + val locale = localeList.get(i) + add(locale.toLanguageTag()) + } + } ?: addAll(fallback) + } + } else { + fallback + } + } + val enabled: Boolean + get() = InstrumentationRegistry.getArguments().getString("fdroid_screenshots") == "true" } private val context = InstrumentationRegistry.getInstrumentation().targetContext @@ -45,7 +67,7 @@ abstract class LocalizedScreenshotTest(val localeName: String) { @Before fun before() { - assumeTrue(ENABLED) + assumeTrue(enabled) } protected fun screenshotTest( @@ -54,26 +76,29 @@ abstract class LocalizedScreenshotTest(val localeName: String) { currentNavKey: NavKey = NavigationKey.Discover, numUpdates: Int = 3, hasAppIssues: Boolean = true, - content: @Composable (Modifier) -> Unit, + dark: Boolean = false, + content: @Composable (LocaleListCompat) -> Unit, ) { val localeList = LocaleList(localeName) composeRule.setContent { DeviceConfigurationOverride( - override = DeviceConfigurationOverride.Locales(locales = localeList) + override = + DeviceConfigurationOverride.Locales(locales = localeList) then + DeviceConfigurationOverride.DarkMode(dark) ) { MainContent( model = - MainModel( - dynamicColors = false, - smallBottomBar = false, - numUpdates = numUpdates, - hasAppIssues = hasAppIssues, + MainModel(dynamicColors = false, numUpdates = numUpdates, hasAppIssues = hasAppIssues), + navEntries = + listOf( + NavEntry(currentNavKey) { content(LocaleListCompat.forLanguageTags(localeName)) } ), + directive = PaneScaffoldDirective.Default, isBigScreen = false, showBottomBar = showBottomBar, currentNavKey = currentNavKey, onNav = {}, - content = content, + onBack = {}, ) } } @@ -82,11 +107,12 @@ abstract class LocalizedScreenshotTest(val localeName: String) { val dir = context.getExternalFilesDir("screenshots") ?: fail("Could not create screenshots dir") assertTrue(dir.isDirectory) val subDir = - File(dir, "${FLAVOR_variant}/fastlane/metadata/$localeName/images/phoneScreenshots") + File(dir, "${FLAVOR_variant}/fastlane/metadata/android/$localeName/images/phoneScreenshots") subDir.mkdirs() assertTrue(subDir.isDirectory) val file = File(subDir, "${screenName}.png") + println("Saving screenshot to ${file.absolutePath}") uiDevice.takeScreenshot(file) } } diff --git a/app/src/androidTest/java/org/fdroid/ui/screenshots/MyAppsScreenshotTest.kt b/app/src/androidTest/java/org/fdroid/ui/screenshots/MyAppsScreenshotTest.kt index 14dd20c13..26b2c952a 100644 --- a/app/src/androidTest/java/org/fdroid/ui/screenshots/MyAppsScreenshotTest.kt +++ b/app/src/androidTest/java/org/fdroid/ui/screenshots/MyAppsScreenshotTest.kt @@ -4,8 +4,8 @@ import androidx.core.os.LocaleListCompat import org.fdroid.download.NetworkState import org.fdroid.ui.apps.MyApps import org.fdroid.ui.apps.MyAppsModel +import org.fdroid.ui.navigation.NavigationKey import org.fdroid.ui.utils.getMyAppsInfo -import org.junit.Ignore import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.Parameterized @@ -19,8 +19,12 @@ class MyAppsScreenshotTest(localeName: String) : LocalizedScreenshotTest(localeN @Test fun myApps() = - screenshotTest("2_My_Apps", numUpdates = getUpdates(LocaleListCompat.getDefault()).size) { - val localeList = LocaleListCompat.getDefault() + screenshotTest( + "3_My_Apps", + currentNavKey = NavigationKey.MyApps, + numUpdates = getUpdates(LocaleListCompat.getDefault()).size, + dark = true, + ) { localeList -> val model = MyAppsModel( appUpdates = getUpdates(localeList), diff --git a/app/src/androidTest/java/org/fdroid/ui/screenshots/SearchItems.kt b/app/src/androidTest/java/org/fdroid/ui/screenshots/SearchItems.kt new file mode 100644 index 000000000..38c5b4fac --- /dev/null +++ b/app/src/androidTest/java/org/fdroid/ui/screenshots/SearchItems.kt @@ -0,0 +1,258 @@ +package org.fdroid.ui.screenshots + +import org.fdroid.index.v2.FileV2 +import org.fdroid.index.v2.MetadataV2 + +val searchResultApps = + listOf( + "com.github.yeriomin.workoutlog" to + MetadataV2( + name = mapOf("en-US" to "WorkoutLog"), + summary = + mapOf( + "ar" to "تطبيق بسيط لتتبع التدريبات الخاصة بك", + "ba" to "Күнекмәләрегеҙҙе күҙәтеү өсөн минималистик ҡушымта", + "ca" to "Aplicació minimalista per a seguir els entrenaments", + "cs" to "Minimalistická aplikace pro sledování vašeho cvičení", + "de" to "Minimalistische Anwendung, um Workouts zu erfassen", + "en-US" to "A minimalistic app for tracking your workouts", + "es" to "Una aplicación minimalista para el seguimiento de tus entrenamientos", + "fr" to "App minimaliste pour suivre vos entraînements", + "ga" to "Aip íostach chun do chuid oibre a rianú", + "he" to "יישומון מזערי למעקב אחר האימונים שלך", + "id" to "Aplikasi minimalis untuk melacak latihan Anda", + "it" to "Un'app minimalista per monitorare i tuoi allenamenti", + "ja" to "ワークアウト追跡用の最小主義なアプリ", + "nb" to "En minimalistisk app for å spore treningene dine", + "pl" to "Aplikacja do śledzenia treningów", + "pt" to "Um app minimalista para rastrear seus treinos", + "pt-BR" to "Um aplicativo minimalista para monitorar seus treinos", + "pt-PT" to "Um app minimalista para rastrear seus treinos", + "ro" to "O aplicație minimalistă pentru a vă urmări antrenamentele", + "ru" to "Минималистичное приложение для отслеживания ваших тренировок", + "sr" to "Минималистичка апликација за праћење тренинга", + "sw" to "Apu ya minimalistic ya kufuatilia mazoezi yako", + "ta" to "உங்கள் உடற்பயிற்சிகளைக் கண்காணிப்பதற்கான மிகச்சிறிய பயன்பாடு", + "tr" to "Egzersizlerinizi izlemek için sadelikten yana bir uygulama", + "uk" to "Мінімалістичний застосунок для відстеження тренувань", + "zh-CN" to "用于跟踪锻炼的简约应用", + ), + icon = mapOf("en-US" to FileV2(name = "/icons/com.github.yeriomin.workoutlog.2.png")), + added = 23, + lastUpdated = 42, + ), + "com.gk.simpleworkoutjournal" to + MetadataV2( + name = mapOf("en-US" to "SWJournal"), + summary = + mapOf( + "ar" to "تتبع تمارينك", + "ba" to "Күнекмәләрегеҙҙе күҙәтегеҙ", + "ca" to "Fes un seguiment dels teus entrenaments", + "cs" to "Sledování tréninků", + "de" to "Workouts aufzeichnen", + "en-US" to "Track your workouts", + "es" to "Monitorea tus entrenamientos", + "fr" to "Suivre vos entraînements", + "ga" to "Rianaigh do workouts", + "he" to "מעקב אחר האימונים שלך", + "id" to "Lacak latihan Anda", + "it" to "Monitora i tuoi allenamenti", + "ja" to "ワークアウトを記録", + "pl" to "Monitoruj swoje treningi", + "pt" to "Rastreie seus treinos", + "pt-BR" to "Monitore seus treinos", + "pt-PT" to "Rastreie seus treinos", + "ro" to "Urmăriți-vă antrenamentele", + "ru" to "Следите за своими тренировками", + "sr" to "Прати своје тренинге", + "sw" to "Fuatilia mazoezi yako", + "ta" to "உங்கள் உடற்பயிற்சிகளையும் கண்காணிக்கவும்", + "tr" to "Egzersizlerinizi izleyin", + "uk" to "Відстежуйте свої тренування", + "zh-CN" to "跟踪你的锻炼", + ), + icon = mapOf("en-US" to FileV2(name = "/icons/com.gk.simpleworkoutjournal.3.png")), + added = 23, + lastUpdated = 42, + ), + "com.mcsnowflake.worktimer" to + MetadataV2( + name = mapOf("en-US" to "WorkTimer"), + summary = + mapOf( + "fr" to + "WorkTimer est un simple minuteur qui vous aide à structurer votre temps de trava", + "ru" to "Таймер продуктивности для техники управления временем по «методу помидора».", + "de" to + "WorkTimer ist ein einfacher Timer, der Ihnen hilft, Ihre Arbeitszeit zu struktur", + "en" to + "WorkTimer is a simple timer that helps you to structure your work time and to st", + "es" to + "WorkTimer es un temporizador simple que te ayuda a estructurar tu tiempo de trab", + ), + icon = + mapOf( + "en-US" to + FileV2( + name = + "/com.mcsnowflake.worktimer/en-US/icon_2ulxYoOyPvurF6rw-fHZdyx3Ys-_1ohNUVVvyih_wEM=.png" + ) + ), + added = 23, + lastUpdated = 42, + ), + "de.wger.flutter" to + MetadataV2( + name = mapOf("en-US" to "wger Workout Manager"), + summary = + mapOf( + "en-US" to "Fitness/workout, nutrition and weight tracker", + "ar" to "متتبع التمارين الرياضية، التغذية، ومراقبة الوزن", + "ca" to "Registre de la forma física, entrenament, nutrició i pes corporal", + "cs-CZ" to "Sledování fitness/tréninků, výživy a hmotnosti", + "de-DE" to "Fitness-, Ernährungs- und Gewichtstracker", + "el-GR" to "Καταγραφή φυσικής κατάστασης/προπόνησης, διατροφής και βάρους", + "es-ES" to "Monitor de entrenamiento, peso y nutrición", + "fa-IR" to "شمارنده تناسب اندام/ورزش، تغذیه و وزن", + "fr-FR" to "Fitness/entraînement, nutrition et traqueur de poids", + "hi-IN" to "फिटनेस/वर्कआउट, नुट्रिशन और वज़न ट्रैकर", + "hr" to "Praćenje fitnesa/treninga, prehrane i težine", + "it-IT" to "Monitoraggio fitness/workout, dieta e peso", + "iw-IL" to "מעקב אחר כושר גופני, תזונה ומשקל", + "ko-KR" to "피트니스/운동, 영양소, 몸무게 추적기, 영양소, 몸무게 추적기", + "nb-NO" to "Fitness/treningsøkt, ernæring og vektlogging", + "nl-NL" to "Fitness/workout, voeding- en gewichts tracker", + "pl-PL" to "Monitorowanie kondycji/treningu, odżywiania i wagi", + "pt-BR" to "Fitness/treino, nutrição e controle de peso", + "pt-PT" to "Gestor de treinos, nutrição e peso", + "ru-RU" to "Трекер фитнеса/тренировок, питания и веса", + "sr" to "Фитнес/тренинг, исхрана и праћење тежине", + "ta-IN" to "உடற்தகுதி/உடற்பயிற்சி, ஊட்டச்சத்து மற்றும் எடை கண்காணிப்பு", + "tr-TR" to "Fitness/egzersiz, beslenme ve kilo takibi", + "uk" to "Фітнес/тренування, харчування та відстеження ваги", + "zh-CN" to "健身/锻炼、营养和体重追踪器", + "zh-TW" to "健身、營養和體重紀錄器", + ), + icon = + mapOf( + "en-US" to + FileV2( + name = + "/de.wger.flutter/en-US/icon_yXwYQPVpjYOb_9wLe4BDR9YY9FCYY29RuuvMfGdIW68=.png", + sha256 = "c97c1840f5698d839bffdc0b7b804347d618f45098636f51baebcc7c67485baf", + size = 12181, + ) + ), + added = 23, + lastUpdated = 42, + ), + "es.ideotec.workouttime" to + MetadataV2( + name = mapOf("de-DE" to "Workout Time!"), + summary = + mapOf( + "de-DE" to "Eine App, um Trainings zu verwalten und durchzuführen", + "en-US" to "An app for managing and performing timed workouts", + "es-ES" to "App para gestionar y realizar entrenamientos cronometrados", + "fr-FR" to "Une application pour gérer et réaliser des entraînements chronométrés", + ), + icon = + mapOf( + "en-US" to + FileV2( + name = + "/es.ideotec.workouttime/en-US/icon_GmCBd-0I_HjZNdIMk10t7ceQ5yMtFnn_SrHYgnEsKvI=.png", + sha256 = "1a608177ed08fc78d935d20c935d2dedc790e7232d1679ff4ab1d882712c2af2", + size = 24900, + ) + ), + added = 23, + lastUpdated = 42, + ), + "me.ahmetcetinkaya.whph" to + MetadataV2( + name = mapOf("en-US" to "WHPH • Work Hard Play Hard"), + summary = + mapOf( + "cs-CZ" to "Aplikace pro správu úkolů, rozvoj návyků a optimalizaci vašeho času.", + "da-DK" to "Produktivitetsapp til opgavestyring, vaneudvikling og tidsoptimering.", + "de-DE" to + "Produktivitäts-App für Aufgabenmanagement, Gewohnheiten und Zeitoptimierung.", + "el-GR" to + "Εφαρμογή για διαχείριση εργασιών, ανάπτυξη συνηθειών και βελτιστοποίηση χρόνου.", + "en-GB" to + "A productivity app to manage tasks, develop new habits, and optimize your time.", + "en-US" to + "A productivity app to manage tasks, develop new habits, and optimize your time.", + "es-ES" to "App de productividad para gestionar tareas, hábitos y optimizar el tiempo.", + "fi-FI" to + "Tuottavuussovellus tehtävien hallintaan, tapoihin ja ajankäytön optimointiin.", + "fr-FR" to + "Une app de productivité pour gérer tâches, habitudes et optimiser votre temps.", + "it-IT" to + "App di produttività per gestire attività, abitudini e ottimizzare il tempo.", + "ja-JP" to "タスク管理、習慣形成、時間最適化のための包括的な生産性アプリ。", + "ko-KR" to "작업 관리, 습관 형성 및 시간 최적화를 위한 종합 생산성 앱.", + "nl-NL" to + "Productiviteitsapp voor taakbeheer, gewoonteontwikkeling en tijdoptimalisatie.", + "no-NO" to "Produktivitetsapp for oppgavestyring, vaneutvikling og tidsoptimalisering.", + "pl-PL" to "Aplikacja do zarządzania zadaniami, nawykami i optymalizacji czasu.", + "pt-PT" to "App de produtividade para gerir tarefas, criar hábitos e otimizar o tempo.", + "ro" to + "Aplicație pentru gestionarea sarcinilor, obiceiurilor și optimizarea timpului.", + "ru-RU" to "Приложение для управления задачами, привычками и оптимизации времени.", + "sl" to "Aplikacija za upravljanje nalog, razvoj navad in optimizacijo časa.", + "sv-SE" to "Produktivitetsapp för uppgiftshantering, vanor och tidsoptimering.", + "tr-TR" to + "Görev, alışkanlık geliştirme ve zaman optimizasyonu için verimlilik uygulaması.", + "uk" to "Додаток для управління завданнями, звичками та оптимізації вашого часу.", + "zh-CN" to "用于管理任务、培养习惯和优化时间的综合生产力应用。", + ), + icon = + mapOf( + "en-US" to + FileV2( + name = + "/me.ahmetcetinkaya.whph/en-US/icon_tpPTqqEGIdreAhCa15py36S-PiU0HDONw1S8SrfdG1s=.png" + ) + ), + added = 23, + lastUpdated = 42, + ), + "org.runnerup.free" to + MetadataV2( + name = mapOf("en-US" to "RunnerUp"), + summary = + mapOf( + "ar" to "تتبع نشاطاتك الرياضية باستخدام خدمة تحديد المواقع (GPS)", + "cs" to "Sledování sportovních aktivit pomocí GPS", + "de" to "Sportliche Aktivitäten mittels GPS aufzeichnen", + "en-US" to + "RunnerUp - an open source GPS tracker with advanced workout and audio cues.", + "es" to "Realiza un seguimiento de tus actividades deportivas usando GPS", + "fr" to "Suivez vos activités sportives à l'aide du GPS", + "he" to "מעקב אחר הפעילות הספורטיבית באמצעות GPS", + "it" to "Traccia le tue attività sportive con il GPS", + "ja" to "GPSを使用してあなたのスポーツ活動を追跡", + "pl" to "Śledzenie aktywności sportowej za pomocą GPS", + "pt" to "Rastreie as suas atividades desportivas usando GPS", + "pt-BR" to "Rastreie as suas atividades esportivas usando o GPS", + "ro" to "Urmăriți-vă activitățile sportive cu ajutorul GPS", + "ru" to "Отслеживайте свои занятия спортом с помощью GPS", + "tr" to "GPS kullanarak spor etkinliklerinizi izleyin", + "uk" to "Відстежуйте свої спортивні заняття за допомогою GPS", + "zh-CN" to "使用 GPS 跟踪您的体育活动", + ), + icon = + mapOf( + "en-US" to + FileV2( + name = + "/org.runnerup.free/en-US/icon_kN3i52l3-KVxE-yMinNc6g8JQTsMQeRFjWA2fW3M1uE=.png" + ) + ), + added = 23, + lastUpdated = 42, + ), + ) diff --git a/app/src/androidTest/java/org/fdroid/ui/screenshots/SearchScreenshotTest.kt b/app/src/androidTest/java/org/fdroid/ui/screenshots/SearchScreenshotTest.kt new file mode 100644 index 000000000..efba3c953 --- /dev/null +++ b/app/src/androidTest/java/org/fdroid/ui/screenshots/SearchScreenshotTest.kt @@ -0,0 +1,55 @@ +package org.fdroid.ui.screenshots + +import androidx.compose.foundation.text.input.rememberTextFieldState +import androidx.core.os.LocaleListCompat +import org.fdroid.LocaleChooser.getBestLocale +import org.fdroid.ui.lists.AppListItem +import org.fdroid.ui.navigation.NavigationKey +import org.fdroid.ui.search.GlobalSearch +import org.fdroid.ui.search.SearchResults +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.Parameterized + +@RunWith(Parameterized::class) +class SearchScreenshotTest(localeName: String) : LocalizedScreenshotTest(localeName) { + + companion object { + @JvmStatic @Parameterized.Parameters(name = "{0}") fun locales() = locales + } + + @Test + fun search() = + screenshotTest("2_Search", currentNavKey = NavigationKey.Search, numUpdates = 0) { localeList -> + val categories = setOf("Network Analyzer", "Social Network", "Workout") + val results = + SearchResults( + categories = getCategoryItems(localeList).filter { it.id in categories }, + apps = getSearchResultItems(localeList), + ) + GlobalSearch( + textFieldState = rememberTextFieldState("work"), + searchResults = results, + savedSearches = emptyList(), + onSearch = {}, + onClearSavedSearches = {}, + onNav = {}, + onBack = {}, + onSearchCleared = {}, + ) + } +} + +private fun getSearchResultItems(localeList: LocaleListCompat) = + searchResultApps.map { (packageName, metadata) -> + AppListItem( + repoId = 1L, + packageName = packageName, + name = metadata.name?.getBestLocale(localeList) ?: "Unknown", + summary = metadata.summary?.getBestLocale(localeList) ?: "", + lastUpdated = metadata.lastUpdated, + isInstalled = packageName.startsWith("de"), + isCompatible = true, + iconModel = "https://f-droid.org/repo${metadata.icon.getBestLocale(localeList)?.name}", + ) + } diff --git a/app/src/full/kotlin/org/fdroid/ui/nearby/SwapSuccessAppRow.kt b/app/src/full/kotlin/org/fdroid/ui/nearby/SwapSuccessAppRow.kt index 52f663118..04637da92 100644 --- a/app/src/full/kotlin/org/fdroid/ui/nearby/SwapSuccessAppRow.kt +++ b/app/src/full/kotlin/org/fdroid/ui/nearby/SwapSuccessAppRow.kt @@ -24,8 +24,8 @@ import org.fdroid.R import org.fdroid.install.InstallState import org.fdroid.install.InstallStateWithInfo import org.fdroid.ui.FDroidContent -import org.fdroid.ui.apps.VersionLine import org.fdroid.ui.utils.AsyncShimmerImage +import org.fdroid.ui.utils.VersionLine @Composable fun SwapSuccessAppRow( diff --git a/app/src/full/kotlin/org/fdroid/ui/panic/PanicSettingsViewModel.kt b/app/src/full/kotlin/org/fdroid/ui/panic/PanicSettingsViewModel.kt index ec81d9537..5f004d9b1 100644 --- a/app/src/full/kotlin/org/fdroid/ui/panic/PanicSettingsViewModel.kt +++ b/app/src/full/kotlin/org/fdroid/ui/panic/PanicSettingsViewModel.kt @@ -7,6 +7,7 @@ import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.application import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import info.guardianproject.panic.Panic import info.guardianproject.panic.PanicResponder import javax.inject.Inject import kotlinx.coroutines.CoroutineScope @@ -59,7 +60,7 @@ constructor( PanicSettingsState( panicApps = apps, selectedPanicApp = - if (selected == null) { + if (selected == null || selected == Panic.PACKAGE_NAME_NONE) { null } else { getPanicApp(selected) @@ -75,18 +76,22 @@ constructor( } fun resetDb() { - val job = - ioScope.launch { - db.getRepositoryDao().clearAll() - repoPreLoader.addPreloadedRepositories(db) - } + val job = ioScope.launch { + db.getRepositoryDao().clearAll() + repoPreLoader.addPreloadedRepositories(db) + } // hard wait for data to be cleared runBlocking { job.join() } } private fun getPanicApp(packageName: String?): PanicApp? { if (packageName == null) return null - return pm.getPackageInfo(packageName, 0)?.applicationInfo?.toPanicApp() + return try { + pm.getPackageInfo(packageName, 0)?.applicationInfo?.toPanicApp() + } catch (e: Exception) { + log.error(e) { "Failed to get package info for $packageName" } + null + } } private fun ApplicationInfo.toPanicApp() = diff --git a/app/src/main/kotlin/org/fdroid/App.kt b/app/src/main/kotlin/org/fdroid/App.kt index e17f2512e..9a88da17a 100644 --- a/app/src/main/kotlin/org/fdroid/App.kt +++ b/app/src/main/kotlin/org/fdroid/App.kt @@ -19,8 +19,8 @@ import coil3.request.crossfade import coil3.util.DebugLogger import coil3.util.Logger import dagger.hilt.android.HiltAndroidApp -import org.acra.ACRA import javax.inject.Inject +import org.acra.ACRA import org.acra.ReportField import org.acra.config.dialog import org.acra.config.mailSender @@ -71,10 +71,12 @@ class App : Application(), Configuration.Provider, SingletonImageLoader.Factory ReportField.DISPLAY, ReportField.TOTAL_MEM_SIZE, ReportField.AVAILABLE_MEM_SIZE, + ReportField.LOGCAT, ReportField.CUSTOM_DATA, ReportField.STACK_TRACE_HASH, ReportField.STACK_TRACE, ) + logcatArguments = listOf("-t", "750") reportSendFailureToast = getString(R.string.crash_report_error) // either sending via email intent works, or it doesn't, but don't keep trying retryPolicyClass = NoRetryPolicy::class.java diff --git a/app/src/main/kotlin/org/fdroid/MainActivity.kt b/app/src/main/kotlin/org/fdroid/MainActivity.kt index a8d993b65..19e8a00f6 100644 --- a/app/src/main/kotlin/org/fdroid/MainActivity.kt +++ b/app/src/main/kotlin/org/fdroid/MainActivity.kt @@ -16,6 +16,7 @@ import javax.inject.Inject import kotlinx.coroutines.launch import org.fdroid.settings.SettingsManager import org.fdroid.ui.Main +import org.fdroid.ui.utils.launchSafe // Using [AppCompatActivity] and not [ComponentActivity] seems to be needed // for automatic theme changes when calling AppCompatDelegate.setDefaultNightMode() @@ -54,7 +55,7 @@ class MainActivity : AppCompatActivity() { SDK_INT >= 33 && ContextCompat.checkSelfPermission(this, POST_NOTIFICATIONS) != PERMISSION_GRANTED ) { - requestPermissionLauncher.launch(POST_NOTIFICATIONS) + requestPermissionLauncher.launchSafe(POST_NOTIFICATIONS) } } } diff --git a/app/src/main/kotlin/org/fdroid/install/SessionInstallManager.kt b/app/src/main/kotlin/org/fdroid/install/SessionInstallManager.kt index dfe3856ba..ea9b9edca 100644 --- a/app/src/main/kotlin/org/fdroid/install/SessionInstallManager.kt +++ b/app/src/main/kotlin/org/fdroid/install/SessionInstallManager.kt @@ -143,7 +143,14 @@ constructor( // so fire up intent here and now. if (canRequestUserConfirmationNow) { log.info { "Sending pre-approval intent for ${app.packageName}: $intent" } - pendingIntent.send() + try { + pendingIntent.send() + } catch (e: Exception) { + log.error(e) { "Error sending pre-approval intent: " } + val s = PreApprovalResult.UserConfirmationRequired(sessionId, pendingIntent) + cont.resume(s) + context.unregisterReceiver(this) + } } else { log.info { "Can not ask pre-approval for ${app.packageName}: $intent" } val s = PreApprovalResult.UserConfirmationRequired(sessionId, pendingIntent) @@ -340,7 +347,13 @@ constructor( } registerReceiver(context, receiver, IntentFilter(ACTION_INSTALL), RECEIVER_NOT_EXPORTED) cont.invokeOnCancellation { context.unregisterReceiver(receiver) } - state.intent.send() + try { + state.intent.send() + } catch (e: Exception) { + log.error(e) { "Error sending user confirmation intent: " } + context.unregisterReceiver(receiver) + cont.resume(InstallState.Error("${e::class.java.simpleName} ${e.message}", state)) + } } private fun getSessionParams(packageName: String, size: Long? = null): SessionParams { diff --git a/app/src/main/kotlin/org/fdroid/ui/search/SearchHelper.kt b/app/src/main/kotlin/org/fdroid/search/SearchHelper.kt similarity index 97% rename from app/src/main/kotlin/org/fdroid/ui/search/SearchHelper.kt rename to app/src/main/kotlin/org/fdroid/search/SearchHelper.kt index 18bd6db27..5471848cd 100644 --- a/app/src/main/kotlin/org/fdroid/ui/search/SearchHelper.kt +++ b/app/src/main/kotlin/org/fdroid/search/SearchHelper.kt @@ -1,4 +1,4 @@ -package org.fdroid.ui.search +package org.fdroid.search import java.text.Normalizer import java.text.Normalizer.Form.NFKD diff --git a/app/src/main/kotlin/org/fdroid/search/SearchHistoryManager.kt b/app/src/main/kotlin/org/fdroid/search/SearchHistoryManager.kt new file mode 100644 index 000000000..afe548b81 --- /dev/null +++ b/app/src/main/kotlin/org/fdroid/search/SearchHistoryManager.kt @@ -0,0 +1,86 @@ +package org.fdroid.search + +import android.content.Context +import android.content.Context.MODE_PRIVATE +import androidx.annotation.WorkerThread +import dagger.hilt.android.qualifiers.ApplicationContext +import java.io.FileNotFoundException +import javax.inject.Inject +import javax.inject.Singleton +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.decodeFromStream +import mu.KotlinLogging + +private const val HISTORY_FILE = "search_history.json" +private const val MAX_SEARCHES = 10 + +@Singleton +class SearchHistoryManager( + private val context: Context, + private val maxNumSearches: Int = MAX_SEARCHES, +) { + private val log = KotlinLogging.logger {} + + @Inject constructor(@ApplicationContext context: Context) : this(context, MAX_SEARCHES) + + @Synchronized + @WorkerThread + @OptIn(ExperimentalSerializationApi::class) + fun getSavedSearches(): List { + return try { + context.openFileInput(HISTORY_FILE).use { inputStream -> + Json.decodeFromStream>(inputStream).sortedByDescending { it.time } + } + } catch (e: Exception) { + if (e !is FileNotFoundException) { + log.error(e) { "Error getting saved searches: " } + clearAll() + } + emptyList() + } + } + + /** Saved the given [query] and returns the updated list of saved searches. */ + @Synchronized + @WorkerThread + fun saveSearchQuery(query: String): List { + log.info { "Saving search query \"$query\"" } + // get existing searches, remove any with the same query + val savedSearches = getSavedSearches().toMutableList() + savedSearches.removeAll { it.query == query } + // keep only the most recent maxNumSearches - 1 searches, so we can add the new one + val searchesToSave = + if (savedSearches.size > maxNumSearches - 1) { + savedSearches.subList(0, maxNumSearches - 1) + } else { + savedSearches + } + // add the new search with the current time + val savedSearch = SavedSearch(System.currentTimeMillis(), query) + searchesToSave.add(savedSearch) + // save searches to disk + try { + context.openFileOutput(HISTORY_FILE, MODE_PRIVATE).use { outputStream -> + outputStream.write(Json.encodeToString(searchesToSave).encodeToByteArray()) + } + } catch (e: Exception) { + log.error(e) { "Error saving $savedSearch: " } + } + return searchesToSave.sortedByDescending { it.time } + } + + @Synchronized + @WorkerThread + fun clearAll(): Boolean { + return try { + context.deleteFile(HISTORY_FILE) + } catch (e: Exception) { + log.error(e) { "Error deleting file: " } + false + } + } +} + +@Serializable data class SavedSearch(val time: Long, val query: String) diff --git a/app/src/main/kotlin/org/fdroid/ui/search/SearchManager.kt b/app/src/main/kotlin/org/fdroid/search/SearchManager.kt similarity index 71% rename from app/src/main/kotlin/org/fdroid/ui/search/SearchManager.kt rename to app/src/main/kotlin/org/fdroid/search/SearchManager.kt index c0786e080..2b60d747a 100644 --- a/app/src/main/kotlin/org/fdroid/ui/search/SearchManager.kt +++ b/app/src/main/kotlin/org/fdroid/search/SearchManager.kt @@ -1,7 +1,6 @@ -package org.fdroid.ui.search +package org.fdroid.search import android.database.sqlite.SQLiteException -import androidx.compose.foundation.text.input.TextFieldState import androidx.core.os.LocaleListCompat import androidx.lifecycle.asFlow import java.text.Collator @@ -10,15 +9,20 @@ import javax.inject.Inject import javax.inject.Singleton import kotlin.time.measureTimedValue import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map +import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import mu.KotlinLogging import org.fdroid.LocaleChooser.getBestLocale import org.fdroid.database.FDroidDatabase -import org.fdroid.database.SearchQueryRewriter.rewriteQuery +import org.fdroid.database.SearchQueryRewriter import org.fdroid.download.DownloadRequest import org.fdroid.download.PackageName import org.fdroid.download.getImageModel @@ -27,9 +31,13 @@ import org.fdroid.install.InstalledAppsCache import org.fdroid.settings.SettingsManager import org.fdroid.ui.categories.CategoryItem import org.fdroid.ui.lists.AppListItem -import org.fdroid.ui.search.SearchHelper.normalize +import org.fdroid.search.SearchHelper.normalize +import org.fdroid.ui.search.SearchResults import org.fdroid.utils.IoDispatcher +/** The minimum amount of characters we start auto-searching for. */ +const val SEARCH_THRESHOLD = 2 + @Singleton class SearchManager @Inject @@ -38,6 +46,7 @@ constructor( private val repoManager: RepoManager, private val settingsManager: SettingsManager, private val installedAppsCache: InstalledAppsCache, + private val searchHistoryManager: SearchHistoryManager, @param:IoDispatcher private val ioDispatcher: CoroutineDispatcher, ) { @@ -45,9 +54,7 @@ constructor( private val localeList = LocaleListCompat.getDefault() private val collator = Collator.getInstance(Locale.getDefault()) private val _searchResults = MutableStateFlow(null) - val textFieldState = TextFieldState() - val searchResults = _searchResults.asStateFlow() - + private val _savedSearches = MutableStateFlow?>(null) private val categories = db.getRepositoryDao().getLiveCategories().asFlow().map { categories -> categories @@ -56,14 +63,25 @@ constructor( } .sortedWith { c1, c2 -> collator.compare(c1.name, c2.name) } } + private var searchJob: SearchJob? = null - suspend fun search(term: String) = + val searchResults = _searchResults.asStateFlow() + val savedSearches = _savedSearches.asStateFlow() + + init { + // load saved searches on initialization + CoroutineScope(ioDispatcher).launch { + _savedSearches.value = searchHistoryManager.getSavedSearches() + } + } + + suspend fun search(term: String) { withContext(ioDispatcher) { // we need a way to make the app crash for testing, e.g. the crash reporter if (term == "CrashMe") error("BOOOOOOOOM!!!") val sanitized = term.replace(Regex.fromLiteral("\""), "") - val query = rewriteQuery(sanitized) + val query = SearchQueryRewriter.rewriteQuery(sanitized) log.info { "Searching for: $query" } val timedApps = measureTimedValue { try { @@ -108,8 +126,29 @@ constructor( "and took ${timedApps.duration} and ${timedCategories.duration}" } } + coroutineScope { + // cancel previous search job if it's still running, so we don't save search as you type + // incomplete queries + searchJob?.job?.cancel() + val job = + launch(ioDispatcher) { + // debounce, so we don't save every single search if the user is typing quickly + delay(1500) + _savedSearches.value = searchHistoryManager.saveSearchQuery(term) + } + searchJob = SearchJob(job, term) + } + } fun onSearchCleared() { _searchResults.value = null } + + suspend fun onClearSearchHistory() { + withContext(ioDispatcher) { + if (searchHistoryManager.clearAll()) _savedSearches.value = emptyList() + } + } } + +class SearchJob(val job: Job, val query: String) diff --git a/app/src/main/kotlin/org/fdroid/settings/SettingsConstants.kt b/app/src/main/kotlin/org/fdroid/settings/SettingsConstants.kt index 8eb181a7b..531b90735 100644 --- a/app/src/main/kotlin/org/fdroid/settings/SettingsConstants.kt +++ b/app/src/main/kotlin/org/fdroid/settings/SettingsConstants.kt @@ -17,9 +17,6 @@ object SettingsConstants { const val PREF_KEY_DYNAMIC_COLORS = "dynamicColors" const val PREF_DEFAULT_DYNAMIC_COLORS = false - const val PREF_KEY_SMALL_BOTTOM_BAR = "smallBottomBar" - const val PREF_DEFAULT_SMALL_BOTTOM_BAR = false - enum class AutoUpdateValues { OnlyWifi, Always, diff --git a/app/src/main/kotlin/org/fdroid/settings/SettingsManager.kt b/app/src/main/kotlin/org/fdroid/settings/SettingsManager.kt index dff3e549d..8aaa35e71 100644 --- a/app/src/main/kotlin/org/fdroid/settings/SettingsManager.kt +++ b/app/src/main/kotlin/org/fdroid/settings/SettingsManager.kt @@ -33,7 +33,6 @@ import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_PREVENT_SCREENSHOTS import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_PROXY import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_REPO_UPDATES import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_SHOW_INCOMPATIBLE -import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_SMALL_BOTTOM_BAR import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_THEME import org.fdroid.settings.SettingsConstants.PREF_DNS_CACHE import org.fdroid.settings.SettingsConstants.PREF_DNS_CACHE_DEFAULT @@ -50,7 +49,6 @@ import org.fdroid.settings.SettingsConstants.PREF_KEY_PREVENT_SCREENSHOTS import org.fdroid.settings.SettingsConstants.PREF_KEY_PROXY import org.fdroid.settings.SettingsConstants.PREF_KEY_REPO_UPDATES import org.fdroid.settings.SettingsConstants.PREF_KEY_SHOW_INCOMPATIBLE -import org.fdroid.settings.SettingsConstants.PREF_KEY_SMALL_BOTTOM_BAR import org.fdroid.settings.SettingsConstants.PREF_KEY_THEME import org.fdroid.settings.SettingsConstants.PREF_USE_DNS_CACHE import org.fdroid.settings.SettingsConstants.PREF_USE_DNS_CACHE_DEFAULT @@ -79,10 +77,6 @@ class SettingsManager @Inject constructor(@param:ApplicationContext private val prefsFlow .map { it.get(PREF_KEY_DYNAMIC_COLORS) ?: PREF_DEFAULT_DYNAMIC_COLORS } .distinctUntilChanged() - val smallBottomBarFlow: Flow = - prefsFlow - .map { it.get(PREF_KEY_SMALL_BOTTOM_BAR) ?: PREF_DEFAULT_SMALL_BOTTOM_BAR } - .distinctUntilChanged() val repoUpdates get() = prefs.getString(PREF_KEY_REPO_UPDATES, PREF_DEFAULT_REPO_UPDATES).toAutoUpdateValue() diff --git a/app/src/main/kotlin/org/fdroid/ui/Main.kt b/app/src/main/kotlin/org/fdroid/ui/Main.kt index a18e2804a..59f4e0c30 100644 --- a/app/src/main/kotlin/org/fdroid/ui/Main.kt +++ b/app/src/main/kotlin/org/fdroid/ui/Main.kt @@ -6,7 +6,6 @@ import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo import androidx.compose.material3.adaptive.layout.calculatePaneScaffoldDirective import androidx.compose.material3.adaptive.navigation3.ListDetailSceneStrategy -import androidx.compose.material3.adaptive.navigation3.rememberListDetailSceneStrategy import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.remember @@ -16,7 +15,6 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation3.runtime.NavEntry import androidx.navigation3.runtime.NavKey import androidx.navigation3.runtime.entryProvider -import androidx.navigation3.ui.NavDisplay import org.fdroid.ui.apps.myAppsEntry import org.fdroid.ui.details.NoAppSelected import org.fdroid.ui.details.appDetailsEntry @@ -59,7 +57,6 @@ fun Main(onListeningForIntent: () -> Unit = {}) { calculatePaneScaffoldDirective(windowAdaptiveInfo).copy(horizontalPartitionSpacerSize = 2.dp) } val isBigScreen = directive.maxHorizontalPartitions > 1 - val listDetailStrategy = rememberListDetailSceneStrategy(directive = directive) val entryProvider: (NavKey) -> NavEntry = entryProvider { discoverEntry(navigator) @@ -72,9 +69,10 @@ fun Main(onListeningForIntent: () -> Unit = {}) { ) { val viewModel = hiltViewModel() GlobalSearch( - textFieldState = viewModel.textFieldState, searchResults = viewModel.searchResults.collectAsStateWithLifecycle().value, + savedSearches = viewModel.savedSearchesFlow.collectAsStateWithLifecycle().value, onSearch = viewModel::search, + onClearSavedSearches = viewModel::onClearSearchHistory, onNav = { navKey -> navigator.navigate(navKey) }, onBack = { navigator.goBack() }, onSearchCleared = viewModel::onSearchCleared, @@ -84,7 +82,6 @@ fun Main(onListeningForIntent: () -> Unit = {}) { val viewModel = hiltViewModel() Settings( model = viewModel.model, - isBigScreen = isBigScreen, onSaveLogcat = { viewModel.onSaveLogcat(it) navigator.goBack() @@ -114,21 +111,15 @@ fun Main(onListeningForIntent: () -> Unit = {}) { // flavor specific navigation destinations go here extraNavigationEntries(navigator) } - val showBottomBar = !isBigScreen && navigator.last is MainNavKey val viewModel = hiltViewModel() - val mainModel = viewModel.mainModel.collectAsStateWithLifecycle().value MainContent( - model = mainModel, + model = viewModel.mainModel.collectAsStateWithLifecycle().value, + navEntries = navigationState.toEntries(entryProvider), + directive = directive, isBigScreen = isBigScreen, - showBottomBar = showBottomBar, + showBottomBar = !isBigScreen && navigator.last is MainNavKey, currentNavKey = navigationState.topLevelRoute, - onNav = { navKey -> navigator.navigate(navKey) }, - ) { modifier -> - NavDisplay( - entries = navigationState.toEntries(entryProvider), - sceneStrategy = listDetailStrategy, - onBack = { navigator.goBack() }, - modifier = modifier, - ) - } + onNav = navigator::navigate, + onBack = navigator::goBack, + ) } diff --git a/app/src/main/kotlin/org/fdroid/ui/MainContent.kt b/app/src/main/kotlin/org/fdroid/ui/MainContent.kt index ee52b65c8..b56b3ed31 100644 --- a/app/src/main/kotlin/org/fdroid/ui/MainContent.kt +++ b/app/src/main/kotlin/org/fdroid/ui/MainContent.kt @@ -1,68 +1,61 @@ package org.fdroid.ui -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.consumeWindowInsets -import androidx.compose.foundation.layout.navigationBars -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Scaffold +import androidx.compose.animation.SharedTransitionLayout +import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi +import androidx.compose.material3.adaptive.layout.PaneScaffoldDirective +import androidx.compose.material3.adaptive.navigation3.rememberListDetailSceneStrategy import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.unit.dp +import androidx.navigation3.runtime.NavEntry import androidx.navigation3.runtime.NavKey +import androidx.navigation3.ui.NavDisplay import com.viktormykhailiv.compose.hints.HintHost import org.fdroid.ui.navigation.BottomBar import org.fdroid.ui.navigation.MainNavKey import org.fdroid.ui.navigation.NavigationRail +import org.fdroid.ui.navigation.rememberResponsiveNavigationSceneDecoratorStrategy @Composable +@OptIn(ExperimentalMaterial3AdaptiveApi::class) fun MainContent( model: MainModel, + navEntries: List>, + directive: PaneScaffoldDirective, isBigScreen: Boolean, showBottomBar: Boolean, currentNavKey: NavKey, onNav: (MainNavKey) -> Unit, - content: @Composable (Modifier) -> Unit, + onBack: () -> Unit, ) = FDroidContent(dynamicColors = model.dynamicColors) { - HintHost { - Scaffold( - bottomBar = - if (showBottomBar) { - { BottomBar(model = model, currentNavKey = currentNavKey, onNav = onNav) } - } else { - {} - } - ) { paddingValues -> - Row { - // show nav rail only on big screen (at least two partitions) - if (isBigScreen) - NavigationRail( - numUpdates = model.numUpdates, - hasIssues = model.hasAppIssues, - currentNavKey = currentNavKey, - onNav = onNav, - ) - val modifier = - if (isBigScreen) { - // need to consume start insets or some phones leave a lot of space there - Modifier.consumeWindowInsets(PaddingValues(start = 64.dp)) - } else if (showBottomBar) { - // we only apply the bottom padding here, so content stays above bottom bar, - // but we need to consume the navigation bar height manually - val bottom = - with(LocalDensity.current) { WindowInsets.navigationBars.getBottom(this).toDp() } - Modifier.consumeWindowInsets(PaddingValues(bottom = bottom)) - .padding(bottom = paddingValues.calculateBottomPadding()) - } else { - Modifier - } - // this needs to a have a fixed place or state saving breaks, - // so all moving pieces with conditionals are above - content(modifier) - } + val listDetailStrategy = rememberListDetailSceneStrategy(directive = directive) + SharedTransitionLayout { + HintHost { + val responsiveNavigationSceneDecoratorStrategy = + rememberResponsiveNavigationSceneDecoratorStrategy( + isBigScreen = isBigScreen, + navBar = { + if (showBottomBar) { + BottomBar(model = model, currentNavKey = currentNavKey, onNav = onNav) + } + }, + navRail = { + NavigationRail( + numUpdates = model.numUpdates, + hasIssues = model.hasAppIssues, + currentNavKey = currentNavKey, + onNav = onNav, + ) + }, + sharedTransitionScope = this, + ) + NavDisplay( + entries = navEntries, + sceneDecoratorStrategies = listOf(responsiveNavigationSceneDecoratorStrategy), + sceneStrategies = listOf(listDetailStrategy), + onBack = onBack, + modifier = Modifier, + ) } } } diff --git a/app/src/main/kotlin/org/fdroid/ui/MainPresenter.kt b/app/src/main/kotlin/org/fdroid/ui/MainPresenter.kt index 086624c55..8d6037763 100644 --- a/app/src/main/kotlin/org/fdroid/ui/MainPresenter.kt +++ b/app/src/main/kotlin/org/fdroid/ui/MainPresenter.kt @@ -5,12 +5,10 @@ import androidx.compose.runtime.collectAsState import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_DYNAMIC_COLORS -import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_SMALL_BOTTOM_BAR import org.fdroid.ui.apps.AppWithIssueItem data class MainModel( val dynamicColors: Boolean, - val smallBottomBar: Boolean, val numUpdates: Int, val hasAppIssues: Boolean, ) @@ -18,14 +16,11 @@ data class MainModel( @Composable fun MainPresenter( dynamicColorsFlow: Flow, - smallBottomBarFlow: Flow, numUpdatesFlow: StateFlow, appsWithIssuesFlow: StateFlow?>, ): MainModel { return MainModel( dynamicColors = dynamicColorsFlow.collectAsState(initial = PREF_DEFAULT_DYNAMIC_COLORS).value, - smallBottomBar = - smallBottomBarFlow.collectAsState(initial = PREF_DEFAULT_SMALL_BOTTOM_BAR).value, numUpdates = numUpdatesFlow.collectAsState().value, hasAppIssues = !appsWithIssuesFlow.collectAsState().value.isNullOrEmpty(), ) diff --git a/app/src/main/kotlin/org/fdroid/ui/MainViewModel.kt b/app/src/main/kotlin/org/fdroid/ui/MainViewModel.kt index a8ffc800f..874c05797 100644 --- a/app/src/main/kotlin/org/fdroid/ui/MainViewModel.kt +++ b/app/src/main/kotlin/org/fdroid/ui/MainViewModel.kt @@ -37,7 +37,6 @@ constructor( moleculeScope.launchMolecule(mode = ContextClock) { MainPresenter( dynamicColorsFlow = settingsManager.dynamicColorFlow, - smallBottomBarFlow = settingsManager.smallBottomBarFlow, numUpdatesFlow = updatesManager.numUpdates, appsWithIssuesFlow = updatesManager.appsWithIssues, ) diff --git a/app/src/main/kotlin/org/fdroid/ui/apps/InstallingAppRow.kt b/app/src/main/kotlin/org/fdroid/ui/apps/InstallingAppRow.kt index 12cbf1edd..9e73d2a91 100644 --- a/app/src/main/kotlin/org/fdroid/ui/apps/InstallingAppRow.kt +++ b/app/src/main/kotlin/org/fdroid/ui/apps/InstallingAppRow.kt @@ -23,6 +23,7 @@ import org.fdroid.R import org.fdroid.install.InstallState import org.fdroid.ui.FDroidContent import org.fdroid.ui.utils.AsyncShimmerImage +import org.fdroid.ui.utils.VersionLine @Composable fun InstallingAppRow(app: InstallingAppItem, isSelected: Boolean, modifier: Modifier = Modifier) { diff --git a/app/src/main/kotlin/org/fdroid/ui/apps/MyAppsPresenter.kt b/app/src/main/kotlin/org/fdroid/ui/apps/MyAppsPresenter.kt index 6ec70be5a..0ccc3cc73 100644 --- a/app/src/main/kotlin/org/fdroid/ui/apps/MyAppsPresenter.kt +++ b/app/src/main/kotlin/org/fdroid/ui/apps/MyAppsPresenter.kt @@ -11,8 +11,8 @@ import org.fdroid.download.NetworkState import org.fdroid.install.InstallConfirmationState import org.fdroid.install.InstallState import org.fdroid.install.InstallStateWithInfo -import org.fdroid.ui.search.SearchHelper.fixQuery -import org.fdroid.ui.search.SearchHelper.normalize +import org.fdroid.search.SearchHelper.fixQuery +import org.fdroid.search.SearchHelper.normalize // TODO add tests for this, similar to DetailsPresenter @Composable diff --git a/app/src/main/kotlin/org/fdroid/ui/apps/UpdatableAppRow.kt b/app/src/main/kotlin/org/fdroid/ui/apps/UpdatableAppRow.kt index 5a91bfae0..39815d8e6 100644 --- a/app/src/main/kotlin/org/fdroid/ui/apps/UpdatableAppRow.kt +++ b/app/src/main/kotlin/org/fdroid/ui/apps/UpdatableAppRow.kt @@ -1,19 +1,14 @@ package org.fdroid.ui.apps -import android.text.format.Formatter import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.text.InlineTextContent -import androidx.compose.foundation.text.appendInlineContent import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.filled.ArrowRightAlt import androidx.compose.material.icons.filled.NewReleases import androidx.compose.material3.BadgedBox import androidx.compose.material3.Card -import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.ListItem import androidx.compose.material3.ListItemDefaults @@ -26,26 +21,20 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.LiveRegionMode import androidx.compose.ui.semantics.hideFromAccessibility import androidx.compose.ui.semantics.liveRegion import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.text.Placeholder -import androidx.compose.ui.text.PlaceholderVerticalAlign -import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import org.fdroid.R import org.fdroid.ui.FDroidContent import org.fdroid.ui.utils.AsyncShimmerImage import org.fdroid.ui.utils.BadgeIcon import org.fdroid.ui.utils.ExpandIconArrow +import org.fdroid.ui.utils.VersionLine import org.fdroid.ui.utils.getPreviewVersion @Composable @@ -103,61 +92,6 @@ fun UpdatableAppRow(app: AppUpdateItem, isSelected: Boolean, modifier: Modifier } } -/** - * Shows which is the installed version of the app and to which version it will upgrade. Takes into - * account the layout direction to show the correct order of versions and the arrow. - */ -@Composable -fun VersionLine(app: AppUpdateItem) { - VersionLineWithSize(app.installedVersionName, app.update.versionName, app.update.size) -} - -@Composable -fun VersionLineWithSize(fromVersion: String?, toVersion: String, numBytes: Long? = null) { - val size = numBytes?.let { Formatter.formatFileSize(LocalContext.current, it) } - VersionLine(fromVersion, toVersion, size) -} - -@Composable -fun VersionLine(fromVersion: String?, toVersion: String, extraText: String? = null) { - val test = buildAnnotatedString { - if (LocalLayoutDirection.current == LayoutDirection.Ltr) { - if (fromVersion != null) { - append(fromVersion) - } - } else { - append("\u202A${toVersion}\u202C") - } - if (fromVersion != null) appendInlineContent("arrowId", " → ") - if (LocalLayoutDirection.current == LayoutDirection.Ltr) { - append("\u202A${toVersion}\u202C") - } else if (fromVersion != null) { - append("\u202A${fromVersion}\u202C") - } - if (extraText != null) append(" • $extraText") - } - val inlineContent = - mapOf( - Pair( - "arrowId", - InlineTextContent( - Placeholder( - width = 24.sp, - height = 20.sp, - placeholderVerticalAlign = PlaceholderVerticalAlign.TextCenter, - ) - ) { - Icon( - Icons.AutoMirrored.Default.ArrowRightAlt, - contentDescription = null, - modifier = Modifier.padding(horizontal = 2.dp), - ) - }, - ) - ) - Text(test, inlineContent = if (fromVersion == null) mapOf() else inlineContent) -} - @Preview @Composable fun UpdatableAppRowPreview() { diff --git a/app/src/main/kotlin/org/fdroid/ui/crash/Crash.kt b/app/src/main/kotlin/org/fdroid/ui/crash/Crash.kt index 7f5ecda82..51b64e8a6 100644 --- a/app/src/main/kotlin/org/fdroid/ui/crash/Crash.kt +++ b/app/src/main/kotlin/org/fdroid/ui/crash/Crash.kt @@ -1,6 +1,8 @@ package org.fdroid.ui.crash import android.net.Uri +import android.widget.Toast +import android.widget.Toast.LENGTH_SHORT import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts.CreateDocument import androidx.compose.foundation.layout.padding @@ -24,6 +26,7 @@ import kotlinx.coroutines.launch import org.fdroid.R import org.fdroid.ui.FDroidContent import org.fdroid.ui.utils.TopAppBarButton +import org.fdroid.ui.utils.launchSafe import org.fdroid.utils.getLogName @Composable @@ -56,7 +59,11 @@ fun Crash( TopAppBarButton( imageVector = Icons.Default.Save, contentDescription = stringResource(R.string.crash_report_save), - onClick = { launcher.launch("${getLogName(context)}.json") }, + onClick = { + if (!launcher.launchSafe("${getLogName(context)}.json")) { + Toast.makeText(context, R.string.no_handler_app_generic, LENGTH_SHORT).show() + } + }, ) }, ) diff --git a/app/src/main/kotlin/org/fdroid/ui/crash/ShortHashCollector.kt b/app/src/main/kotlin/org/fdroid/ui/crash/ShortHashCollector.kt new file mode 100644 index 000000000..9105c197f --- /dev/null +++ b/app/src/main/kotlin/org/fdroid/ui/crash/ShortHashCollector.kt @@ -0,0 +1,45 @@ +package org.fdroid.ui.crash + +import android.content.Context +import kotlin.math.min +import org.acra.ReportField +import org.acra.builder.ReportBuilder +import org.acra.collector.BaseReportFieldCollector +import org.acra.config.CoreConfiguration +import org.acra.data.CrashReportData + +class ShortHashCollector : BaseReportFieldCollector(ReportField.CUSTOM_DATA) { + + override fun collect( + reportField: ReportField, + context: Context, + config: CoreConfiguration, + reportBuilder: ReportBuilder, + target: CrashReportData, + ) { + val hash = getStackTraceHash(reportBuilder.exception) + if (hash != null) { + target.put("STACK_TRACE_SHORT_HASH", hash) + } + } + + private fun getStackTraceHash(th: Throwable?): String? { + if (th == null) return null + val res = StringBuilder() + var cause = th + while (cause != null) { + // we only consider the first 3 stack trace elements of each cause, + // because we found the bottom often includes irrelevant changes + val numElements = min(3, cause.stackTrace.size) + val stackTraceElements = cause.stackTrace.toMutableList().subList(0, numElements) + stackTraceElements.forEachIndexed { i, e -> + res.append(e.className) + res.append(e.methodName) + // first element also includes line number to differentiate between crashes in same method + if (i == 0) res.append(e.lineNumber) + } + cause = cause.cause + } + return Integer.toHexString(res.toString().hashCode()) + } +} diff --git a/app/src/main/kotlin/org/fdroid/ui/details/AppDetailsHeader.kt b/app/src/main/kotlin/org/fdroid/ui/details/AppDetailsHeader.kt index 5e119b1b2..86276dc3d 100644 --- a/app/src/main/kotlin/org/fdroid/ui/details/AppDetailsHeader.kt +++ b/app/src/main/kotlin/org/fdroid/ui/details/AppDetailsHeader.kt @@ -230,7 +230,7 @@ fun AppDetailsHeader( Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = SpaceBetween) { val secondsPassed = ((now - state.startMillis) / 1000f).takeIf { it > 0 } ?: 1f val averageSpeed = (state.downloadedBytes / secondsPassed).roundToLong() - val speedStr = Formatter.formatFileSize(context, averageSpeed) + "/s" + val speedStr = Formatter.formatFileSize(context, averageSpeed) val remainingStr = Formatter.formatFileSize(context, state.totalBytes - state.downloadedBytes) Text( diff --git a/app/src/main/kotlin/org/fdroid/ui/details/AppDetailsItem.kt b/app/src/main/kotlin/org/fdroid/ui/details/AppDetailsItem.kt index e8465073d..53bcfb4a0 100644 --- a/app/src/main/kotlin/org/fdroid/ui/details/AppDetailsItem.kt +++ b/app/src/main/kotlin/org/fdroid/ui/details/AppDetailsItem.kt @@ -22,7 +22,7 @@ import org.fdroid.index.v2.PackageVersion import org.fdroid.install.InstallState import org.fdroid.install.SessionInstallManager import org.fdroid.ui.categories.CategoryItem -import org.fdroid.ui.search.SearchHelper.removeZeroWhiteSpace +import org.fdroid.search.SearchHelper.removeZeroWhiteSpace data class AppDetailsItem( val app: AppMetadata, diff --git a/app/src/main/kotlin/org/fdroid/ui/details/AppDetailsMenu.kt b/app/src/main/kotlin/org/fdroid/ui/details/AppDetailsMenu.kt index 02a22a4c6..9a17b7337 100644 --- a/app/src/main/kotlin/org/fdroid/ui/details/AppDetailsMenu.kt +++ b/app/src/main/kotlin/org/fdroid/ui/details/AppDetailsMenu.kt @@ -22,6 +22,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import org.fdroid.R import org.fdroid.ui.FDroidContent +import org.fdroid.ui.utils.launchSafe import org.fdroid.ui.utils.startActivitySafe import org.fdroid.ui.utils.testApp @@ -93,7 +94,7 @@ fun AppDetailsMenu( leadingIcon = { Icon(Icons.Default.Delete, null) }, text = { Text(stringResource(R.string.menu_uninstall)) }, onClick = { - uninstallLauncher.launch(item.actions.uninstallIntent) + uninstallLauncher.launchSafe(item.actions.uninstallIntent) onDismiss() }, ) diff --git a/app/src/main/kotlin/org/fdroid/ui/discover/DiscoverContent.kt b/app/src/main/kotlin/org/fdroid/ui/discover/DiscoverContent.kt index 47864e821..70f491a94 100644 --- a/app/src/main/kotlin/org/fdroid/ui/discover/DiscoverContent.kt +++ b/app/src/main/kotlin/org/fdroid/ui/discover/DiscoverContent.kt @@ -1,21 +1,16 @@ package org.fdroid.ui.discover import androidx.compose.animation.AnimatedVisibility -import androidx.compose.foundation.focusable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.dp import androidx.navigation3.runtime.NavKey import org.fdroid.R import org.fdroid.ui.categories.CategoryList import org.fdroid.ui.lists.AppListType -import org.fdroid.ui.search.AppsSearch @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -27,17 +22,6 @@ fun DiscoverContent( modifier: Modifier = Modifier, ) { Column(modifier = modifier) { - AppsSearch( - onNav = onNav, - textFieldState = discoverModel.searchTextFieldState, - modifier = - Modifier - // focusable is a workaround for https://issuetracker.google.com/issues/445720462 - .focusable() - .padding(top = 16.dp, bottom = 4.dp) - .padding(horizontal = 16.dp) - .align(Alignment.CenterHorizontally), - ) AnimatedVisibility(discoverModel.newApps.isNotEmpty()) { val listNew = AppListType.New(stringResource(R.string.app_list_new)) AppCarousel( diff --git a/app/src/main/kotlin/org/fdroid/ui/discover/DiscoverModel.kt b/app/src/main/kotlin/org/fdroid/ui/discover/DiscoverModel.kt index 52284cdd0..141ef8b15 100644 --- a/app/src/main/kotlin/org/fdroid/ui/discover/DiscoverModel.kt +++ b/app/src/main/kotlin/org/fdroid/ui/discover/DiscoverModel.kt @@ -1,6 +1,5 @@ package org.fdroid.ui.discover -import androidx.compose.foundation.text.input.TextFieldState import org.fdroid.download.NetworkState import org.fdroid.repo.RepoUpdateState import org.fdroid.ui.categories.CategoryGroup @@ -22,6 +21,5 @@ data class LoadedDiscoverModel( val recentlyUpdatedApps: List, val mostDownloadedApps: List?, val categories: Map>?, - val searchTextFieldState: TextFieldState, val hasRepoIssues: Boolean, ) : DiscoverModel() diff --git a/app/src/main/kotlin/org/fdroid/ui/discover/DiscoverPresenter.kt b/app/src/main/kotlin/org/fdroid/ui/discover/DiscoverPresenter.kt index c6bb2e86a..68a1c0f63 100644 --- a/app/src/main/kotlin/org/fdroid/ui/discover/DiscoverPresenter.kt +++ b/app/src/main/kotlin/org/fdroid/ui/discover/DiscoverPresenter.kt @@ -1,7 +1,6 @@ package org.fdroid.ui.discover import android.content.pm.PackageInfo -import androidx.compose.foundation.text.input.TextFieldState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.core.os.LocaleListCompat @@ -26,7 +25,6 @@ fun DiscoverPresenter( mostDownloadedAppsFlow: Flow>, categoriesFlow: Flow>, installedAppsFlow: StateFlow>, - searchTextFieldState: TextFieldState, isFirstStart: Boolean, networkState: NetworkState, repoUpdateStateFlow: StateFlow, @@ -42,7 +40,7 @@ fun DiscoverPresenter( proxyConfig: ProxyConfig?, ): AppDiscoverItem { val isInstalled = installedApps.contains(packageName) - val imageModel = getIcon(localeList)?.getImageModel(repository, proxyConfig) as? DownloadRequest + val imageModel = getIcon(localeList)?.getImageModel(repository, proxyConfig) return AppDiscoverItem( packageName = packageName, name = getName(localeList) ?: "Unknown App", @@ -50,7 +48,7 @@ fun DiscoverPresenter( isInstalled = isInstalled, imageModel = if (isInstalled) { - PackageName(packageName, imageModel) + PackageName(packageName, imageModel as? DownloadRequest) } else { imageModel }, @@ -91,7 +89,6 @@ fun DiscoverPresenter( recentlyUpdatedApps = recentlyUpdatedApps ?: emptyList(), mostDownloadedApps = mostDownloadedApps, categories = categories?.groupBy { it.group }, - searchTextFieldState = searchTextFieldState, hasRepoIssues = hasRepoIssuesFlow.collectAsState(false).value, ) } else { diff --git a/app/src/main/kotlin/org/fdroid/ui/discover/DiscoverViewModel.kt b/app/src/main/kotlin/org/fdroid/ui/discover/DiscoverViewModel.kt index 22b7e58e3..bb66e6baf 100644 --- a/app/src/main/kotlin/org/fdroid/ui/discover/DiscoverViewModel.kt +++ b/app/src/main/kotlin/org/fdroid/ui/discover/DiscoverViewModel.kt @@ -31,7 +31,6 @@ import org.fdroid.install.InstalledAppsCache import org.fdroid.repo.RepoUpdateManager import org.fdroid.settings.SettingsManager import org.fdroid.ui.categories.CategoryItem -import org.fdroid.ui.search.SearchManager @HiltViewModel class DiscoverViewModel @@ -42,7 +41,6 @@ constructor( private val db: FDroidDatabase, networkMonitor: NetworkMonitor, private val settingsManager: SettingsManager, - private val searchManager: SearchManager, private val repoManager: RepoManager, private val repoUpdateManager: RepoUpdateManager, private val installedAppsCache: InstalledAppsCache, @@ -94,7 +92,6 @@ constructor( mostDownloadedAppsFlow = mostDownloadedApps, categoriesFlow = categories, installedAppsFlow = installedAppsCache.installedApps, - searchTextFieldState = searchManager.textFieldState, isFirstStart = settingsManager.isFirstStart, // not observing the flow, but just taking the current value, // because we kick off repo updates from the UI depending on this state diff --git a/app/src/main/kotlin/org/fdroid/ui/history/HistoryList.kt b/app/src/main/kotlin/org/fdroid/ui/history/HistoryList.kt index ed00cc2a4..c02ca9581 100644 --- a/app/src/main/kotlin/org/fdroid/ui/history/HistoryList.kt +++ b/app/src/main/kotlin/org/fdroid/ui/history/HistoryList.kt @@ -33,9 +33,9 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import org.fdroid.R import org.fdroid.history.InstallEvent -import org.fdroid.ui.apps.VersionLine import org.fdroid.ui.utils.AsyncShimmerImage import org.fdroid.ui.utils.BadgeIcon +import org.fdroid.ui.utils.VersionLine import org.fdroid.ui.utils.asRelativeTimeString @Composable @@ -55,7 +55,11 @@ fun HistoryList( modifier = Modifier.padding(16.dp).fillMaxWidth().clickable { onEnabled(!enabled) }, ) { Row(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.padding(16.dp)) { - Text(text = "Use install history", fontSize = 19.sp, modifier = Modifier.weight(1f)) + Text( + text = stringResource(R.string.install_history_switch), + fontSize = 19.sp, + modifier = Modifier.weight(1f), + ) Switch(enabled, onCheckedChange = onEnabled) } } diff --git a/app/src/main/kotlin/org/fdroid/ui/lists/AppListPresenter.kt b/app/src/main/kotlin/org/fdroid/ui/lists/AppListPresenter.kt index 8a0b17738..8b4545bf1 100644 --- a/app/src/main/kotlin/org/fdroid/ui/lists/AppListPresenter.kt +++ b/app/src/main/kotlin/org/fdroid/ui/lists/AppListPresenter.kt @@ -8,10 +8,10 @@ import java.util.Locale import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow import org.fdroid.database.AppListSortOrder +import org.fdroid.search.SearchHelper.fixQuery +import org.fdroid.search.SearchHelper.normalize import org.fdroid.ui.categories.CategoryItem import org.fdroid.ui.repositories.RepositoryItem -import org.fdroid.ui.search.SearchHelper.fixQuery -import org.fdroid.ui.search.SearchHelper.normalize @Composable fun AppListPresenter( diff --git a/app/src/main/kotlin/org/fdroid/ui/navigation/BottomBar.kt b/app/src/main/kotlin/org/fdroid/ui/navigation/BottomBar.kt index 0c6937a08..ea5314991 100644 --- a/app/src/main/kotlin/org/fdroid/ui/navigation/BottomBar.kt +++ b/app/src/main/kotlin/org/fdroid/ui/navigation/BottomBar.kt @@ -3,9 +3,6 @@ package org.fdroid.ui.navigation import androidx.compose.foundation.layout.Arrangement.spacedBy import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.heightIn -import androidx.compose.foundation.layout.navigationBars import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Error import androidx.compose.material3.Badge @@ -22,7 +19,6 @@ import androidx.compose.material3.Text import androidx.compose.material3.contentColorFor import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalResources import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.semantics @@ -37,19 +33,11 @@ import org.fdroid.ui.MainModel @Composable fun BottomBar(model: MainModel, currentNavKey: NavKey, onNav: (MainNavKey) -> Unit) { val res = LocalResources.current - val bottom = with(LocalDensity.current) { WindowInsets.navigationBars.getBottom(this).toDp() } - NavigationBar( - modifier = if (model.smallBottomBar) Modifier.heightIn(max = 56.dp + bottom) else Modifier - ) { + NavigationBar { topLevelRoutes.forEach { dest -> NavigationBarItem( icon = { NavIcon(dest, model.numUpdates, model.hasAppIssues) }, - label = - if (model.smallBottomBar) { - null - } else { - { Text(stringResource(dest.label)) } - }, + label ={ Text(stringResource(dest.label)) }, selected = dest == currentNavKey, colors = NavigationBarItemDefaults.colors( @@ -148,16 +136,10 @@ private fun Preview() { val model = MainModel( dynamicColors = false, - smallBottomBar = false, numUpdates = 3, hasAppIssues = false, ) BottomBar(model = model, currentNavKey = NavigationKey.Discover, onNav = {}) - BottomBar( - model = model.copy(smallBottomBar = true), - currentNavKey = NavigationKey.Discover, - onNav = {}, - ) } } } @@ -178,16 +160,10 @@ private fun PreviewIssues() { val model = MainModel( dynamicColors = true, - smallBottomBar = false, numUpdates = 0, hasAppIssues = true, ) BottomBar(model = model, currentNavKey = NavigationKey.MyApps, onNav = {}) - BottomBar( - model = model.copy(smallBottomBar = true), - currentNavKey = NavigationKey.MyApps, - onNav = {}, - ) } } } diff --git a/app/src/main/kotlin/org/fdroid/ui/navigation/NavigationKey.kt b/app/src/main/kotlin/org/fdroid/ui/navigation/NavigationKey.kt index d3ae0cd60..4322902a2 100644 --- a/app/src/main/kotlin/org/fdroid/ui/navigation/NavigationKey.kt +++ b/app/src/main/kotlin/org/fdroid/ui/navigation/NavigationKey.kt @@ -5,6 +5,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Apps import androidx.compose.material.icons.filled.Explore import androidx.compose.material.icons.filled.Info +import androidx.compose.material.icons.filled.Search import androidx.compose.material.icons.filled.Settings import androidx.compose.material.icons.filled.SwapHorizontalCircle import androidx.compose.ui.graphics.vector.ImageVector @@ -22,14 +23,18 @@ sealed interface NavigationKey : NavKey { override val icon: ImageVector = Icons.Filled.Explore } + @Serializable + data object Search : NavigationKey, MainNavKey { + override val label: Int = R.string.menu_search + override val icon: ImageVector = Icons.Filled.Search + } + @Serializable data object MyApps : NavigationKey, MainNavKey { override val label: Int = R.string.menu_apps_my override val icon: ImageVector = Icons.Filled.Apps } - @Serializable data object Search : NavigationKey - @Serializable data class AppDetails(val packageName: String) : NavigationKey @Serializable data class AppList(val type: AppListType) : NavigationKey @@ -56,7 +61,8 @@ sealed interface MainNavKey : NavKey { val icon: ImageVector } -val topLevelRoutes = listOf(NavigationKey.Discover, NavigationKey.MyApps) +val topLevelRoutes = + listOf(NavigationKey.Discover, NavigationKey.Search, NavigationKey.MyApps) sealed class NavDestinations( val id: NavigationKey, diff --git a/app/src/main/kotlin/org/fdroid/ui/navigation/SceneDecorator.kt b/app/src/main/kotlin/org/fdroid/ui/navigation/SceneDecorator.kt new file mode 100644 index 000000000..58566a503 --- /dev/null +++ b/app/src/main/kotlin/org/fdroid/ui/navigation/SceneDecorator.kt @@ -0,0 +1,115 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Mostly copied from https://github.com/android/nav3-recipes + */ + +package org.fdroid.ui.navigation + +import androidx.compose.animation.EnterExitState +import androidx.compose.animation.SharedTransitionScope +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.movableContentOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberUpdatedState +import androidx.compose.ui.Modifier +import androidx.navigation3.scene.Scene +import androidx.navigation3.scene.SceneDecoratorStrategy +import androidx.navigation3.scene.SceneDecoratorStrategyScope +import androidx.navigation3.ui.LocalNavAnimatedContentScope + +class ResponsiveNavigationScene( + scene: Scene, + isBigScreen: Boolean, + sharedTransitionScope: SharedTransitionScope, + navBarContent: @Composable (() -> Unit), + navRailContent: @Composable (() -> Unit), +) : Scene by scene { + override val key = scene::class to scene.key + + override val content = + @Composable { + val animatedContentScope = LocalNavAnimatedContentScope.current + val isMovableContentCaller = + animatedContentScope.transition.targetState == EnterExitState.Visible + + with(sharedTransitionScope) { + if (isBigScreen) { + Row(Modifier.fillMaxSize()) { + Box( + modifier = + Modifier.sharedElement(rememberSharedContentState("nav-rail"), animatedContentScope) + ) { + if (isMovableContentCaller) { + navRailContent() + } + } + Box(modifier = Modifier.weight(1f)) { scene.content() } + } + } else { + Column(Modifier.fillMaxSize()) { + Box(modifier = Modifier.weight(1f)) { scene.content() } + navBarContent() + } + } + } + } +} + +@Composable +fun rememberResponsiveNavigationSceneDecoratorStrategy( + isBigScreen: Boolean, + navBar: @Composable (() -> Unit)?, + navRail: @Composable () -> Unit, + sharedTransitionScope: SharedTransitionScope, +): ResponsiveNavigationSceneDecoratorStrategy { + val currentNavBar by rememberUpdatedState(navBar) + val currentNavRail by rememberUpdatedState(navRail) + + val movableNavBar = remember(navBar) { movableContentOf { currentNavBar?.invoke() } } + val movableNavRail = remember { movableContentOf { currentNavRail() } } + + return remember(isBigScreen, sharedTransitionScope) { + ResponsiveNavigationSceneDecoratorStrategy( + isBigScreen = isBigScreen, + sharedTransitionScope = sharedTransitionScope, + navBarContent = movableNavBar, + navRailContent = movableNavRail, + ) + } +} + +class ResponsiveNavigationSceneDecoratorStrategy( + private val isBigScreen: Boolean, + private val sharedTransitionScope: SharedTransitionScope, + private val navBarContent: @Composable (() -> Unit), + private val navRailContent: @Composable () -> Unit, +) : SceneDecoratorStrategy { + + override fun SceneDecoratorStrategyScope.decorateScene(scene: Scene): Scene { + return ResponsiveNavigationScene( + scene = scene, + isBigScreen = isBigScreen, + sharedTransitionScope = sharedTransitionScope, + navBarContent = navBarContent, + navRailContent = navRailContent, + ) + } +} diff --git a/app/src/main/kotlin/org/fdroid/ui/repositories/RepositoriesViewModel.kt b/app/src/main/kotlin/org/fdroid/ui/repositories/RepositoriesViewModel.kt index b3e659e12..1bef2f631 100644 --- a/app/src/main/kotlin/org/fdroid/ui/repositories/RepositoriesViewModel.kt +++ b/app/src/main/kotlin/org/fdroid/ui/repositories/RepositoriesViewModel.kt @@ -72,9 +72,12 @@ constructor( private fun onRepositoriesChanged(repositories: List) { log.info("onRepositoriesChanged(${repositories.size})") repos.update { - repositories.mapNotNull { - if (it.isArchiveRepo) null else RepositoryItem(it, localeList, settingsManager.proxyConfig) - } + repositories + .mapNotNull { + if (it.isArchiveRepo) null + else RepositoryItem(it, localeList, settingsManager.proxyConfig) + } + .also { repos -> log.info { "Adding repos ${repos.map { it.address }}" } } } repoSortingMap.update { // just add repos to sortingMap, because they are already pre-sorted by weight diff --git a/app/src/main/kotlin/org/fdroid/ui/repositories/add/AddRepo.kt b/app/src/main/kotlin/org/fdroid/ui/repositories/add/AddRepo.kt index 698863149..42b09452c 100644 --- a/app/src/main/kotlin/org/fdroid/ui/repositories/add/AddRepo.kt +++ b/app/src/main/kotlin/org/fdroid/ui/repositories/add/AddRepo.kt @@ -46,8 +46,10 @@ fun AddRepo( topBar = { TopAppBar( navigationIcon = { - IconButton(onClick = onBackClicked) { - Icon(Icons.AutoMirrored.Filled.ArrowBack, stringResource(R.string.back)) + if (state !is Adding) { + IconButton(onClick = onBackClicked) { + Icon(Icons.AutoMirrored.Filled.ArrowBack, stringResource(R.string.back)) + } } }, title = { @@ -93,6 +95,7 @@ fun AddRepo( Adding -> AddRepoProgressScreen( text = stringResource(R.string.repo_state_adding), + backAllowed = false, modifier = Modifier.padding(paddingValues), ) is Added -> { diff --git a/app/src/main/kotlin/org/fdroid/ui/repositories/add/AddRepoIntro.kt b/app/src/main/kotlin/org/fdroid/ui/repositories/add/AddRepoIntro.kt index 0e332e061..e6199b65d 100644 --- a/app/src/main/kotlin/org/fdroid/ui/repositories/add/AddRepoIntro.kt +++ b/app/src/main/kotlin/org/fdroid/ui/repositories/add/AddRepoIntro.kt @@ -81,6 +81,7 @@ import org.fdroid.ui.utils.FDroidButton import org.fdroid.ui.utils.FDroidOutlineButton import org.fdroid.ui.utils.MeteredConnectionDialog import org.fdroid.ui.utils.OfflineBar +import org.fdroid.ui.utils.launchSafe import org.fdroid.ui.utils.startActivitySafe @Composable @@ -145,7 +146,8 @@ fun AddRepoIntroContent( if (checkSelfPermission(context, CAMERA) == PERMISSION_GRANTED) { startScanning() } else { - permissionLauncher.launch(CAMERA) + permissionLauncher.launchSafe(CAMERA) + Unit } } if (networkState.isMetered) showMeteredDialog = scanLambda else scanLambda() diff --git a/app/src/main/kotlin/org/fdroid/ui/repositories/add/AddRepoProgressScreen.kt b/app/src/main/kotlin/org/fdroid/ui/repositories/add/AddRepoProgressScreen.kt index b2dfbc59d..7184f390b 100644 --- a/app/src/main/kotlin/org/fdroid/ui/repositories/add/AddRepoProgressScreen.kt +++ b/app/src/main/kotlin/org/fdroid/ui/repositories/add/AddRepoProgressScreen.kt @@ -1,5 +1,6 @@ package org.fdroid.ui.repositories.add +import androidx.activity.compose.BackHandler import androidx.compose.foundation.layout.Arrangement.spacedBy import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize @@ -21,7 +22,12 @@ import org.fdroid.ui.FDroidContent @Composable @OptIn(ExperimentalMaterial3ExpressiveApi::class) -fun AddRepoProgressScreen(text: String, modifier: Modifier = Modifier) { +fun AddRepoProgressScreen( + text: String, + modifier: Modifier = Modifier, + backAllowed: Boolean = true, +) { + BackHandler(!backAllowed) {} Column( verticalArrangement = spacedBy(16.dp, CenterVertically), horizontalAlignment = CenterHorizontally, diff --git a/app/src/main/kotlin/org/fdroid/ui/search/AppSearchInputField.kt b/app/src/main/kotlin/org/fdroid/ui/search/AppSearchInputField.kt index 7e722dc85..62aad39ee 100644 --- a/app/src/main/kotlin/org/fdroid/ui/search/AppSearchInputField.kt +++ b/app/src/main/kotlin/org/fdroid/ui/search/AppSearchInputField.kt @@ -23,6 +23,7 @@ import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch import org.fdroid.R +import org.fdroid.search.SEARCH_THRESHOLD @Composable @OptIn(ExperimentalMaterial3Api::class, FlowPreview::class) diff --git a/app/src/main/kotlin/org/fdroid/ui/search/AppsSearch.kt b/app/src/main/kotlin/org/fdroid/ui/search/AppsSearch.kt deleted file mode 100644 index 0ef1f90f4..000000000 --- a/app/src/main/kotlin/org/fdroid/ui/search/AppsSearch.kt +++ /dev/null @@ -1,74 +0,0 @@ -package org.fdroid.ui.search - -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.text.input.TextFieldState -import androidx.compose.foundation.text.input.rememberTextFieldState -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Search -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.SearchBar -import androidx.compose.material3.SearchBarDefaults -import androidx.compose.material3.Text -import androidx.compose.material3.rememberSearchBarState -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.onFocusChanged -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.semantics.hideFromAccessibility -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.tooling.preview.Preview -import org.fdroid.R -import org.fdroid.ui.FDroidContent -import org.fdroid.ui.navigation.NavigationKey - -/** The minimum amount of characters we start auto-searching for. */ -const val SEARCH_THRESHOLD = 2 - -@Composable -@OptIn(ExperimentalMaterial3Api::class) -fun AppsSearch( - textFieldState: TextFieldState, - onNav: (NavigationKey) -> Unit, - modifier: Modifier = Modifier, -) { - val searchBarState = rememberSearchBarState() - SearchBar( - state = searchBarState, - inputField = { - // InputField is different from ExpandedFullScreenSearchBar to separate onSearch() - SearchBarDefaults.InputField( - searchBarState = searchBarState, - textFieldState = textFieldState, - placeholder = { - Text( - text = stringResource(R.string.search_placeholder), - // we hide the placeholder, because TalkBack is already saying "Search" - modifier = Modifier.semantics { hideFromAccessibility() }, - ) - }, - leadingIcon = { - Icon( - imageVector = Icons.Default.Search, - contentDescription = null, - modifier = Modifier.semantics { hideFromAccessibility() }, - ) - }, - onSearch = {}, - modifier = Modifier.onFocusChanged { if (it.isFocused) onNav(NavigationKey.Search) }, - ) - }, - modifier = modifier.clickable { onNav(NavigationKey.Search) }, - ) -} - -@Preview -@Composable -private fun Preview() { - FDroidContent { - val textFieldState = rememberTextFieldState() - Box(Modifier.fillMaxSize()) { AppsSearch(textFieldState, {}) } - } -} diff --git a/app/src/main/kotlin/org/fdroid/ui/search/GlobalSearch.kt b/app/src/main/kotlin/org/fdroid/ui/search/GlobalSearch.kt index 271218902..197c5c266 100644 --- a/app/src/main/kotlin/org/fdroid/ui/search/GlobalSearch.kt +++ b/app/src/main/kotlin/org/fdroid/ui/search/GlobalSearch.kt @@ -15,6 +15,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.tooling.preview.Preview +import org.fdroid.search.SavedSearch import org.fdroid.ui.FDroidContent import org.fdroid.ui.navigation.NavigationKey import org.fdroid.ui.utils.appListItems @@ -23,9 +24,11 @@ import org.fdroid.ui.utils.categoryItems @Composable @OptIn(ExperimentalMaterial3Api::class) fun GlobalSearch( - textFieldState: TextFieldState, + textFieldState: TextFieldState = rememberTextFieldState(), searchResults: SearchResults?, + savedSearches: List? = null, onSearch: suspend (String) -> Unit, + onClearSavedSearches: () -> Unit, onNav: (NavigationKey) -> Unit, onBack: () -> Unit, onSearchCleared: () -> Unit, @@ -34,26 +37,31 @@ fun GlobalSearch( topBar = { TopSearchBar( searchFieldState = textFieldState, + shouldRequestFocus = // only show keyboard if there are no results to show + searchResults == null || + searchResults.apps.isEmpty() && searchResults.categories.isEmpty(), onSearch = onSearch, onSearchCleared = onSearchCleared, onHideSearch = onBack, ) - }, + } ) { paddingValues -> HorizontalDivider( color = SearchBarDefaults.colors().dividerColor, - modifier = Modifier.padding( - start = paddingValues.calculateStartPadding(LocalLayoutDirection.current), - end = paddingValues.calculateEndPadding(LocalLayoutDirection.current), - top = paddingValues.calculateTopPadding(), - ), + modifier = + Modifier.padding( + start = paddingValues.calculateStartPadding(LocalLayoutDirection.current), + end = paddingValues.calculateEndPadding(LocalLayoutDirection.current), + top = paddingValues.calculateTopPadding(), + ), ) SearchResults( + paddingValues = paddingValues, searchResults = searchResults, textFieldState = textFieldState, + savedSearches = savedSearches, + onClearSavedSearches = onClearSavedSearches, onNav = onNav, - paddingValues = paddingValues, - modifier = Modifier, ) } } @@ -64,18 +72,50 @@ fun GlobalSearch( private fun AppsSearchLoadingPreview() { FDroidContent { val textFieldState = rememberTextFieldState("foo bar") - Box(Modifier.fillMaxSize()) { GlobalSearch(textFieldState, null, {}, {}, {}, {}) } + Box(Modifier.fillMaxSize()) { GlobalSearch(textFieldState, null, null, {}, {}, {}, {}, {}) } } } @Preview @Composable @OptIn(ExperimentalMaterial3Api::class) -private fun AppsSearchEmptyPreview() { +private fun AppsSearchEmptyStatePreview() { + FDroidContent { + val textFieldState = rememberTextFieldState("f") + val savedSearches = + listOf(SavedSearch(1, "foo"), SavedSearch(2, "foo bar"), SavedSearch(3, "foobar")) + Box(Modifier.fillMaxSize()) { + GlobalSearch( + textFieldState = textFieldState, + searchResults = null, + savedSearches = savedSearches, + onSearch = {}, + onClearSavedSearches = {}, + onNav = {}, + onBack = {}, + onSearchCleared = {}, + ) + } + } +} + +@Preview +@Composable +@OptIn(ExperimentalMaterial3Api::class) +private fun AppsSearchNoResultsPreview() { FDroidContent { val textFieldState = rememberTextFieldState("foo") Box(Modifier.fillMaxSize()) { - GlobalSearch(textFieldState, SearchResults(emptyList(), emptyList()), {}, {}, {}, {}) + GlobalSearch( + textFieldState = textFieldState, + searchResults = SearchResults(emptyList(), emptyList()), + savedSearches = emptyList(), + onSearch = {}, + onClearSavedSearches = {}, + onNav = {}, + onBack = {}, + onSearchCleared = {}, + ) } } } @@ -90,7 +130,9 @@ private fun AppsSearchOnlyCategoriesPreview() { GlobalSearch( textFieldState = textFieldState, searchResults = SearchResults(emptyList(), categoryItems.subList(3, 5)), + savedSearches = emptyList(), onSearch = {}, + onClearSavedSearches = {}, onNav = {}, onBack = {}, onSearchCleared = {}, @@ -109,7 +151,9 @@ private fun AppsSearchPreview() { GlobalSearch( textFieldState = textFieldState, searchResults = SearchResults(appListItems, categoryItems.subList(0, 4)), + savedSearches = emptyList(), onSearch = {}, + onClearSavedSearches = {}, onNav = {}, onBack = {}, onSearchCleared = {}, diff --git a/app/src/main/kotlin/org/fdroid/ui/search/PastSearches.kt b/app/src/main/kotlin/org/fdroid/ui/search/PastSearches.kt new file mode 100644 index 000000000..09271a0fd --- /dev/null +++ b/app/src/main/kotlin/org/fdroid/ui/search/PastSearches.kt @@ -0,0 +1,95 @@ +package org.fdroid.ui.search + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.ime +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.systemBars +import androidx.compose.foundation.layout.windowInsetsBottomHeight +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.History +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi +import androidx.compose.material3.Icon +import androidx.compose.material3.ListItem +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import org.fdroid.R +import org.fdroid.search.SavedSearch +import org.fdroid.ui.FDroidContent + +@Composable +@OptIn(ExperimentalMaterial3ExpressiveApi::class) +fun PastSearches( + savedSearches: List, + onSearch: (String) -> Unit, + onClearSavedSearches: () -> Unit, + modifier: Modifier = Modifier, + paddingValues: PaddingValues = PaddingValues(), +) { + LazyColumn(modifier = modifier.fillMaxSize(), contentPadding = paddingValues) { + item { + Row { + Text( + text = stringResource(R.string.search_history), + style = MaterialTheme.typography.labelLarge, + modifier = Modifier.padding(vertical = 8.dp, horizontal = 16.dp).weight(1f), + ) + TextButton( + onClick = onClearSavedSearches, + modifier = Modifier.padding(horizontal = 8.dp), + ) { + Text(stringResource(R.string.clear)) + } + } + } + items(savedSearches) { item -> + ListItem( + leadingContent = { + Icon( + Icons.Default.History, + contentDescription = null, + modifier = + Modifier.clip(CircleShape) + .background(MaterialTheme.colorScheme.surfaceContainer) + .padding(8.dp), + ) + }, + onClick = { onSearch(item.query) }, + modifier = Modifier.fillMaxWidth().animateItem(), + ) { + Text(item.query) + } + } + item { Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.systemBars)) } + item { Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.ime)) } + } +} + +@Preview +@Composable +private fun Preview() { + FDroidContent { + val savedSearches = + listOf(SavedSearch(1, "foo"), SavedSearch(2, "foo bar"), SavedSearch(3, "foobar")) + PastSearches( + savedSearches = savedSearches, + onClearSavedSearches = {}, + onSearch = {}, + ) + } +} diff --git a/app/src/main/kotlin/org/fdroid/ui/search/SearchResults.kt b/app/src/main/kotlin/org/fdroid/ui/search/SearchResults.kt index 819403778..544e22107 100644 --- a/app/src/main/kotlin/org/fdroid/ui/search/SearchResults.kt +++ b/app/src/main/kotlin/org/fdroid/ui/search/SearchResults.kt @@ -3,14 +3,20 @@ package org.fdroid.ui.search import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.ime import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.systemBars +import androidx.compose.foundation.layout.windowInsetsBottomHeight import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.items import androidx.compose.foundation.text.input.TextFieldState +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text @@ -21,6 +27,8 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import org.fdroid.R +import org.fdroid.search.SEARCH_THRESHOLD +import org.fdroid.search.SavedSearch import org.fdroid.ui.categories.CategoryChip import org.fdroid.ui.categories.CategoryItem import org.fdroid.ui.categories.ChipFlowRow @@ -33,12 +41,15 @@ import org.fdroid.ui.utils.BigLoadingIndicator data class SearchResults(val apps: List, val categories: List) @Composable +@OptIn(ExperimentalMaterial3ExpressiveApi::class) fun SearchResults( + paddingValues: PaddingValues, searchResults: SearchResults?, textFieldState: TextFieldState, + savedSearches: List?, + onClearSavedSearches: () -> Unit, onNav: (NavigationKey) -> Unit, - paddingValues: PaddingValues, - modifier: Modifier, + modifier: Modifier = Modifier, ) { // rememberLazyListState done differently, so it refreshes for different searchResults val listState = @@ -46,9 +57,19 @@ fun SearchResults( if (searchResults == null) { if (textFieldState.text.length >= SEARCH_THRESHOLD) { BigLoadingIndicator(modifier.padding(paddingValues).imePadding()) + } else { + if (!savedSearches.isNullOrEmpty()) { + PastSearches( + savedSearches = savedSearches, + onSearch = { textFieldState.edit { replace(0, length, it) } }, + onClearSavedSearches = onClearSavedSearches, + modifier = modifier, + paddingValues = paddingValues, + ) + } } } else if (searchResults.apps.isEmpty() && textFieldState.text.length >= SEARCH_THRESHOLD) { - Column(modifier = modifier.padding(paddingValues).imePadding()) { + Column(modifier = modifier.padding(paddingValues)) { if (searchResults.categories.isNotEmpty()) { CategoriesFlowRow(searchResults.categories, onNav) } @@ -62,7 +83,7 @@ fun SearchResults( LazyColumn( state = listState, contentPadding = paddingValues, - modifier = modifier.fillMaxSize().imePadding(), + modifier = modifier.fillMaxSize(), ) { if (searchResults.categories.isNotEmpty()) { item(key = "categories", contentType = "category") { @@ -93,6 +114,8 @@ fun SearchResults( }, ) } + item { Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.systemBars)) } + item { Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.ime)) } } } } diff --git a/app/src/main/kotlin/org/fdroid/ui/search/SearchViewModel.kt b/app/src/main/kotlin/org/fdroid/ui/search/SearchViewModel.kt index 893e341f8..5ad895b42 100644 --- a/app/src/main/kotlin/org/fdroid/ui/search/SearchViewModel.kt +++ b/app/src/main/kotlin/org/fdroid/ui/search/SearchViewModel.kt @@ -2,18 +2,23 @@ package org.fdroid.ui.search import android.app.Application import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import jakarta.inject.Inject +import kotlinx.coroutines.launch +import org.fdroid.search.SearchManager @HiltViewModel class SearchViewModel @Inject constructor(app: Application, private val searchManager: SearchManager) : AndroidViewModel(app) { - val textFieldState = searchManager.textFieldState val searchResults = searchManager.searchResults + val savedSearchesFlow = searchManager.savedSearches suspend fun search(term: String) = searchManager.search(term) fun onSearchCleared() = searchManager.onSearchCleared() + + fun onClearSearchHistory() = viewModelScope.launch { searchManager.onClearSearchHistory() } } diff --git a/app/src/main/kotlin/org/fdroid/ui/search/TopSearchBar.kt b/app/src/main/kotlin/org/fdroid/ui/search/TopSearchBar.kt index 55cc89bbf..4f644e94e 100644 --- a/app/src/main/kotlin/org/fdroid/ui/search/TopSearchBar.kt +++ b/app/src/main/kotlin/org/fdroid/ui/search/TopSearchBar.kt @@ -26,6 +26,7 @@ import org.fdroid.ui.utils.BackButton @OptIn(ExperimentalMaterial3Api::class, FlowPreview::class) fun TopSearchBar( searchFieldState: TextFieldState = rememberTextFieldState(), + shouldRequestFocus: Boolean = true, actions: @Composable (RowScope.() -> Unit) = {}, onSearch: suspend (String) -> Unit, onSearchCleared: () -> Unit, @@ -49,8 +50,10 @@ fun TopSearchBar( }, actions = actions, ) - LaunchedEffect(Unit) { - focusRequester.requestFocus() - keyboardController?.show() + LaunchedEffect(shouldRequestFocus) { + if (shouldRequestFocus) { + focusRequester.requestFocus() + keyboardController?.show() + } } } diff --git a/app/src/main/kotlin/org/fdroid/ui/settings/Settings.kt b/app/src/main/kotlin/org/fdroid/ui/settings/Settings.kt index 50e2f1e37..b0297444f 100644 --- a/app/src/main/kotlin/org/fdroid/ui/settings/Settings.kt +++ b/app/src/main/kotlin/org/fdroid/ui/settings/Settings.kt @@ -6,6 +6,8 @@ import android.os.Build.VERSION.SDK_INT import android.provider.Settings.ACTION_APP_LOCALE_SETTINGS import android.provider.Settings.ACTION_APP_NOTIFICATION_SETTINGS import android.provider.Settings.EXTRA_APP_PACKAGE +import android.widget.Toast +import android.widget.Toast.LENGTH_SHORT import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts.CreateDocument import androidx.compose.foundation.layout.fillMaxSize @@ -65,7 +67,6 @@ import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_MIRROR_CHOOSER import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_PREVENT_SCREENSHOTS import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_PROXY import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_REPO_UPDATES -import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_SMALL_BOTTOM_BAR import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_THEME import org.fdroid.settings.SettingsConstants.PREF_KEY_AUTO_UPDATES import org.fdroid.settings.SettingsConstants.PREF_KEY_DYNAMIC_COLORS @@ -73,7 +74,6 @@ import org.fdroid.settings.SettingsConstants.PREF_KEY_MIRROR_CHOOSER import org.fdroid.settings.SettingsConstants.PREF_KEY_PREVENT_SCREENSHOTS import org.fdroid.settings.SettingsConstants.PREF_KEY_PROXY import org.fdroid.settings.SettingsConstants.PREF_KEY_REPO_UPDATES -import org.fdroid.settings.SettingsConstants.PREF_KEY_SMALL_BOTTOM_BAR import org.fdroid.settings.SettingsConstants.PREF_KEY_THEME import org.fdroid.settings.SettingsConstants.PREF_USE_DNS_CACHE import org.fdroid.settings.SettingsConstants.PREF_USE_DNS_CACHE_DEFAULT @@ -82,17 +82,13 @@ import org.fdroid.settings.toMirrorChooserValue import org.fdroid.ui.FDroidContent import org.fdroid.ui.utils.BackButton import org.fdroid.ui.utils.asRelativeTimeString +import org.fdroid.ui.utils.launchSafe import org.fdroid.ui.utils.startActivitySafe import org.fdroid.utils.getLogName @Composable @OptIn(ExperimentalMaterial3Api::class) -fun Settings( - model: SettingsModel, - isBigScreen: Boolean, - onSaveLogcat: (Uri?) -> Unit, - onBackClicked: () -> Unit, -) { +fun Settings(model: SettingsModel, onSaveLogcat: (Uri?) -> Unit, onBackClicked: () -> Unit) { Scaffold( topBar = { TopAppBar( @@ -118,6 +114,7 @@ fun Settings( AnnotatedString( when (value) { "light" -> res.getString(R.string.theme_light) + "night", // night was added because we had a crash with that "dark" -> res.getString(R.string.theme_dark) "followSystem" -> res.getString(R.string.theme_follow_system) else -> error("Unknown value: $value") @@ -193,14 +190,6 @@ fun Settings( context.startActivitySafe(intent) }, ) - if (!isBigScreen) - switchPreference( - key = PREF_KEY_SMALL_BOTTOM_BAR, - defaultValue = PREF_DEFAULT_SMALL_BOTTOM_BAR, - icon = {}, - title = { Text(stringResource(R.string.pref_compact_bottom_bar_title)) }, - summary = { Text(stringResource(R.string.pref_compact_bottom_bar_summary)) }, - ) preferenceCategory( key = "pref_category_updates", title = { Text(stringResource(R.string.updates)) }, @@ -387,7 +376,11 @@ fun Settings( }, title = { Text(stringResource(R.string.pref_export_log_title)) }, summary = { Text(stringResource(R.string.pref_export_log_summary)) }, - onClick = { launcher.launch("${getLogName(context)}.txt") }, + onClick = { + if (!launcher.launchSafe("${getLogName(context)}.txt")) { + Toast.makeText(context, R.string.no_handler_app_generic, LENGTH_SHORT).show() + } + }, ) } } @@ -404,6 +397,6 @@ fun SettingsPreview() { nextRepoUpdateFlow = MutableStateFlow(Long.MAX_VALUE), nextAppUpdateFlow = MutableStateFlow(currentTimeMillis() - HOURS.toMillis(12)), ) - Settings(model, true, {}, {}) + Settings(model, {}, {}) } } diff --git a/app/src/main/kotlin/org/fdroid/ui/utils/UiUtils.kt b/app/src/main/kotlin/org/fdroid/ui/utils/UiUtils.kt index 5cc4f5d37..caea0d7d7 100644 --- a/app/src/main/kotlin/org/fdroid/ui/utils/UiUtils.kt +++ b/app/src/main/kotlin/org/fdroid/ui/utils/UiUtils.kt @@ -9,6 +9,7 @@ import android.graphics.Color import android.os.PowerManager import android.text.format.DateUtils import android.util.Log +import androidx.activity.result.ActivityResultLauncher import androidx.appcompat.app.AppCompatDelegate import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable @@ -33,6 +34,16 @@ fun Context.startActivitySafe(i: Intent?) { } } +fun ActivityResultLauncher.launchSafe(input: I): Boolean { + return try { + launch(input) + true + } catch (e: Exception) { + Log.e("ActivityResultLauncher", "Error launching $input ", e) + false + } +} + fun applyNewTheme(theme: String) { val mode = when (theme) { diff --git a/app/src/main/kotlin/org/fdroid/ui/utils/VersionLine.kt b/app/src/main/kotlin/org/fdroid/ui/utils/VersionLine.kt new file mode 100644 index 000000000..ef557d504 --- /dev/null +++ b/app/src/main/kotlin/org/fdroid/ui/utils/VersionLine.kt @@ -0,0 +1,76 @@ +package org.fdroid.ui.utils + +import android.text.format.Formatter +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.text.InlineTextContent +import androidx.compose.foundation.text.appendInlineContent +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowRightAlt +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalLayoutDirection +import androidx.compose.ui.text.Placeholder +import androidx.compose.ui.text.PlaceholderVerticalAlign +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.unit.LayoutDirection +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import org.fdroid.ui.apps.AppUpdateItem + +/** + * Shows which is the installed version of the app and to which version it will upgrade. Takes into + * account the layout direction to show the correct order of versions and the arrow. + */ +@Composable +fun VersionLine(app: AppUpdateItem) { + VersionLineWithSize(app.installedVersionName, app.update.versionName, app.update.size) +} + +@Composable +fun VersionLineWithSize(fromVersion: String?, toVersion: String, numBytes: Long? = null) { + val size = numBytes?.let { Formatter.formatFileSize(LocalContext.current, it) } + VersionLine(fromVersion, toVersion, size) +} + +@Composable +fun VersionLine(fromVersion: String?, toVersion: String, extraText: String? = null) { + val test = buildAnnotatedString { + if (LocalLayoutDirection.current == LayoutDirection.Ltr) { + if (fromVersion != null) { + append(fromVersion) + } + } else { + append("\u202A${toVersion}\u202C") + } + if (fromVersion != null) appendInlineContent("arrowId", " → ") + if (LocalLayoutDirection.current == LayoutDirection.Ltr) { + append("\u202A${toVersion}\u202C") + } else if (fromVersion != null) { + append("\u202A${fromVersion}\u202C") + } + if (extraText != null) append(" • $extraText") + } + val inlineContent = + mapOf( + Pair( + "arrowId", + InlineTextContent( + Placeholder( + width = 24.sp, + height = 20.sp, + placeholderVerticalAlign = PlaceholderVerticalAlign.TextCenter, + ) + ) { + Icon( + Icons.AutoMirrored.Default.ArrowRightAlt, + contentDescription = null, + modifier = Modifier.padding(horizontal = 2.dp), + ) + }, + ) + ) + Text(test, inlineContent = if (fromVersion == null) mapOf() else inlineContent) +} diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index b0e77ae2e..8d9fbd148 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -851,8 +851,6 @@ حُدِّث %1$d تطبيقًا حُدِّث %1$d تطبيق - شريط تنقل مضغوط - يقلل حجم شريط التنقل السفلي ويخفي تسمياته - ينزل ب %1$s +W ينزل ب %1$s %1$s متبقي diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index bc9cd1706..9d093ec01 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -714,8 +714,6 @@ Usa i colori di sistema Applica colori dinamici dalle impostazioni di sistema Apri le impostazioni di lingua del sistema - Barra di navigazione compatta - Riduci la dimensione e nascondi le etichette della barra inferiore di navigazione Solo con Wi-Fi Sempre (anche con connessione dati mobile) Mai diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index e8bd4c6f8..5a2dff6a1 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -826,8 +826,6 @@ Historia instalacji jest wyłączona\n\nInstalacje, aktualizacje i odinstalowania nie będą rejestrowane Usuń historię instalacji Czy usunąć historię instalacji? - Kompaktowy pasek nawigacyjny - Zmniejsz rozmiar i ukryj etykiety dolnego paska nawigacyjnego Pobieranie z prędkością %1$s Pozostało %1$s diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 6ea3db33f..290f184bf 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -768,8 +768,6 @@ 禁用了安装历史记录\n\n不会记录安装、更新和卸载 删除安装历史记录 要删除安装历史记录吗? - 紧凑式导航栏 - 缩小尺寸并隐藏底部导航栏的标签 实时下载速度 %1$s 剩余 %1$s diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3975a6b71..c93feae15 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -34,6 +34,7 @@ Apps by %s Search… + Recent searches No apps found\n\nTry using fewer search terms or add more repositories No matching apps\n\nTry using fewer search terms or remove filters No matching apps\n\nTry using fewer search terms @@ -166,8 +167,6 @@ Use system colors Apply dynamic colors from your system settings Open system language settings - Compact navigation bar - Reduces size and hides labels of navigation bottom bar Only on Wi-Fi Always (even on mobile data) Never @@ -569,8 +568,8 @@ This often occurs with apps installed via Google Play or other sources, if they - Percentage complete (int between 0-100) --> Downloading\n%2$s / %3$s (%4$d%%) from\n%1$s - - Downloading with %1$s + + Downloading at %s/s %1$s remaining @@ -1009,6 +1008,7 @@ This often occurs with apps installed via Google Play or other sources, if they Official IPFS gateways Custom IPFS gateways + Use installation history This list is still empty\n\nWhen you install, update or uninstall apps, a record will appear here Installation history is disabled\n\nInstallations, updates and uninstalls will not be recorded Delete installation history diff --git a/app/src/main/resources/META-INF/services/org.acra.collector.Collector b/app/src/main/resources/META-INF/services/org.acra.collector.Collector new file mode 100644 index 000000000..261a51709 --- /dev/null +++ b/app/src/main/resources/META-INF/services/org.acra.collector.Collector @@ -0,0 +1 @@ +org.fdroid.ui.crash.ShortHashCollector diff --git a/app/src/screenshotTest/kotlin/org/fdroid/ui/ScreenshotTest.kt b/app/src/screenshotTest/kotlin/org/fdroid/ui/ScreenshotTest.kt index 5fb262bf5..1336083ab 100644 --- a/app/src/screenshotTest/kotlin/org/fdroid/ui/ScreenshotTest.kt +++ b/app/src/screenshotTest/kotlin/org/fdroid/ui/ScreenshotTest.kt @@ -1,31 +1,33 @@ package org.fdroid.ui +import androidx.compose.material3.adaptive.layout.PaneScaffoldDirective import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier +import androidx.navigation3.runtime.NavEntry import androidx.navigation3.runtime.NavKey +import org.fdroid.ui.navigation.MainNavKey import org.fdroid.ui.navigation.NavigationKey @Composable fun ScreenshotTest( - showBottomBar: Boolean = true, - smallBottomBar: Boolean = false, currentNavKey: NavKey = NavigationKey.Discover, + showBottomBar: Boolean = currentNavKey is MainNavKey, numUpdates: Int = 3, hasAppIssues: Boolean = true, - content: @Composable (Modifier) -> Unit, + content: @Composable () -> Unit, ) { MainContent( model = MainModel( dynamicColors = false, - smallBottomBar = smallBottomBar, numUpdates = numUpdates, hasAppIssues = hasAppIssues, ), + navEntries = listOf(NavEntry(currentNavKey) { content() }), + directive = PaneScaffoldDirective.Default, isBigScreen = false, showBottomBar = showBottomBar, currentNavKey = currentNavKey, onNav = {}, - content = content, + onBack = {}, ) } diff --git a/app/src/screenshotTest/kotlin/org/fdroid/ui/discover/DiscoverTest.kt b/app/src/screenshotTest/kotlin/org/fdroid/ui/discover/DiscoverTest.kt index c610a20b0..b5926d394 100644 --- a/app/src/screenshotTest/kotlin/org/fdroid/ui/discover/DiscoverTest.kt +++ b/app/src/screenshotTest/kotlin/org/fdroid/ui/discover/DiscoverTest.kt @@ -1,7 +1,5 @@ package org.fdroid.ui.discover -import android.content.res.Configuration -import androidx.compose.foundation.text.input.TextFieldState import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview import com.android.tools.screenshot.PreviewTest @@ -43,24 +41,6 @@ private fun DiscoverTest() { } } -@Composable -@PreviewTest -@Preview( - showBackground = true, - showSystemUi = true, - uiMode = Configuration.UI_MODE_NIGHT_YES or Configuration.UI_MODE_TYPE_NORMAL, -) -private fun DiscoverSmallBottomBarTest() { - ScreenshotTest(smallBottomBar = true) { - Discover( - discoverModel = getLoadedModel().copy(hasRepoIssues = false), - onListTap = {}, - onAppTap = {}, - onNav = {}, - ) - } -} - private fun getLoadedModel(): LoadedDiscoverModel { val newApps = listOf( @@ -132,7 +112,6 @@ private fun getLoadedModel(): LoadedDiscoverModel { recentlyUpdatedApps = recentlyUpdatedApps, mostDownloadedApps = mostDownloadedApps, categories = categories, - searchTextFieldState = TextFieldState(), hasRepoIssues = true, ) } diff --git a/app/src/screenshotTest/kotlin/org/fdroid/ui/search/GlobalSearchTest.kt b/app/src/screenshotTest/kotlin/org/fdroid/ui/search/GlobalSearchTest.kt index da224844a..2d9fb24ca 100644 --- a/app/src/screenshotTest/kotlin/org/fdroid/ui/search/GlobalSearchTest.kt +++ b/app/src/screenshotTest/kotlin/org/fdroid/ui/search/GlobalSearchTest.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.text.input.rememberTextFieldState import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview import com.android.tools.screenshot.PreviewTest +import org.fdroid.search.SavedSearch import org.fdroid.ui.ScreenshotTest import org.fdroid.ui.utils.appListItems import org.fdroid.ui.utils.categoryItems @@ -13,12 +14,34 @@ import org.fdroid.ui.utils.categoryItems @PreviewTest @Preview(showBackground = true, showSystemUi = true) fun GlobalSearchEmptyTest() = - ScreenshotTest(showBottomBar = false) { + ScreenshotTest { val textFieldState = rememberTextFieldState() GlobalSearch( - textFieldState, - null, + textFieldState = textFieldState, + searchResults = null, + savedSearches = emptyList(), onSearch = {}, + onClearSavedSearches = {}, + onNav = {}, + onBack = {}, + onSearchCleared = {}, + ) + } + +@Composable +@PreviewTest +@Preview(showBackground = true, showSystemUi = true) +fun GlobalSearchEmptyStateTest() = + ScreenshotTest { + val savedSearches = + listOf(SavedSearch(1, "Browser"), SavedSearch(2, "media player"), SavedSearch(3, "email app")) + val textFieldState = rememberTextFieldState() + GlobalSearch( + textFieldState = textFieldState, + searchResults = null, + savedSearches = savedSearches, + onSearch = {}, + onClearSavedSearches = {}, onNav = {}, onBack = {}, onSearchCleared = {}, @@ -29,12 +52,14 @@ fun GlobalSearchEmptyTest() = @PreviewTest @Preview(showBackground = true, showSystemUi = true) fun GlobalSearchLoadingTest() = - ScreenshotTest(showBottomBar = false) { + ScreenshotTest { val textFieldState = rememberTextFieldState("foo bar") GlobalSearch( - textFieldState, - null, + textFieldState = textFieldState, + searchResults = null, + savedSearches = emptyList(), onSearch = {}, + onClearSavedSearches = {}, onNav = {}, onBack = {}, onSearchCleared = {}, @@ -45,12 +70,14 @@ fun GlobalSearchLoadingTest() = @PreviewTest @Preview(showBackground = true, showSystemUi = true) fun GlobalSearchNoResultsTest() = - ScreenshotTest(showBottomBar = false) { + ScreenshotTest { val textFieldState = rememberTextFieldState("foo") GlobalSearch( - textFieldState, - SearchResults(emptyList(), emptyList()), + textFieldState = textFieldState, + searchResults = SearchResults(emptyList(), emptyList()), + savedSearches = emptyList(), onSearch = {}, + onClearSavedSearches = {}, onNav = {}, onBack = {}, onSearchCleared = {}, @@ -61,12 +88,14 @@ fun GlobalSearchNoResultsTest() = @PreviewTest @Preview(showBackground = true, showSystemUi = true) fun GlobalSearchResultsTest() = - ScreenshotTest(showBottomBar = false) { + ScreenshotTest { val textFieldState = rememberTextFieldState("foo bar") GlobalSearch( - textFieldState, - SearchResults(appListItems, categoryItems.subList(0, 4)), + textFieldState = textFieldState, + searchResults = SearchResults(appListItems, categoryItems.subList(0, 4)), + savedSearches = emptyList(), onSearch = {}, + onClearSavedSearches = {}, onNav = {}, onBack = {}, onSearchCleared = {}, @@ -77,12 +106,14 @@ fun GlobalSearchResultsTest() = @PreviewTest @Preview(showBackground = true, showSystemUi = true) fun GlobalSearchOnlyCategoriesTest() = - ScreenshotTest(showBottomBar = false) { + ScreenshotTest { val textFieldState = rememberTextFieldState("foo bar") GlobalSearch( - textFieldState, - SearchResults(emptyList(), categoryItems.subList(5, 9)), + textFieldState = textFieldState, + searchResults = SearchResults(emptyList(), categoryItems.subList(5, 9)), + savedSearches = emptyList(), onSearch = {}, + onClearSavedSearches = {}, onNav = {}, onBack = {}, onSearchCleared = {}, @@ -97,12 +128,14 @@ fun GlobalSearchOnlyCategoriesTest() = uiMode = Configuration.UI_MODE_NIGHT_YES or Configuration.UI_MODE_TYPE_NORMAL, ) fun GlobalSearchResultsNightTest() = - ScreenshotTest(showBottomBar = false) { + ScreenshotTest { val textFieldState = rememberTextFieldState("foo bar") GlobalSearch( - textFieldState, - SearchResults(appListItems, categoryItems.subList(0, 4)), + textFieldState = textFieldState, + searchResults = SearchResults(appListItems, categoryItems.subList(0, 4)), + savedSearches = emptyList(), onSearch = {}, + onClearSavedSearches = {}, onNav = {}, onBack = {}, onSearchCleared = {}, diff --git a/app/src/screenshotTest/kotlin/org/fdroid/ui/settings/SettingsTest.kt b/app/src/screenshotTest/kotlin/org/fdroid/ui/settings/SettingsTest.kt index 609757239..bd077c012 100644 --- a/app/src/screenshotTest/kotlin/org/fdroid/ui/settings/SettingsTest.kt +++ b/app/src/screenshotTest/kotlin/org/fdroid/ui/settings/SettingsTest.kt @@ -15,7 +15,7 @@ import org.fdroid.ui.ScreenshotTest @Preview(showBackground = true, showSystemUi = true, heightDp = 1400) fun SettingsTest() = ScreenshotTest(showBottomBar = false) { - Settings(model = getSettingsModel(), isBigScreen = false, onSaveLogcat = {}, onBackClicked = {}) + Settings(model = getSettingsModel(), onSaveLogcat = {}, onBackClicked = {}) } @Composable @@ -28,7 +28,7 @@ fun SettingsTest() = ) fun SettingsNightTest() = ScreenshotTest(showBottomBar = false) { - Settings(model = getSettingsModel(), isBigScreen = false, onSaveLogcat = {}, onBackClicked = {}) + Settings(model = getSettingsModel(), onSaveLogcat = {}, onBackClicked = {}) } private fun getSettingsModel( diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/apps/MyAppsTestKt/MyAppsFullList_2ed8e27d_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/apps/MyAppsTestKt/MyAppsFullList_2ed8e27d_0.png index faaea403f..65f12ee8b 100644 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/apps/MyAppsTestKt/MyAppsFullList_2ed8e27d_0.png +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/apps/MyAppsTestKt/MyAppsFullList_2ed8e27d_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:97b2a9163570a5e6f61dac969115543bcf2b5bc6040b27ce0163d1d715093158 -size 155555 +oid sha256:1501c756d19f294b3f71ee089a1e728b3ade04b91372617248f68cb60aecfe1f +size 158114 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/apps/MyAppsTestKt/MyAppsInstalledAndIssues_2ed8e27d_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/apps/MyAppsTestKt/MyAppsInstalledAndIssues_2ed8e27d_0.png index e71c58d8e..309a6b33d 100644 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/apps/MyAppsTestKt/MyAppsInstalledAndIssues_2ed8e27d_0.png +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/apps/MyAppsTestKt/MyAppsInstalledAndIssues_2ed8e27d_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:818edd986a22692191d23dfa22f835929af64628be310f7c7f32af6cd134081d -size 112062 +oid sha256:619eb7e9478b45a8b1ada0b65335fad718cb728f500ab04c77bb292933df5c84 +size 114633 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/apps/MyAppsTestKt/MyAppsOnlyInstalledAppsAndNoInternet_2ed8e27d_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/apps/MyAppsTestKt/MyAppsOnlyInstalledAppsAndNoInternet_2ed8e27d_0.png index 51696a572..2505a0bb8 100644 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/apps/MyAppsTestKt/MyAppsOnlyInstalledAppsAndNoInternet_2ed8e27d_0.png +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/apps/MyAppsTestKt/MyAppsOnlyInstalledAppsAndNoInternet_2ed8e27d_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1f5e54e6f874f31f982de0d1889f0b6947fd78668389409e6b51f439e32d1f17 -size 65274 +oid sha256:037f0d24d270c8fb52ac88bff5f40c999ea11035d03e270b6fd7968ad24506a5 +size 67807 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/apps/MyAppsTestKt/MyAppsUpdatesOnlyAndNoInternet_2ed8e27d_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/apps/MyAppsTestKt/MyAppsUpdatesOnlyAndNoInternet_2ed8e27d_0.png index f7ac458d0..8774b310a 100644 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/apps/MyAppsTestKt/MyAppsUpdatesOnlyAndNoInternet_2ed8e27d_0.png +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/apps/MyAppsTestKt/MyAppsUpdatesOnlyAndNoInternet_2ed8e27d_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4ed3a7b54a24bcacca7dbe3a3d426e236f59958ed940f62fff651e00dd82c5fe -size 81105 +oid sha256:8c6ea083fcbe5e69a47e88498ab197b4eab85ab129750290bb634815cf9166b7 +size 83745 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/details/DetailsHeaderTestKt/DetailsHeaderDownloadingNightTest_3534351a_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/details/DetailsHeaderTestKt/DetailsHeaderDownloadingNightTest_3534351a_0.png index 71f6d66ae..b86ae526c 100644 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/details/DetailsHeaderTestKt/DetailsHeaderDownloadingNightTest_3534351a_0.png +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/details/DetailsHeaderTestKt/DetailsHeaderDownloadingNightTest_3534351a_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8bcaeed6aafb9767b7d1c9e04f1ea98cdd208b9c077a4857d2e8a933bef569c8 -size 46617 +oid sha256:92066e2671a0fa2733feb5701d540b612714b7f8f23b69133b0e4fc06a5b4a64 +size 46451 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/details/DetailsHeaderTestKt/DetailsHeaderDownloadingTest_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/details/DetailsHeaderTestKt/DetailsHeaderDownloadingTest_0.png index a20bef69b..aa655ebe4 100644 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/details/DetailsHeaderTestKt/DetailsHeaderDownloadingTest_0.png +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/details/DetailsHeaderTestKt/DetailsHeaderDownloadingTest_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ddc8762b99dd13e65805fa5ebdc1f14eb659ff8dc37237b0c13f1748996f8f8f -size 45990 +oid sha256:b7c985dfe300bc834da2b8bfc874c79ebcb5bbfc9adc42f19391f4c719a9ee4c +size 45829 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/discover/DiscoverTestKt/DiscoverFirstStartTest_2ed8e27d_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/discover/DiscoverTestKt/DiscoverFirstStartTest_2ed8e27d_0.png index 9c9b76c9a..a43f2b27d 100644 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/discover/DiscoverTestKt/DiscoverFirstStartTest_2ed8e27d_0.png +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/discover/DiscoverTestKt/DiscoverFirstStartTest_2ed8e27d_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6769563c16cb16a06752bb7aa66429ce9b3bda69fa4a7fb4232c8e837d62fe3b -size 52608 +oid sha256:e535a66f33e0313195434319f11049637bdf7a89d98ec8223c5323c738bb0042 +size 55346 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/discover/DiscoverTestKt/DiscoverNoEnabledReposTest_2ed8e27d_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/discover/DiscoverTestKt/DiscoverNoEnabledReposTest_2ed8e27d_0.png index a803fc829..24259be91 100644 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/discover/DiscoverTestKt/DiscoverNoEnabledReposTest_2ed8e27d_0.png +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/discover/DiscoverTestKt/DiscoverNoEnabledReposTest_2ed8e27d_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:406f894eba1d2dbad4b3f64f8db262b470c8d4c61f7889f7ad7110692f0438a0 -size 46396 +oid sha256:ee3d6bc540daebf569a1be2cb7de5c8e53478081baaddd68df7a855851703940 +size 48910 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/discover/DiscoverTestKt/DiscoverSmallBottomBarTest_1def2e7f_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/discover/DiscoverTestKt/DiscoverSmallBottomBarTest_1def2e7f_0.png deleted file mode 100644 index f3396d216..000000000 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/discover/DiscoverTestKt/DiscoverSmallBottomBarTest_1def2e7f_0.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60ae81af88e21da8a7feb43d9cbf111106c715789a93295e9c5d7dc05a627547 -size 156780 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/discover/DiscoverTestKt/DiscoverTest_2ed8e27d_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/discover/DiscoverTestKt/DiscoverTest_2ed8e27d_0.png index 4ef46af9e..2a344adb7 100644 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/discover/DiscoverTestKt/DiscoverTest_2ed8e27d_0.png +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/discover/DiscoverTestKt/DiscoverTest_2ed8e27d_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2485bf774cdbb291cac6288b617eba3bea65eeb3d6c723df526217b32e2fad57 -size 155874 +oid sha256:3bffaab8294637b504398af638e91187ff23640466f9775668ec00490436effe +size 151906 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/history/HistoryTestKt/HistoryEmptyDisabledTest_2ed8e27d_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/history/HistoryTestKt/HistoryEmptyDisabledTest_2ed8e27d_0.png index b81c139f0..5320f7102 100644 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/history/HistoryTestKt/HistoryEmptyDisabledTest_2ed8e27d_0.png +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/history/HistoryTestKt/HistoryEmptyDisabledTest_2ed8e27d_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:765dd2750bf6f69bd17e54f65d4954b82da43f30811efd9544532ff037f6a144 -size 49240 +oid sha256:28237ec38434fa636974d08cd6bc4bba31d26a90e8e1ae987116a2115e0478bb +size 49764 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/history/HistoryTestKt/HistoryEmptyTest_2ed8e27d_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/history/HistoryTestKt/HistoryEmptyTest_2ed8e27d_0.png index e23b33616..ae3643252 100644 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/history/HistoryTestKt/HistoryEmptyTest_2ed8e27d_0.png +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/history/HistoryTestKt/HistoryEmptyTest_2ed8e27d_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:841697f4533aa01aa76fdd4ad1906276d1c4cb94eb22afb4584c56512f2f75f4 -size 49333 +oid sha256:e7a2d550503deb71a2fddc0436313900d8f97c2c2413018e93ff81922b63acff +size 49879 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/history/HistoryTestKt/HistoryNightTest_1def2e7f_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/history/HistoryTestKt/HistoryNightTest_1def2e7f_0.png index f148e86b5..ef256acdc 100644 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/history/HistoryTestKt/HistoryNightTest_1def2e7f_0.png +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/history/HistoryTestKt/HistoryNightTest_1def2e7f_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:16486d4e51d86fcaebb8ed9890dd2a618c0899216e70e0d87f677feb7f446210 -size 56722 +oid sha256:0c490c338d630ee2fe39166723eaa73ee48527631422951eea68eb1067f2147d +size 57244 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/history/HistoryTestKt/HistoryPopulatedTest_2ed8e27d_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/history/HistoryTestKt/HistoryPopulatedTest_2ed8e27d_0.png index a17b915bf..62fd205f8 100644 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/history/HistoryTestKt/HistoryPopulatedTest_2ed8e27d_0.png +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/history/HistoryTestKt/HistoryPopulatedTest_2ed8e27d_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:44793ef002c2dd9c81ed25810baad89b7da6b0789f17f17b638ed874b45a8d3a -size 57063 +oid sha256:bb269ef10a0d4b43efb36e7ea43d62626e8bf942e7e27ac10a047aae9c9056e0 +size 57639 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/repositories/AddRepoTestKt/AddRepoAddingTest_2ed8e27d_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/repositories/AddRepoTestKt/AddRepoAddingTest_2ed8e27d_0.png index 0c05bbc51..7abd6885c 100644 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/repositories/AddRepoTestKt/AddRepoAddingTest_2ed8e27d_0.png +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/repositories/AddRepoTestKt/AddRepoAddingTest_2ed8e27d_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ab9a82e0bd93768d3c97e151d8cd2b284d670cb82c2411d0a216dce2fab56e41 -size 36871 +oid sha256:d06c7114be1f155ddf57352ae00ded89e27022c1c685cd2a1fce1973a990e5b7 +size 36489 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchEmptyStateTest_2ed8e27d_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchEmptyStateTest_2ed8e27d_0.png new file mode 100644 index 000000000..0737be26d --- /dev/null +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchEmptyStateTest_2ed8e27d_0.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6eb1c82199e7d0ace698bdc95b523bef51a761eaa22698dfefae3ff5f2419ca3 +size 56180 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchEmptyTest_2ed8e27d_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchEmptyTest_2ed8e27d_0.png index 7abb70188..90a354891 100644 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchEmptyTest_2ed8e27d_0.png +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchEmptyTest_2ed8e27d_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c97f31285c26e60b58f9aee6dd9c4517b0801f32df2e6e523753a20973d8eeda -size 19245 +oid sha256:b84731273d6b914154b20cd44c6a0ef56b6d5fd0815d0585e6d39da75b75760b +size 31966 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchLoadingTest_2ed8e27d_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchLoadingTest_2ed8e27d_0.png index 5b12e86d7..f4e8936d0 100644 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchLoadingTest_2ed8e27d_0.png +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchLoadingTest_2ed8e27d_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:198d32d7d27af34fc966958db1fd033fa4fc49db294b5ba52a3919ce0a5eee4e -size 24266 +oid sha256:45057a2f4a625328c888de722d85a141c87fa11a71e9b735fa8a1b1cb592387b +size 36852 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchNoResultsTest_2ed8e27d_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchNoResultsTest_2ed8e27d_0.png index 49d74eb44..95a75b1a7 100644 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchNoResultsTest_2ed8e27d_0.png +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchNoResultsTest_2ed8e27d_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5e5810b116406d8d826620ee27d4daccfedf29d6e26b95222fdce73f48250af7 -size 33494 +oid sha256:ceff828eeb1900ddb11aa1e031a6429ee6d635e95d18714e96ee936b69c1f1a0 +size 46075 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchOnlyCategoriesTest_2ed8e27d_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchOnlyCategoriesTest_2ed8e27d_0.png index 67a66c8df..5775e0cd5 100644 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchOnlyCategoriesTest_2ed8e27d_0.png +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchOnlyCategoriesTest_2ed8e27d_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7ae57048f9e4f87b3eaa17ed0690f831c26a19bda18ca8a84797782912c107db -size 64975 +oid sha256:70ee5992fbd5c9eb4373d0f348f6d742cc012468aa2474a263eb1dcf583b4c56 +size 77590 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchResultsNightTest_1def2e7f_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchResultsNightTest_1def2e7f_0.png index 48a4c7a8e..b3abfdc2b 100644 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchResultsNightTest_1def2e7f_0.png +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchResultsNightTest_1def2e7f_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:203e47a0d77a97d1f1008637fde7ef493eacc36b3bb0d35880f353e4a8bf1e09 -size 103221 +oid sha256:ce2fd6832bf854cabb19a7eb37bd060aa42ebc19d9ff472ed30385cee8c340b7 +size 115688 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchResultsTest_2ed8e27d_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchResultsTest_2ed8e27d_0.png index 3584aa6f9..fd90cb0ee 100644 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchResultsTest_2ed8e27d_0.png +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/search/GlobalSearchTestKt/GlobalSearchResultsTest_2ed8e27d_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0b65f5ee826e29411cfa981603de7ba1a14bf98d6f8780a96d31ab3c4395e88e -size 101535 +oid sha256:c0b51b789a143543034fbd2b6c77a3433e2b50f5b57674fb8a997519a133d9ba +size 113814 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/settings/SettingsTestKt/SettingsNightTest_58c50acd_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/settings/SettingsTestKt/SettingsNightTest_58c50acd_0.png index 1059e9767..eabf079a0 100644 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/settings/SettingsTestKt/SettingsNightTest_58c50acd_0.png +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/settings/SettingsTestKt/SettingsNightTest_58c50acd_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:71f406a178f4a466d27c9a1483046a249688370daeb95b15878729934ccee8af -size 235934 +oid sha256:153ff37f2aab19d3ca55d158d1a0157a29981f3da8e89271fa9ca4ef3bdb5df3 +size 217052 diff --git a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/settings/SettingsTestKt/SettingsTest_4fcdc4d2_0.png b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/settings/SettingsTestKt/SettingsTest_4fcdc4d2_0.png index 80bddd955..4d5013430 100644 --- a/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/settings/SettingsTestKt/SettingsTest_4fcdc4d2_0.png +++ b/app/src/screenshotTestBasicDefaultDebug/reference/org/fdroid/ui/settings/SettingsTestKt/SettingsTest_4fcdc4d2_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8ab1c8e0bdc1c1a148a287020d299b08d060dc8315068d3f9ca5fd412f21227e -size 235866 +oid sha256:081a2b6280f74393aae70752da97ce3e0629505d98dee69425095ec018140c27 +size 216908 diff --git a/app/src/test/java/org/fdroid/search/SearchHistoryManagerTest.kt b/app/src/test/java/org/fdroid/search/SearchHistoryManagerTest.kt new file mode 100644 index 000000000..0e6c8f41d --- /dev/null +++ b/app/src/test/java/org/fdroid/search/SearchHistoryManagerTest.kt @@ -0,0 +1,133 @@ +package org.fdroid.search + +import android.content.Context +import android.content.Context.MODE_PRIVATE +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify +import java.io.FileNotFoundException +import java.io.FileOutputStream +import kotlin.test.assertEquals +import kotlin.test.assertTrue +import kotlinx.serialization.json.Json +import org.junit.Rule +import org.junit.Test +import org.junit.rules.TemporaryFolder + +internal class SearchHistoryManagerTest { + + @get:Rule val tempFolder = TemporaryFolder() + + private val context: Context = mockk() + private val manager = SearchHistoryManager(context) + + @Test + fun testGetSavedSearchesSortedByNewest() { + val file = tempFolder.newFile() + val unsorted = + listOf( + SavedSearch(time = 10L, query = "a"), + SavedSearch(time = 30L, query = "c"), + SavedSearch(time = 20L, query = "b"), + ) + file.writeText(Json.encodeToString(unsorted)) + every { context.openFileInput(any()) } answers { file.inputStream() } + + val saved = manager.getSavedSearches() + + assertEquals(listOf(30L, 20L, 10L), saved.map { it.time }) + assertEquals(listOf("c", "b", "a"), saved.map { it.query }) + } + + @Test + fun testSaveGetAndClear() { + val file = tempFolder.newFile() + file.writeText("[]") + every { context.openFileInput(any()) } answers { file.inputStream() } + every { context.openFileOutput(any(), MODE_PRIVATE) } answers { FileOutputStream(file, false) } + every { context.deleteFile(any()) } returns true + + val savedFromSave = manager.saveSearchQuery("foo") + val savedFromDisk = manager.getSavedSearches() + + assertEquals(1, savedFromSave.size) + assertEquals("foo", savedFromSave.first().query) + assertEquals(1, savedFromDisk.size) + assertEquals("foo", savedFromDisk.first().query) + + assertTrue(manager.clearAll()) + verify { context.deleteFile(any()) } + } + + @Test + fun testSaveSearchQueryDeduplicatesExistingQuery() { + val file = tempFolder.newFile() + val existing = + listOf(SavedSearch(time = 200L, query = "foo"), SavedSearch(time = 100L, query = "bar")) + file.writeText(Json.encodeToString(existing)) + every { context.openFileInput(any()) } answers { file.inputStream() } + every { context.openFileOutput(any(), MODE_PRIVATE) } answers { FileOutputStream(file, false) } + + val saved = manager.saveSearchQuery("foo") + + assertEquals(2, saved.size) + assertEquals(1, saved.count { it.query == "foo" }) + assertEquals(1, saved.count { it.query == "bar" }) + } + + @Test + fun testSaveSearchQueryCapsSavedEntriesAtMax() { + val maxSearches = 3 + val cappedManager = SearchHistoryManager(context, maxSearches) + val file = tempFolder.newFile() + val existing = + listOf( + SavedSearch(time = 400L, query = "q4"), + SavedSearch(time = 300L, query = "q3"), + SavedSearch(time = 200L, query = "q2"), + SavedSearch(time = 100L, query = "q1"), + ) + file.writeText(Json.encodeToString(existing)) + every { context.openFileInput(any()) } answers { file.inputStream() } + every { context.openFileOutput(any(), MODE_PRIVATE) } answers { FileOutputStream(file, false) } + + val savedFromSave = cappedManager.saveSearchQuery("new-query") + val savedFromDisk = cappedManager.getSavedSearches() + + assertEquals(maxSearches, savedFromSave.size) + assertEquals(maxSearches, savedFromDisk.size) + assertTrue(savedFromSave.any { it.query == "new-query" }) + assertTrue(savedFromDisk.any { it.query == "new-query" }) + } + + @Test + fun testGetSavedSearchesReturnsEmptyForMissingFile() { + every { context.openFileInput(any()) } throws FileNotFoundException() + + val saved = manager.getSavedSearches() + + assertTrue(saved.isEmpty()) + verify(exactly = 0) { context.deleteFile(any()) } + } + + @Test + fun testGetSavedSearchesCorruptFileClearsAndReturnsEmpty() { + val file = tempFolder.newFile() + file.writeText("not valid json") + every { context.openFileInput(any()) } answers { file.inputStream() } + every { context.deleteFile(any()) } returns true + + val saved = manager.getSavedSearches() + + assertTrue(saved.isEmpty()) + verify(exactly = 1) { context.deleteFile(any()) } + } + + @Test + fun testClearAllReturnsFalseWhenDeleteFails() { + every { context.deleteFile(any()) } returns false + + assertEquals(false, manager.clearAll()) + verify(exactly = 1) { context.deleteFile(any()) } + } +} diff --git a/app/src/test/java/org/fdroid/search/SearchManagerTest.kt b/app/src/test/java/org/fdroid/search/SearchManagerTest.kt new file mode 100644 index 000000000..9fb8515d7 --- /dev/null +++ b/app/src/test/java/org/fdroid/search/SearchManagerTest.kt @@ -0,0 +1,283 @@ +package org.fdroid.search + +import android.database.sqlite.SQLiteException +import androidx.arch.core.executor.testing.InstantTaskExecutorRule +import androidx.lifecycle.MutableLiveData +import io.mockk.coEvery +import io.mockk.every +import io.mockk.mockk +import io.mockk.slot +import io.mockk.verify +import kotlin.test.assertEquals +import kotlin.test.assertFailsWith +import kotlin.test.assertIs +import kotlin.test.assertNotNull +import kotlin.test.assertNull +import kotlin.test.assertTrue +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.launch +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.advanceTimeBy +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.test.setMain +import org.fdroid.database.AppDao +import org.fdroid.database.AppSearchItem +import org.fdroid.database.Category +import org.fdroid.database.FDroidDatabase +import org.fdroid.database.Repository +import org.fdroid.database.RepositoryDao +import org.fdroid.download.PackageName +import org.fdroid.index.RepoManager +import org.fdroid.install.InstalledAppsCache +import org.fdroid.settings.SettingsManager +import org.junit.Rule +import org.junit.Test + +@OptIn(ExperimentalCoroutinesApi::class) +internal class SearchManagerTest { + + @get:Rule + val instantTaskExecutorRule = InstantTaskExecutorRule() + + private val db: FDroidDatabase = mockk() + private val appDao: AppDao = mockk() + private val repositoryDao: RepositoryDao = mockk() + private val repoManager: RepoManager = mockk() + private val settingsManager: SettingsManager = mockk() + private val installedAppsCache: InstalledAppsCache = mockk() + private val searchHistoryManager: SearchHistoryManager = mockk() + private val categoriesLiveData = MutableLiveData>(emptyList()) + + private val repo: Repository = mockk(relaxed = true) + + init { + Dispatchers.setMain(Dispatchers.Unconfined) + + every { db.getAppDao() } returns appDao + every { db.getRepositoryDao() } returns repositoryDao + every { repositoryDao.getLiveCategories() } returns categoriesLiveData + every { settingsManager.proxyConfig } returns null + every { repoManager.getRepository(any()) } returns repo + every { installedAppsCache.isInstalled(any()) } returns false + every { searchHistoryManager.getSavedSearches() } returns emptyList() + every { searchHistoryManager.saveSearchQuery(any()) } answers + { + listOf(SavedSearch(time = 1L, query = firstArg())) + } + every { searchHistoryManager.clearAll() } returns true + } + + private val searchManager = + SearchManager( + db = db, + repoManager = repoManager, + settingsManager = settingsManager, + installedAppsCache = installedAppsCache, + searchHistoryManager = searchHistoryManager, + ioDispatcher = Dispatchers.Unconfined, + ) + + @Test + fun searchCrashMeThrows() = runTest { + assertFailsWith { searchManager.search("CrashMe") } + } + + @Test + fun searchBuildsPrefixQueryForSingleWord() = runTest { + val querySlot = slot() + coEvery { appDao.getAppSearchItems(capture(querySlot)) } returns emptyList() + + searchManager.search("foo") + + assertEquals("foo*", querySlot.captured) + } + + @Test + fun searchBuildsComplexQueryForMultipleWordsAndSanitizesQuotes() = runTest { + val querySlot = slot() + coEvery { appDao.getAppSearchItems(capture(querySlot)) } returns emptyList() + + searchManager.search("foo \"bar\"") + + assertEquals("foo* bar* OR foobar* OR \"foo* bar*\"", querySlot.captured) + } + + @Test + fun searchBuildsCjkQueryBySplittingIdeographicCharacters() = runTest { + val querySlot = slot() + coEvery { appDao.getAppSearchItems(capture(querySlot)) } returns emptyList() + + searchManager.search("測試") + + assertEquals("測* 試* OR \"測\u200B試*\" OR 測試*", querySlot.captured) + } + + @Test + fun searchBuildsMultiWordCjkQuery() = runTest { + val querySlot = slot() + coEvery { appDao.getAppSearchItems(capture(querySlot)) } returns emptyList() + + searchManager.search("測試 艾星") + + assertEquals( + "測* 試* 艾* 星* OR \"測\u200B試*\" \"艾\u200B星*\" OR 測試* 艾星*", + querySlot.captured + ) + } + + @Test + fun searchUsesLocalIconForInstalledApps() = runTest { + val item = buildSearchItem(packageName = "com.example.installed", repoId = 1L) + coEvery { appDao.getAppSearchItems(any()) } returns listOf(item) + every { installedAppsCache.isInstalled("com.example.installed") } returns true + + searchManager.search("installed") + + val results = searchManager.searchResults.value + assertNotNull(results) + assertEquals(1, results.apps.size) + val listItem = results.apps.first() + assertTrue(listItem.isInstalled) + assertIs(listItem.iconModel) + assertEquals("com.example.installed", listItem.iconModel.packageName) + } + + @Test + fun searchIsEmptyWhenThrowsSQLiteException() = runTest { + coEvery { appDao.getAppSearchItems(any()) } throws SQLiteException("boom") + + searchManager.search("boom") + + val results = searchManager.searchResults.value + assertNotNull(results) + assertTrue(results.apps.isEmpty()) + } + + @Test + fun searchFiltersCategoriesUsingNormalizedMatching() = runTest { + val category = Category(repoId = 1L, id = "coffee", name = mapOf("en-US" to "Café")) + categoriesLiveData.value = listOf(category) + coEvery { appDao.getAppSearchItems(any()) } returns emptyList() + + searchManager.search("cafe") + + val results = searchManager.searchResults.value + assertNotNull(results) + assertEquals(1, results.categories.size) + assertEquals("Café", results.categories.first().name) + } + + @Test + fun onSearchClearedResetsResultsToNull() = runTest { + coEvery { appDao.getAppSearchItems(any()) } returns emptyList() + + searchManager.search("foo") + assertNotNull(searchManager.searchResults.value) + + searchManager.onSearchCleared() + + assertNull(searchManager.searchResults.value) + } + + @Test + fun searchSavesQueryInHistory() = runTest { + val expected = listOf(SavedSearch(time = 999L, query = "foo")) + every { searchHistoryManager.saveSearchQuery("foo") } returns expected + coEvery { appDao.getAppSearchItems(any()) } returns emptyList() + + advanceUntilIdle() + searchManager.search("foo") + + verify(exactly = 1) { searchHistoryManager.saveSearchQuery("foo") } + assertEquals(expected, searchManager.savedSearches.value) + } + + @Test + fun searchDebouncesAndSavesOnlyAfterDelay() = runTest { + val searchManager = SearchManager( + db = db, + repoManager = repoManager, + settingsManager = settingsManager, + installedAppsCache = installedAppsCache, + searchHistoryManager = searchHistoryManager, + ioDispatcher = StandardTestDispatcher(testScheduler), + ) + + val expected = listOf(SavedSearch(time = 999L, query = "foo")) + every { searchHistoryManager.saveSearchQuery("foo") } returns expected + coEvery { appDao.getAppSearchItems(any()) } returns emptyList() + + advanceUntilIdle() + + val searchJob = launch { searchManager.search("foo") } + runCurrent() + verify(exactly = 0) { searchHistoryManager.saveSearchQuery(any()) } + + advanceTimeBy(1499) + runCurrent() + verify(exactly = 0) { searchHistoryManager.saveSearchQuery(any()) } + + advanceTimeBy(1) + runCurrent() + verify(exactly = 1) { searchHistoryManager.saveSearchQuery("foo") } + assertEquals(expected, searchManager.savedSearches.value) + + searchJob.join() + } + + @Test + fun onClearSearchHistoryClearsAfterDelete() = runTest { + val initial = listOf(SavedSearch(time = 123L, query = "first")) + every { searchHistoryManager.getSavedSearches() } returns initial + every { searchHistoryManager.clearAll() } returns true + + searchManager.onClearSearchHistory() + + verify(exactly = 1) { searchHistoryManager.clearAll() } + assertEquals(emptyList(), searchManager.savedSearches.value) + } + + @Test + fun onClearSearchHistoryKeepsSavedSearchesWhenDeleteFails() = runTest { + val searchManager = SearchManager( + db = db, + repoManager = repoManager, + settingsManager = settingsManager, + installedAppsCache = installedAppsCache, + searchHistoryManager = searchHistoryManager, + ioDispatcher = StandardTestDispatcher(testScheduler), + ) + + val initial = listOf(SavedSearch(time = 123L, query = "first")) + every { searchHistoryManager.getSavedSearches() } returns initial + every { searchHistoryManager.clearAll() } returns false + + advanceUntilIdle() + searchManager.onClearSearchHistory() + + verify(exactly = 1) { searchHistoryManager.clearAll() } + assertEquals(initial, searchManager.savedSearches.value) + } + + private fun buildSearchItem( + packageName: String, + repoId: Long = 1L, + appName: String = "Test App", + summary: String = "Test Summary", + lastUpdated: Long = 1234L, + categories: List? = null, + ): AppSearchItem { + val item: AppSearchItem = mockk() + every { item.repoId } returns repoId + every { item.packageName } returns packageName + every { item.lastUpdated } returns lastUpdated + every { item.name } returns mapOf("en-US" to appName) + every { item.summary } returns mapOf("en-US" to summary) + every { item.categories } returns categories + every { item.getIcon(any()) } returns null + return item + } +} diff --git a/app/src/test/java/org/fdroid/ui/lists/AppListSearchTest.kt b/app/src/test/java/org/fdroid/ui/lists/AppListSearchTest.kt index 0b41fbb54..5ff23b1c5 100644 --- a/app/src/test/java/org/fdroid/ui/lists/AppListSearchTest.kt +++ b/app/src/test/java/org/fdroid/ui/lists/AppListSearchTest.kt @@ -26,7 +26,7 @@ import org.robolectric.RobolectricTestRunner * This is the in-memory [String.contains]-based counterpart of AppSearchItemsTest, which covers the * DB FTS4 path. * - * [AppListPresenter] uses [org.fdroid.ui.search.SearchHelper.fixQuery] on the incoming query before + * [AppListPresenter] uses [org.fdroid.search.SearchHelper.fixQuery] on the incoming query before * matching, which: * - strips diacritics via NFKD normalization (enables diacritic-insensitive search), and * - inserts zero-width spaces (U+200B) after each ideographic character (enables CJK matching diff --git a/app/src/test/java/org/fdroid/ui/search/SearchManagerTest.kt b/app/src/test/java/org/fdroid/ui/search/SearchManagerTest.kt deleted file mode 100644 index 73d5d9f5c..000000000 --- a/app/src/test/java/org/fdroid/ui/search/SearchManagerTest.kt +++ /dev/null @@ -1,185 +0,0 @@ -package org.fdroid.ui.search - -import android.database.sqlite.SQLiteException -import androidx.arch.core.executor.testing.InstantTaskExecutorRule -import androidx.lifecycle.MutableLiveData -import io.mockk.coEvery -import io.mockk.every -import io.mockk.mockk -import io.mockk.slot -import kotlin.test.assertEquals -import kotlin.test.assertFailsWith -import kotlin.test.assertIs -import kotlin.test.assertNotNull -import kotlin.test.assertNull -import kotlin.test.assertTrue -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.runTest -import kotlinx.coroutines.test.setMain -import org.fdroid.database.AppDao -import org.fdroid.database.AppSearchItem -import org.fdroid.database.Category -import org.fdroid.database.FDroidDatabase -import org.fdroid.database.Repository -import org.fdroid.database.RepositoryDao -import org.fdroid.download.PackageName -import org.fdroid.index.RepoManager -import org.fdroid.install.InstalledAppsCache -import org.fdroid.settings.SettingsManager -import org.junit.Rule -import org.junit.Test - -@OptIn(ExperimentalCoroutinesApi::class) -internal class SearchManagerTest { - - @get:Rule val instantTaskExecutorRule = InstantTaskExecutorRule() - - private val db: FDroidDatabase = mockk() - private val appDao: AppDao = mockk() - private val repositoryDao: RepositoryDao = mockk() - private val repoManager: RepoManager = mockk() - private val settingsManager: SettingsManager = mockk() - private val installedAppsCache: InstalledAppsCache = mockk() - private val categoriesLiveData = MutableLiveData>(emptyList()) - - private val repo: Repository = mockk(relaxed = true) - - init { - Dispatchers.setMain(Dispatchers.Unconfined) - - every { db.getAppDao() } returns appDao - every { db.getRepositoryDao() } returns repositoryDao - every { repositoryDao.getLiveCategories() } returns categoriesLiveData - every { settingsManager.proxyConfig } returns null - every { repoManager.getRepository(any()) } returns repo - every { installedAppsCache.isInstalled(any()) } returns false - } - - private val searchManager = - SearchManager( - db = db, - repoManager = repoManager, - settingsManager = settingsManager, - installedAppsCache = installedAppsCache, - ioDispatcher = Dispatchers.Unconfined, - ) - - @Test - fun searchCrashMeThrows() = runTest { - assertFailsWith { searchManager.search("CrashMe") } - } - - @Test - fun searchBuildsPrefixQueryForSingleWord() = runTest { - val querySlot = slot() - coEvery { appDao.getAppSearchItems(capture(querySlot)) } returns emptyList() - - searchManager.search("foo") - - assertEquals("foo*", querySlot.captured) - } - - @Test - fun searchBuildsComplexQueryForMultipleWordsAndSanitizesQuotes() = runTest { - val querySlot = slot() - coEvery { appDao.getAppSearchItems(capture(querySlot)) } returns emptyList() - - searchManager.search("foo \"bar\"") - - assertEquals("foo* bar* OR foobar* OR \"foo* bar*\"", querySlot.captured) - } - - @Test - fun searchBuildsCjkQueryBySplittingIdeographicCharacters() = runTest { - val querySlot = slot() - coEvery { appDao.getAppSearchItems(capture(querySlot)) } returns emptyList() - - searchManager.search("測試") - - assertEquals("測* 試* OR \"測\u200B試*\" OR 測試*", querySlot.captured) - } - - @Test - fun searchBuildsMultiWordCjkQuery() = runTest { - val querySlot = slot() - coEvery { appDao.getAppSearchItems(capture(querySlot)) } returns emptyList() - - searchManager.search("測試 艾星") - - assertEquals("測* 試* 艾* 星* OR \"測\u200B試*\" \"艾\u200B星*\" OR 測試* 艾星*", querySlot.captured) - } - - @Test - fun searchUsesLocalIconForInstalledApps() = runTest { - val item = buildSearchItem(packageName = "com.example.installed", repoId = 1L) - coEvery { appDao.getAppSearchItems(any()) } returns listOf(item) - every { installedAppsCache.isInstalled("com.example.installed") } returns true - - searchManager.search("installed") - - val results = searchManager.searchResults.value - assertNotNull(results) - assertEquals(1, results.apps.size) - val listItem = results.apps.first() - assertTrue(listItem.isInstalled) - assertIs(listItem.iconModel) - assertEquals("com.example.installed", listItem.iconModel.packageName) - } - - @Test - fun searchIsEmptyWhenThrowsSQLiteException() = runTest { - coEvery { appDao.getAppSearchItems(any()) } throws SQLiteException("boom") - - searchManager.search("boom") - - val results = searchManager.searchResults.value - assertNotNull(results) - assertTrue(results.apps.isEmpty()) - } - - @Test - fun searchFiltersCategoriesUsingNormalizedMatching() = runTest { - val category = Category(repoId = 1L, id = "coffee", name = mapOf("en-US" to "Café")) - categoriesLiveData.value = listOf(category) - coEvery { appDao.getAppSearchItems(any()) } returns emptyList() - - searchManager.search("cafe") - - val results = searchManager.searchResults.value - assertNotNull(results) - assertEquals(1, results.categories.size) - assertEquals("Café", results.categories.first().name) - } - - @Test - fun onSearchClearedResetsResultsToNull() = runTest { - coEvery { appDao.getAppSearchItems(any()) } returns emptyList() - - searchManager.search("foo") - assertNotNull(searchManager.searchResults.value) - - searchManager.onSearchCleared() - - assertNull(searchManager.searchResults.value) - } - - private fun buildSearchItem( - packageName: String, - repoId: Long = 1L, - appName: String = "Test App", - summary: String = "Test Summary", - lastUpdated: Long = 1234L, - categories: List? = null, - ): AppSearchItem { - val item: AppSearchItem = mockk() - every { item.repoId } returns repoId - every { item.packageName } returns packageName - every { item.lastUpdated } returns lastUpdated - every { item.name } returns mapOf("en-US" to appName) - every { item.summary } returns mapOf("en-US" to summary) - every { item.categories } returns categories - every { item.getIcon(any()) } returns null - return item - } -} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index aa1bd1e20..a19e13c91 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -43,7 +43,7 @@ androidxActivityCompose = "1.13.0" accompanistDrawablepainter = "0.37.3" # navigation3 -nav3Core = "1.0.1" +nav3Core = "1.1.0-rc01" lifecycleViewmodelNav3 = "2.10.0" material3AdaptiveNav3 = "1.0.0-alpha03" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 9ea885056..efecf23a6 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -1203,11 +1203,21 @@ + + + + + + + + + + diff --git a/libs/database/src/main/java/org/fdroid/index/RepoManager.kt b/libs/database/src/main/java/org/fdroid/index/RepoManager.kt index 5cf0c1904..567953511 100644 --- a/libs/database/src/main/java/org/fdroid/index/RepoManager.kt +++ b/libs/database/src/main/java/org/fdroid/index/RepoManager.kt @@ -188,7 +188,13 @@ constructor( if (addedRepo != null) withContext(Dispatchers.Main) { // as soon as the list has loaded, it should never be null - _repositoriesState.update { it!!.toMutableList().apply { add(addedRepo) } } + _repositoriesState.update { repos -> + if (repos!!.none { it.repoId == addedRepo.repoId }) { + repos.toMutableList().apply { add(addedRepo) } + } else { + repos + } + } } } } diff --git a/libs/database/src/main/java/org/fdroid/repo/RepoAdder.kt b/libs/database/src/main/java/org/fdroid/repo/RepoAdder.kt index db05d980b..c0ee209b7 100644 --- a/libs/database/src/main/java/org/fdroid/repo/RepoAdder.kt +++ b/libs/database/src/main/java/org/fdroid/repo/RepoAdder.kt @@ -19,6 +19,7 @@ import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.Job +import kotlinx.coroutines.cancelAndJoin import kotlinx.coroutines.currentCoroutineContext import kotlinx.coroutines.ensureActive import kotlinx.coroutines.flow.MutableStateFlow @@ -151,6 +152,7 @@ internal class RepoAdder( var receivedRepo: Repository? = null val apps = ArrayList() var fetchResult: FetchResult? = null + val activeContext = currentCoroutineContext() val receiver = object : RepoPreviewReceiver { @@ -164,18 +166,18 @@ internal class RepoAdder( ) } fetchResult = getFetchResult(fetchUrl, repo) - coroutineContext.ensureActive() // ensure active before updating state + activeContext.ensureActive() // ensure active before updating state addRepoState.value = Fetching(fetchUrl, receivedRepo, apps.toList(), fetchResult) } override fun onAppReceived(app: AppOverviewItem) { apps.add(app) - coroutineContext.ensureActive() // ensure active before updating state + activeContext.ensureActive() // ensure active before updating state addRepoState.value = Fetching(fetchUrl, receivedRepo, apps.toList(), fetchResult) } } // set a state early, so the ui can show progress animation - coroutineContext.ensureActive() // ensure active before updating state + activeContext.ensureActive() // ensure active before updating state addRepoState.value = Fetching(fetchUrl, receivedRepo, apps, fetchResult) // try fetching repo with v2 format first and fallback to v1 @@ -201,7 +203,7 @@ internal class RepoAdder( } // set final result val finalRepo = receivedRepo - coroutineContext.ensureActive() // ensure active before updating state + activeContext.ensureActive() // ensure active before updating state if (finalRepo == null) { onError(AddRepoError(INVALID_INDEX)) } else { @@ -280,18 +282,29 @@ internal class RepoAdder( } @WorkerThread - internal fun addFetchedRepository(): Repository? { + internal suspend fun addFetchedRepository(): Repository? { + return try { + addFetchedRepositoryInt() + } catch (e: Exception) { + addRepoState.value = AddRepoError(IO_ERROR, e) + return null + } + } + + @WorkerThread + private suspend fun addFetchedRepositoryInt(): Repository? { // first cancel fetch preview job, so it stops emitting new states, // screwing up the atomicity of getAndUpdate() below. - fetchJob?.cancel() + fetchJob?.cancelAndJoin() // get current state before changing it // prevent double calls (e.g. caused by double tapping a UI button) - val state = - addRepoState.getAndUpdate { - log.info { "Previous state was $it" } - Adding - } as? Fetching ?: error("Unexpected previous state") + val state = addRepoState.getAndUpdate { Adding } + if (state is Adding) { + log.warn { "Already adding a repo, ignoring call to addFetchedRepository()." } + return null + } + state as? Fetching ?: error("Unexpected previous state: $state") log.info { "Moved to state ${addRepoState.value}, cancelling preview job..." } val repo = state.receivedRepo ?: throw IllegalStateException("No repo: ${addRepoState.value}") diff --git a/libs/database/src/test/java/org/fdroid/repo/RepoAdderTest.kt b/libs/database/src/test/java/org/fdroid/repo/RepoAdderTest.kt index b4a94ab09..d851e3b49 100644 --- a/libs/database/src/test/java/org/fdroid/repo/RepoAdderTest.kt +++ b/libs/database/src/test/java/org/fdroid/repo/RepoAdderTest.kt @@ -24,7 +24,6 @@ import java.security.DigestInputStream import java.security.MessageDigest import java.util.concurrent.Callable import kotlin.test.assertEquals -import kotlin.test.assertFailsWith import kotlin.test.assertFalse import kotlin.test.assertIs import kotlin.test.assertNull @@ -429,7 +428,9 @@ internal class RepoAdderTest { expectMinRepoPreview(repoName, url, expectedFetchResult) - assertFailsWith { repoAdder.addFetchedRepository() } + assertNull(repoAdder.addFetchedRepository()) + assertIs(repoAdder.addRepoState.value) + assertIs((repoAdder.addRepoState.value as AddRepoError).exception) } @Test diff --git a/libs/download/src/commonTest/kotlin/org/fdroid/download/HttpManagerIntegrationTest.kt b/libs/download/src/commonTest/kotlin/org/fdroid/download/HttpManagerIntegrationTest.kt index 0126fbff1..59d2fb665 100644 --- a/libs/download/src/commonTest/kotlin/org/fdroid/download/HttpManagerIntegrationTest.kt +++ b/libs/download/src/commonTest/kotlin/org/fdroid/download/HttpManagerIntegrationTest.kt @@ -2,6 +2,7 @@ package org.fdroid.download import io.ktor.client.engine.ProxyBuilder import io.ktor.http.Url +import kotlin.test.Ignore import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertFailsWith @@ -9,6 +10,7 @@ import kotlinx.io.IOException import org.fdroid.getRandomString import org.fdroid.runSuspend +@Ignore("Fails on SDK 24 CI because of letsencrypt certs or cloudflare forced compression") class HttpManagerIntegrationTest { private val userAgent = getRandomString() diff --git a/metadata/en-US/changelogs/2000008.txt b/metadata/en-US/changelogs/2000008.txt new file mode 100644 index 000000000..fe298a61e --- /dev/null +++ b/metadata/en-US/changelogs/2000008.txt @@ -0,0 +1,8 @@ +* UI rewritten from scratch with Kotlin compose (except nearby) +* improved search, also searching in descriptions and translations +* easier to discover new apps, also highlighting the most downloaded ones +* installation approval *before* downloading (if supported) +* multiple updates/downloads at the same time +* notifying user of issues with apps (e.g. signing key changed) +* optional Material You color theme +* improved filtering of app lists diff --git a/src/basic/fastlane/metadata/android/ar/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/ar/changelogs/2000008.txt similarity index 100% rename from src/basic/fastlane/metadata/android/ar/changelogs/2000007.txt rename to src/basic/fastlane/metadata/android/ar/changelogs/2000008.txt diff --git a/src/basic/fastlane/metadata/android/ar/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/ar/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..2ed186bf5 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ar/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2913d39b6abcccc680b6e7222ee54e352f8045027e6b94ba3ca748caf7aac46 +size 109126 diff --git a/src/basic/fastlane/metadata/android/ar/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/ar/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..85cf76dfd --- /dev/null +++ b/src/basic/fastlane/metadata/android/ar/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02e5843b1d64cd37f88dda07351a7c0b73eb963117eb3831336cb844d700033a +size 87015 diff --git a/src/basic/fastlane/metadata/android/ar/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/ar/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..6c71aaff4 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ar/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2efb23e2904db105ca379fa34ab9fd269d89da9fb5ccf0308bd8b3205a782101 +size 68273 diff --git a/src/basic/fastlane/metadata/android/ar/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/ar/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..280ebc818 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ar/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dfcb41128b9073adc03404d9377595fde2319a96d8700f09459540b2d2a31e65 +size 183860 diff --git a/src/basic/fastlane/metadata/android/ast/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/ast/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..072a33a05 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ast/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ebc819226abd72e308e85629b2648fb8988f0b04d69ceaed1a0b29b9e7e1cd4 +size 114041 diff --git a/src/basic/fastlane/metadata/android/ast/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/ast/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..e3551cff0 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ast/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5fc72cacc8d109a13aaf57dd4fe1c771fdc47c5af1e40f0b1067f10991aae3d7 +size 82989 diff --git a/src/basic/fastlane/metadata/android/ast/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/ast/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..800797903 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ast/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23d61581f306f61dee4dc2b0be0d55ee4b139383b30388f6027ef8257ba9fbdc +size 74477 diff --git a/src/basic/fastlane/metadata/android/ast/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/ast/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..afbe05de5 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ast/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9e4a1070e68c6573a10374214d5e1856fd18598cf2497afcafd672669ff1e57 +size 183894 diff --git a/src/basic/fastlane/metadata/android/be/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/be/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..3d021d5a3 --- /dev/null +++ b/src/basic/fastlane/metadata/android/be/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7763731dee15da6f7eacaa8eec42a224a973ccc47c686a6ca1686672197bf63 +size 113540 diff --git a/src/basic/fastlane/metadata/android/be/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/be/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..1b96981a1 --- /dev/null +++ b/src/basic/fastlane/metadata/android/be/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a8cc7a9659cf4402bded62c0b0a49617f895790b9a67249c22a329290613c6f +size 84207 diff --git a/src/basic/fastlane/metadata/android/be/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/be/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..5d680709e --- /dev/null +++ b/src/basic/fastlane/metadata/android/be/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1580b1371098f9988eec12c417d89cd6a4e40d6cbd4320923552d0d675b98f1 +size 73194 diff --git a/src/basic/fastlane/metadata/android/be/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/be/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..2a84d5e87 --- /dev/null +++ b/src/basic/fastlane/metadata/android/be/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c1f807665c2498250e68b50e67f243ded5440b8f164a12f602e7cfdd25df2e6 +size 184778 diff --git a/src/basic/fastlane/metadata/android/bg/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/bg/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..3a24d332e --- /dev/null +++ b/src/basic/fastlane/metadata/android/bg/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73306761f019d03bc3bd0cf774c8bd1b0f0200efc5f64e825ee39140cd29fe92 +size 114235 diff --git a/src/basic/fastlane/metadata/android/bg/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/bg/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..6c1c3f059 --- /dev/null +++ b/src/basic/fastlane/metadata/android/bg/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a48274f1b8d53c73d70f5e1aa0aeb7decc39ad1c6d239f0a396aab7867459ff8 +size 85570 diff --git a/src/basic/fastlane/metadata/android/bg/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/bg/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..ede2032a1 --- /dev/null +++ b/src/basic/fastlane/metadata/android/bg/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e62bc29ccc5df088efb0d00cbdc9d5dac29b03ae90d1eb2d2f96443cc5747f29 +size 75460 diff --git a/src/basic/fastlane/metadata/android/bg/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/bg/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..d512e6ecc --- /dev/null +++ b/src/basic/fastlane/metadata/android/bg/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:09d8c66e394d3dbd709a8267f7fc3c731514ca585c94b1749e6ee2313f9689e2 +size 186268 diff --git a/src/basic/fastlane/metadata/android/bn/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/bn/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..5d79ce0d8 --- /dev/null +++ b/src/basic/fastlane/metadata/android/bn/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2702347828af531d4dfa410b941e9636af607fcd8ed4b6b32b8b8aea037dc108 +size 116040 diff --git a/src/basic/fastlane/metadata/android/bn/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/bn/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..0d9e01b57 --- /dev/null +++ b/src/basic/fastlane/metadata/android/bn/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0631347a6cddade40c5d51391235c326e7a0eb06a45e74942ae131b3b349767c +size 83749 diff --git a/src/basic/fastlane/metadata/android/bn/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/bn/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..28898aa92 --- /dev/null +++ b/src/basic/fastlane/metadata/android/bn/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c8e46ba9c90bd97553665f3b434113cea164a138b1951de13e4e84e18dce7ab3 +size 78853 diff --git a/src/basic/fastlane/metadata/android/bn/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/bn/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..d36febaaa --- /dev/null +++ b/src/basic/fastlane/metadata/android/bn/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:195fdef84ebbb83e548d93eb1359221cc4bf4c0d644f4ebb97efb0b377e89d7b +size 185169 diff --git a/src/basic/fastlane/metadata/android/ca/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/ca/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..9ac8017a6 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ca/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d56e8ee8c9d2dca0d2462ce460499deead92fc874fa5cf9c66a958453bfc1be2 +size 116144 diff --git a/src/basic/fastlane/metadata/android/ca/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/ca/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..d323de673 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ca/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a2cbff9775930cd78afe463db22724987166b647179c23ac4da1970038ed91be +size 85464 diff --git a/src/basic/fastlane/metadata/android/ca/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/ca/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..61d25fc15 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ca/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f92ed9cceed8101adf4fc839e58ca7b2e5ea2c77a6c8e693389d4a1d8ce3e55 +size 77192 diff --git a/src/basic/fastlane/metadata/android/ca/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/ca/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..42f5e86a1 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ca/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92259d235549e2223fffa2436e226f28e0235538113d3597d51754f727e8dffe +size 185172 diff --git a/src/basic/fastlane/metadata/android/cs/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/cs/changelogs/2000008.txt similarity index 100% rename from src/basic/fastlane/metadata/android/cs/changelogs/2000007.txt rename to src/basic/fastlane/metadata/android/cs/changelogs/2000008.txt diff --git a/src/basic/fastlane/metadata/android/cs/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/cs/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..580ac91f1 --- /dev/null +++ b/src/basic/fastlane/metadata/android/cs/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ce842c21001cbc9f78138436826ad8f31764f61db9c33765e6441112e431cda +size 115408 diff --git a/src/basic/fastlane/metadata/android/cs/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/cs/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..2c243501f --- /dev/null +++ b/src/basic/fastlane/metadata/android/cs/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:080b8907e2ef87723a0cc0be978e0959c6965f7c8aca705a6ec7fb1069a967d6 +size 90581 diff --git a/src/basic/fastlane/metadata/android/cs/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/cs/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..8820afc2e --- /dev/null +++ b/src/basic/fastlane/metadata/android/cs/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a6d5f3b4885159f6c6b87685d25b2c393d5ee8b51fad7c2f04c0fb27157f006 +size 76068 diff --git a/src/basic/fastlane/metadata/android/cs/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/cs/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..8153e5216 --- /dev/null +++ b/src/basic/fastlane/metadata/android/cs/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7589a5c82ef78819eefc4ddae3df892e532fb4daea6b742ec39aced1d33279d4 +size 188131 diff --git a/src/basic/fastlane/metadata/android/cy/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/cy/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..e2a82c468 --- /dev/null +++ b/src/basic/fastlane/metadata/android/cy/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80d4789b2554fa335b0cfcce133d14de5d3d6674ca2100efb19f031be7bcc218 +size 114416 diff --git a/src/basic/fastlane/metadata/android/cy/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/cy/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..461f303f7 --- /dev/null +++ b/src/basic/fastlane/metadata/android/cy/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc201db5f36d52f3eca7b97bb1260fa7c57cefd219c9b579e7db037deeea97b0 +size 84624 diff --git a/src/basic/fastlane/metadata/android/cy/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/cy/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..5d4ff8c57 --- /dev/null +++ b/src/basic/fastlane/metadata/android/cy/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d28a47c0e1dc3189733765e3795d571fc0610e486d9ff3ca1905d7c2c1075332 +size 75259 diff --git a/src/basic/fastlane/metadata/android/cy/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/cy/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..351f86328 --- /dev/null +++ b/src/basic/fastlane/metadata/android/cy/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb6f0e0c901ecb0131055b8981b1f136acf4c7887a038ef46798a9aa05483094 +size 184508 diff --git a/src/basic/fastlane/metadata/android/da/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/da/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..7a27f6002 --- /dev/null +++ b/src/basic/fastlane/metadata/android/da/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:54c80ed9364b4c8cc83e5fa453ad4de296e6d69b2ef1b5b53a51ab0d21915d49 +size 110892 diff --git a/src/basic/fastlane/metadata/android/da/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/da/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..14793a801 --- /dev/null +++ b/src/basic/fastlane/metadata/android/da/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78c2d29ad3b839df0b10368c39f54e79506c6738ec8160feeb608705195bbc20 +size 81433 diff --git a/src/basic/fastlane/metadata/android/da/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/da/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..150d64774 --- /dev/null +++ b/src/basic/fastlane/metadata/android/da/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1444a1cbee51f10c16f1e8aeca40d8c8e794c1da93ebe6f19ea23e4fb7b1f275 +size 74106 diff --git a/src/basic/fastlane/metadata/android/da/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/da/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..1b649c30e --- /dev/null +++ b/src/basic/fastlane/metadata/android/da/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:568d94bba7065139647fa504d4cba80b49aa294c2b68c3f632c28a703accc70e +size 186184 diff --git a/src/basic/fastlane/metadata/android/de/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/de/changelogs/2000008.txt similarity index 100% rename from src/basic/fastlane/metadata/android/de/changelogs/2000007.txt rename to src/basic/fastlane/metadata/android/de/changelogs/2000008.txt diff --git a/src/basic/fastlane/metadata/android/de/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/de/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..b510bd1d8 --- /dev/null +++ b/src/basic/fastlane/metadata/android/de/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c82fc1bfda92b5f5b71fc8b28df99bfecb9f55298ad9debc9208ba9eae05f803 +size 116527 diff --git a/src/basic/fastlane/metadata/android/de/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/de/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..2760d2556 --- /dev/null +++ b/src/basic/fastlane/metadata/android/de/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5029f7ea6888b2146c4c9de0df3796542ccc79f48b6fdf42eb1fdf3cd98ccf1c +size 81861 diff --git a/src/basic/fastlane/metadata/android/de/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/de/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..187c22d62 --- /dev/null +++ b/src/basic/fastlane/metadata/android/de/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8ca87a0fb1a5bdaa4c012566bdd18d238143c61c7776746a1d5fceb5c078414 +size 76512 diff --git a/src/basic/fastlane/metadata/android/de/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/de/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..3f91c4edc --- /dev/null +++ b/src/basic/fastlane/metadata/android/de/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:828b84453ccdc26206a6f3baf1d3fe0f63c0495fb80c6b37bcec80db1f1be9f2 +size 183156 diff --git a/src/basic/fastlane/metadata/android/el/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/el/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..f16913c40 --- /dev/null +++ b/src/basic/fastlane/metadata/android/el/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:407e77801118827fcb85c1f3fdf4a888f58fa29b392039f00f0f00249c8e6cc4 +size 122745 diff --git a/src/basic/fastlane/metadata/android/el/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/el/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..a1479cb90 --- /dev/null +++ b/src/basic/fastlane/metadata/android/el/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:17f738b4d84e69722a8aa5a339002b8e9d18313437dff1c68b3d394aadd62b74 +size 86634 diff --git a/src/basic/fastlane/metadata/android/el/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/el/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..5389267cb --- /dev/null +++ b/src/basic/fastlane/metadata/android/el/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:811f09be6c59a1d9f0da2974268d6d864b01cd88d15d2f50c38cdcecf5fa2ee9 +size 81714 diff --git a/src/basic/fastlane/metadata/android/el/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/el/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..38647bff3 --- /dev/null +++ b/src/basic/fastlane/metadata/android/el/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07f91a1ebeac6d400ac50579194353a969367a66791bc02e57e885a1467862c2 +size 187155 diff --git a/src/basic/fastlane/metadata/android/en-GB/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/en-GB/changelogs/2000008.txt similarity index 100% rename from src/basic/fastlane/metadata/android/en-GB/changelogs/2000007.txt rename to src/basic/fastlane/metadata/android/en-GB/changelogs/2000008.txt diff --git a/src/basic/fastlane/metadata/android/en-GB/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/en-GB/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..36f88bf8d --- /dev/null +++ b/src/basic/fastlane/metadata/android/en-GB/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4dc99f87d8f18447dfa4187eed68249abc77bb51e8b4622bd3d127a6a5713a24 +size 113488 diff --git a/src/basic/fastlane/metadata/android/en-GB/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/en-GB/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..da992b5a7 --- /dev/null +++ b/src/basic/fastlane/metadata/android/en-GB/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b562bc52a68c4fa7e16d17434a52589498ecb7641be11b317e89a476e2a05bb +size 84352 diff --git a/src/basic/fastlane/metadata/android/en-GB/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/en-GB/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..0c6bf0bbf --- /dev/null +++ b/src/basic/fastlane/metadata/android/en-GB/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7e897a6a8247b05bd583ed67473a5b6120b851d2675ebcccc3ec8cba8eb41ba +size 71227 diff --git a/src/basic/fastlane/metadata/android/en-GB/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/en-GB/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..a7eaa36da --- /dev/null +++ b/src/basic/fastlane/metadata/android/en-GB/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f579affdbbe6c0f74af5762b50f51e56b466d9579f50d9dad570247ccaee8857 +size 184993 diff --git a/src/basic/fastlane/metadata/android/en-US/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/en-US/changelogs/2000008.txt similarity index 100% rename from src/basic/fastlane/metadata/android/en-US/changelogs/2000007.txt rename to src/basic/fastlane/metadata/android/en-US/changelogs/2000008.txt diff --git a/src/basic/fastlane/metadata/android/en-US/images/icon.png b/src/basic/fastlane/metadata/android/en-US/images/icon.png index 712af58d2..0f1a49bf3 100644 Binary files a/src/basic/fastlane/metadata/android/en-US/images/icon.png and b/src/basic/fastlane/metadata/android/en-US/images/icon.png differ diff --git a/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/01-latest.png b/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/01-latest.png deleted file mode 100644 index 4c5f37af5..000000000 Binary files a/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/01-latest.png and /dev/null differ diff --git a/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/02-categories.png b/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/02-categories.png deleted file mode 100644 index f803f2d32..000000000 Binary files a/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/02-categories.png and /dev/null differ diff --git a/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/03-updates.png b/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/03-updates.png deleted file mode 100644 index e7104d69b..000000000 Binary files a/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/03-updates.png and /dev/null differ diff --git a/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/04-settings.png b/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/04-settings.png deleted file mode 100644 index 21779445d..000000000 Binary files a/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/04-settings.png and /dev/null differ diff --git a/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/10-search.png b/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/10-search.png deleted file mode 100644 index f3c529d5f..000000000 Binary files a/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/10-search.png and /dev/null differ diff --git a/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/11-app-details.png b/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/11-app-details.png deleted file mode 100644 index 954ef4e92..000000000 Binary files a/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/11-app-details.png and /dev/null differ diff --git a/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..36f88bf8d --- /dev/null +++ b/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4dc99f87d8f18447dfa4187eed68249abc77bb51e8b4622bd3d127a6a5713a24 +size 113488 diff --git a/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/20-repos.png b/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/20-repos.png deleted file mode 100644 index de792c6e2..000000000 Binary files a/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/20-repos.png and /dev/null differ diff --git a/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/21-repo-details.png b/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/21-repo-details.png deleted file mode 100644 index bc5adf850..000000000 Binary files a/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/21-repo-details.png and /dev/null differ diff --git a/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..10934e4b6 --- /dev/null +++ b/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f40e6f8d5c9c5c462da830cac88a2fc9714c169e6360d3cba641bbc5a954dba +size 84594 diff --git a/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..5803f5482 --- /dev/null +++ b/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ebf168c1218196321d0be7ccb0230fd4b33fa61541c992ca053828691764b51 +size 73253 diff --git a/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..4a91541a5 --- /dev/null +++ b/src/basic/fastlane/metadata/android/en-US/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f75f74d8447ed5371a8abafb3a99537ce52576e3d96b9e0c34d6debf5f241448 +size 183546 diff --git a/src/basic/fastlane/metadata/android/eo/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/eo/changelogs/2000008.txt similarity index 100% rename from src/basic/fastlane/metadata/android/eo/changelogs/2000007.txt rename to src/basic/fastlane/metadata/android/eo/changelogs/2000008.txt diff --git a/src/basic/fastlane/metadata/android/eo/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/eo/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..25fca8bf1 --- /dev/null +++ b/src/basic/fastlane/metadata/android/eo/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80a3d819b8fed57b60a84603e6a95b404cbdd2e5ef1174100816659a3c5c5af6 +size 116759 diff --git a/src/basic/fastlane/metadata/android/eo/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/eo/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..c9c614e51 --- /dev/null +++ b/src/basic/fastlane/metadata/android/eo/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:460a87b686e1e19ebb6a268471b2b0bd727ba403137fdd0a76fe2eefb35a1821 +size 83898 diff --git a/src/basic/fastlane/metadata/android/eo/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/eo/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..713a4f875 --- /dev/null +++ b/src/basic/fastlane/metadata/android/eo/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3ce25fa0ea2797c679e833bee0059769833de4f7dd264246ba3466adda3f2a3 +size 72956 diff --git a/src/basic/fastlane/metadata/android/eo/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/eo/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..f5ec3636d --- /dev/null +++ b/src/basic/fastlane/metadata/android/eo/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:36471f025ad557d4cd53db8bf450934a29645acd3921317939fd57bdbcf2a55f +size 187098 diff --git a/src/basic/fastlane/metadata/android/es-AR/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/es-AR/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..debcd5c16 --- /dev/null +++ b/src/basic/fastlane/metadata/android/es-AR/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c0c1e7ec53bdde88b9b945eeb2d443f8e560a5b37a1b6679e913f0bcbd721b3 +size 115688 diff --git a/src/basic/fastlane/metadata/android/es-AR/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/es-AR/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..4c4244924 --- /dev/null +++ b/src/basic/fastlane/metadata/android/es-AR/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52dc64c4bf6f3b0535b5b43e6c00e4e80a90d2dcdceb48ec5a23a2a6d3748045 +size 84858 diff --git a/src/basic/fastlane/metadata/android/es-AR/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/es-AR/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..f55f9f5cc --- /dev/null +++ b/src/basic/fastlane/metadata/android/es-AR/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:becb43a1c6f58f38efc680544978cd5b45b5bb57d37cc3ef3850fa8b272fd7df +size 76861 diff --git a/src/basic/fastlane/metadata/android/es-AR/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/es-AR/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..34d0f4ac7 --- /dev/null +++ b/src/basic/fastlane/metadata/android/es-AR/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:139344dae56a349e897708849f6d3e1829eed487b964d9cac732ca8ed1a6d38c +size 185786 diff --git a/src/basic/fastlane/metadata/android/es/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/es/changelogs/2000007.txt deleted file mode 100644 index b65bd9082..000000000 --- a/src/basic/fastlane/metadata/android/es/changelogs/2000007.txt +++ /dev/null @@ -1,8 +0,0 @@ -* IU reescrito desde cero con Kotlin compose -* mejor búsqueda, también búsqueda en descripciones y traducciones -* más fácil de descubrir nuevas aplicaciones, también destacando las más descargadas -* aprobación de instalación *antes* de la descarga -* múltiples actualizaciones/descargas al mismo tiempo -* notificar al usuario de problemas con aplicaciones (por ejemplo, al cambiar la clave de firma) -* tema de color Material You opcional -* mejorada la filtración de listas diff --git a/src/basic/fastlane/metadata/android/es/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/es/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..177bb55c0 --- /dev/null +++ b/src/basic/fastlane/metadata/android/es/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb16b3a038a995502c35bacac9f155311d8ed4cb62af8e0d4828e028699215ee +size 119096 diff --git a/src/basic/fastlane/metadata/android/es/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/es/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..d35468832 --- /dev/null +++ b/src/basic/fastlane/metadata/android/es/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:803318a741a995957ceb1fb90223ab3d303e2a59f8d06b86b11479c4555a3abd +size 85447 diff --git a/src/basic/fastlane/metadata/android/es/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/es/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..e263381c1 --- /dev/null +++ b/src/basic/fastlane/metadata/android/es/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8bd8e4f7d86716788dd3c7d45aef5551ae7d6aa5009d0a4fc517827a04bb7cfc +size 78393 diff --git a/src/basic/fastlane/metadata/android/es/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/es/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..8b7adfea8 --- /dev/null +++ b/src/basic/fastlane/metadata/android/es/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41f5a13d39c9b3dd7664adebe1015baf25ca22d97c79788fc1f7e7998dc0b42e +size 185487 diff --git a/src/basic/fastlane/metadata/android/et/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/et/changelogs/2000008.txt similarity index 100% rename from src/basic/fastlane/metadata/android/et/changelogs/2000007.txt rename to src/basic/fastlane/metadata/android/et/changelogs/2000008.txt diff --git a/src/basic/fastlane/metadata/android/et/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/et/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..d43ba7d06 --- /dev/null +++ b/src/basic/fastlane/metadata/android/et/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8497d36b204663a30b2ea9d3839b482c24ff1bc980e43804130acbc5a3e3ae2 +size 110910 diff --git a/src/basic/fastlane/metadata/android/et/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/et/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..48cdcb7dc --- /dev/null +++ b/src/basic/fastlane/metadata/android/et/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1048d43c9df7d0ef34278a912b5fce7bb9aa872c790b8c8546e12be733237994 +size 85164 diff --git a/src/basic/fastlane/metadata/android/et/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/et/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..54490c7d6 --- /dev/null +++ b/src/basic/fastlane/metadata/android/et/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b0a6dae027e6371f723d3a2eb7a299fc21cadf4901f3cbc90050e549163b55a +size 76459 diff --git a/src/basic/fastlane/metadata/android/et/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/et/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..096954681 --- /dev/null +++ b/src/basic/fastlane/metadata/android/et/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9592be7124c62b158a137815eb72a7aaac6f9770b8ab1e497d547fbbac70033 +size 184325 diff --git a/src/basic/fastlane/metadata/android/eu/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/eu/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..3da8940c9 --- /dev/null +++ b/src/basic/fastlane/metadata/android/eu/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89c408ab8acb99589e4c670ed1cdecd110801670afc48272d77b2e72d6b3c29b +size 117046 diff --git a/src/basic/fastlane/metadata/android/eu/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/eu/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..9055c929a --- /dev/null +++ b/src/basic/fastlane/metadata/android/eu/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73f8118fcb4d93faea8d3950c5012dd854c6fe6193c1fc251e156392e91697d4 +size 84472 diff --git a/src/basic/fastlane/metadata/android/eu/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/eu/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..b169eaf36 --- /dev/null +++ b/src/basic/fastlane/metadata/android/eu/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37ac2227c268e4052f5277db4a848e93f3468e23e501a0e92829961be8cd1f50 +size 72691 diff --git a/src/basic/fastlane/metadata/android/eu/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/eu/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..0ca3cac4e --- /dev/null +++ b/src/basic/fastlane/metadata/android/eu/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:226802e8eac8314de62f690e6e8fe62aafbd183ff6d65f633e5a727fb621592d +size 187403 diff --git a/src/basic/fastlane/metadata/android/fa/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/fa/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..fadf164ab --- /dev/null +++ b/src/basic/fastlane/metadata/android/fa/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e8f681ffdcb5946363e1f85f120cd505a264366956d857ead466c1228ef1acf +size 108408 diff --git a/src/basic/fastlane/metadata/android/fa/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/fa/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..961d8dbdf --- /dev/null +++ b/src/basic/fastlane/metadata/android/fa/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cbaa3c90f7b9c349f2c459892206ada4d789400bebac72a9b5ff61a7fe20050e +size 88452 diff --git a/src/basic/fastlane/metadata/android/fa/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/fa/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..d55d906fe --- /dev/null +++ b/src/basic/fastlane/metadata/android/fa/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1df54d70d89ea37d26abb57db50a0e9c490304b227fad3eb65f1364070f12bfa +size 69936 diff --git a/src/basic/fastlane/metadata/android/fa/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/fa/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..84db5769b --- /dev/null +++ b/src/basic/fastlane/metadata/android/fa/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db025fe24815855502a3d1dc27fb40eea896258b8ea5a18d46ceb563314ce212 +size 185249 diff --git a/src/basic/fastlane/metadata/android/fi/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/fi/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..ca8e4cca0 --- /dev/null +++ b/src/basic/fastlane/metadata/android/fi/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9826ce70ceb037c528327e8b6e7d4211132bb47d517f37484bceb0495460419 +size 110845 diff --git a/src/basic/fastlane/metadata/android/fi/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/fi/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..693fc8fe0 --- /dev/null +++ b/src/basic/fastlane/metadata/android/fi/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2868a05b347335ac5e48310b7394fee53dee3e734f29a93df1985960457b5abb +size 82430 diff --git a/src/basic/fastlane/metadata/android/fi/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/fi/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..8274b0cad --- /dev/null +++ b/src/basic/fastlane/metadata/android/fi/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d644020e00698bb9f4a866cf316b010f18b2498c5ca1f5175a9452ffe3c0bf74 +size 75348 diff --git a/src/basic/fastlane/metadata/android/fi/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/fi/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..5af6492a8 --- /dev/null +++ b/src/basic/fastlane/metadata/android/fi/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:057f5510efc55d34729aa0dcf3f943a42aa420e493e0bc2d4bc2ab968ae3d4e1 +size 185476 diff --git a/src/basic/fastlane/metadata/android/fil/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/fil/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..12650d0fe --- /dev/null +++ b/src/basic/fastlane/metadata/android/fil/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43994e24041061ecacd26c5f64084f67f14cb21f2d5be9a95443bbfe4c6d1891 +size 113697 diff --git a/src/basic/fastlane/metadata/android/fil/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/fil/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..04fd6346c --- /dev/null +++ b/src/basic/fastlane/metadata/android/fil/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6331ac55bc67a51fe7045fc884308ec8c9ec367757fb79e82bfeec3c50c9391 +size 84584 diff --git a/src/basic/fastlane/metadata/android/fil/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/fil/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..c4cbf8741 --- /dev/null +++ b/src/basic/fastlane/metadata/android/fil/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ea87a9bf1195ef18f2a5614b7ce511bcb32934e56836e3887c1ada5ccafeaba +size 72778 diff --git a/src/basic/fastlane/metadata/android/fil/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/fil/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..4f6b708d5 --- /dev/null +++ b/src/basic/fastlane/metadata/android/fil/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab0ceb3970b85cb67c7c170d14c3cf86875734a96501cb29950e5bb0ab9031e7 +size 185426 diff --git a/src/basic/fastlane/metadata/android/fr/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/fr/changelogs/2000008.txt similarity index 100% rename from src/basic/fastlane/metadata/android/fr/changelogs/2000007.txt rename to src/basic/fastlane/metadata/android/fr/changelogs/2000008.txt diff --git a/src/basic/fastlane/metadata/android/fr/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/fr/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..2f8e6416c --- /dev/null +++ b/src/basic/fastlane/metadata/android/fr/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:001509baf864ba1418b5290cb92eaddf18a91e31b1e4f8218832898e2c9efe76 +size 116972 diff --git a/src/basic/fastlane/metadata/android/fr/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/fr/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..260d45627 --- /dev/null +++ b/src/basic/fastlane/metadata/android/fr/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68851e461b58e597acfb6372b4beae672c8251697ca12c58596f6782fd7b58a3 +size 83554 diff --git a/src/basic/fastlane/metadata/android/fr/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/fr/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..ec27900d1 --- /dev/null +++ b/src/basic/fastlane/metadata/android/fr/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c0f6b04bfbf21716a6e059e7d4013794fb48fc2c44c7892131605c0be2e9c5c +size 77602 diff --git a/src/basic/fastlane/metadata/android/fr/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/fr/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..9f38d21a8 --- /dev/null +++ b/src/basic/fastlane/metadata/android/fr/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d17db10b02b0e06db936bf5fe2c5108f70f916572556d04a30a9d4d8f67bca3c +size 184403 diff --git a/src/basic/fastlane/metadata/android/ga/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/ga/changelogs/2000008.txt similarity index 100% rename from src/basic/fastlane/metadata/android/ga/changelogs/2000007.txt rename to src/basic/fastlane/metadata/android/ga/changelogs/2000008.txt diff --git a/src/basic/fastlane/metadata/android/ga/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/ga/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..4e579adc9 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ga/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc9f1075aa42cc8d82903f09ca0d87e4c271c389e116393b4dc46bf37000ba58 +size 116162 diff --git a/src/basic/fastlane/metadata/android/ga/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/ga/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..b95a9f2e9 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ga/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9aed0b1bf1a6ce857a676ce9b762e164468a2366b4eb0f52c8774c4d3ddab3dd +size 83542 diff --git a/src/basic/fastlane/metadata/android/ga/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/ga/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..6fc9009a1 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ga/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aae60af5eb183e9be07d6cdcd7570a31615bccf0180ddb60360b2d05cfff2099 +size 74929 diff --git a/src/basic/fastlane/metadata/android/ga/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/ga/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..822ec5e42 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ga/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f406902083dd67af228a625120851f5f7aa49f461596fc566c40558b2b94051e +size 184842 diff --git a/src/basic/fastlane/metadata/android/gd/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/gd/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..ff68e5c70 --- /dev/null +++ b/src/basic/fastlane/metadata/android/gd/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fcc2fc7c5193f74036ed89b53066736a623f1df20ab5b3e4e33e707eefb2ce5f +size 113345 diff --git a/src/basic/fastlane/metadata/android/gd/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/gd/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..91920cf38 --- /dev/null +++ b/src/basic/fastlane/metadata/android/gd/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b628a806d0db836fc26a6761a0d0345b977d69e36e4e3bb64a361518c6687a7c +size 82785 diff --git a/src/basic/fastlane/metadata/android/gd/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/gd/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..4fb4b8963 --- /dev/null +++ b/src/basic/fastlane/metadata/android/gd/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7133f9dfc32aa4ad0f7059b2b82672c1e2e6b8756314b17fcca2aaf0debbf3c +size 72040 diff --git a/src/basic/fastlane/metadata/android/gd/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/gd/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..5bbc866f3 --- /dev/null +++ b/src/basic/fastlane/metadata/android/gd/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e91002504038cc0c920c2448656a8bbe813c684d1c1cdaea97dd450a41ed848 +size 185547 diff --git a/src/basic/fastlane/metadata/android/gl/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/gl/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..6c8447361 --- /dev/null +++ b/src/basic/fastlane/metadata/android/gl/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d468a1951efb01ed2e894fb5a6493e336a9be7691c5dc6d0fd9dca634f00a913 +size 111336 diff --git a/src/basic/fastlane/metadata/android/gl/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/gl/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..98c9ce436 --- /dev/null +++ b/src/basic/fastlane/metadata/android/gl/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:999d9832334f46778a6dd6be2a6a3d40e942f7660b222d9f8c5b3fde98719819 +size 85697 diff --git a/src/basic/fastlane/metadata/android/gl/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/gl/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..21eea172c --- /dev/null +++ b/src/basic/fastlane/metadata/android/gl/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe7e04a942c09777125a208b8b05901b105c4f7aca7abfa73847f5c9441187fd +size 75135 diff --git a/src/basic/fastlane/metadata/android/gl/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/gl/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..38610cd27 --- /dev/null +++ b/src/basic/fastlane/metadata/android/gl/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:460df1bda88e65ee6526fa2668d41e951548f48eba010a0f2da7a95edcb433bd +size 183485 diff --git a/src/basic/fastlane/metadata/android/he/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/he/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..59796d1bf --- /dev/null +++ b/src/basic/fastlane/metadata/android/he/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad58f3f2a5300c8e047bada865291532addb0c8c5bfca5a31b1291aceac22c98 +size 105560 diff --git a/src/basic/fastlane/metadata/android/he/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/he/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..93f0286b7 --- /dev/null +++ b/src/basic/fastlane/metadata/android/he/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2fac8bc6706c01c19ab56778e6deceb5b1416dd04a7faa75943ee3523eae0773 +size 84513 diff --git a/src/basic/fastlane/metadata/android/he/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/he/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..692f18ef4 --- /dev/null +++ b/src/basic/fastlane/metadata/android/he/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b173c3a7970d19150c1a33178d77ef2ecd9819c567309d687a9d3aed0d6c29e5 +size 70205 diff --git a/src/basic/fastlane/metadata/android/he/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/he/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..bfd277e13 --- /dev/null +++ b/src/basic/fastlane/metadata/android/he/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd2ad58291b1c11de2e1a30725f36f5bdc1427e15de88c9f94a8eefadc9be947 +size 175690 diff --git a/src/basic/fastlane/metadata/android/hi-Latn/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/hi-Latn/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..ed62a6c1d --- /dev/null +++ b/src/basic/fastlane/metadata/android/hi-Latn/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b0ec3498857ce1facec4814a29cd2bd4bef80bafdb15e1a0c852a9ba25e9edac +size 113081 diff --git a/src/basic/fastlane/metadata/android/hi-Latn/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/hi-Latn/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..bcdf688fa --- /dev/null +++ b/src/basic/fastlane/metadata/android/hi-Latn/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7651f1475c1a5699cad2106f11d6d1993b4d34fa6e176a1e2e2fedf5741091da +size 80956 diff --git a/src/basic/fastlane/metadata/android/hi-Latn/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/hi-Latn/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..bf35ac9b5 --- /dev/null +++ b/src/basic/fastlane/metadata/android/hi-Latn/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24f46c0073cae27f7fbb269baf7473c565b8f082911edcec90f1f8e700a179b7 +size 73801 diff --git a/src/basic/fastlane/metadata/android/hi-Latn/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/hi-Latn/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..df3a210d9 --- /dev/null +++ b/src/basic/fastlane/metadata/android/hi-Latn/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0fb0c1c3091c48596c532e88b0568d7e3fd5446c9cc2f413e9e3c9662148f87f +size 186476 diff --git a/src/basic/fastlane/metadata/android/hi/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/hi/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..423c3f8e0 --- /dev/null +++ b/src/basic/fastlane/metadata/android/hi/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ab08c7e33734142e5543b52349c1e49fbc77e27fdcaca41431c6ebb898f07e9 +size 113675 diff --git a/src/basic/fastlane/metadata/android/hi/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/hi/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..6f6581c9b --- /dev/null +++ b/src/basic/fastlane/metadata/android/hi/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:91ad949373ca0eaa8f045f1c9a5124af6ea351fbd770cb11620d85b50d711431 +size 82747 diff --git a/src/basic/fastlane/metadata/android/hi/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/hi/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..a34fd9682 --- /dev/null +++ b/src/basic/fastlane/metadata/android/hi/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d4ecabd105d152de69417d55d1e5189da2577c2aeff814ed8583d53534a5c6bd +size 74134 diff --git a/src/basic/fastlane/metadata/android/hi/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/hi/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..ae3228eec --- /dev/null +++ b/src/basic/fastlane/metadata/android/hi/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52099cf330e2ab03c81c4be695271776c0d0b25d1d91e4cee9ee08c4f4fbfe2b +size 184006 diff --git a/src/basic/fastlane/metadata/android/hr/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/hr/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..b6df338e3 --- /dev/null +++ b/src/basic/fastlane/metadata/android/hr/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eaf265051ce1011b04f27cbca1d3aeb5aa4176e2073f97b651aff5f1a4a9891b +size 115507 diff --git a/src/basic/fastlane/metadata/android/hr/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/hr/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..69044251e --- /dev/null +++ b/src/basic/fastlane/metadata/android/hr/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd325ecbe77bb4e0caf726af2ed0ca627fc228d385e53728253eb2bae6882c58 +size 81478 diff --git a/src/basic/fastlane/metadata/android/hr/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/hr/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..7f922289b --- /dev/null +++ b/src/basic/fastlane/metadata/android/hr/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:041aca2192f9db5d894ca85a3e6ce5f135ebafe66a72db7cad078623dfed50a2 +size 75354 diff --git a/src/basic/fastlane/metadata/android/hr/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/hr/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..72e959fda --- /dev/null +++ b/src/basic/fastlane/metadata/android/hr/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fbb7b948e976085ddc4f146b07fc86ac25e3abb68cb362571c85ec2f46313210 +size 186031 diff --git a/src/basic/fastlane/metadata/android/hu-HU/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/hu-HU/changelogs/2000008.txt similarity index 100% rename from src/basic/fastlane/metadata/android/hu-HU/changelogs/2000007.txt rename to src/basic/fastlane/metadata/android/hu-HU/changelogs/2000008.txt diff --git a/src/basic/fastlane/metadata/android/hu/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/hu/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..637769c8c --- /dev/null +++ b/src/basic/fastlane/metadata/android/hu/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3098281e1a1a4af6a58ccb56b63f46224beab646423d084a6c24f5dbc6be806 +size 113739 diff --git a/src/basic/fastlane/metadata/android/hu/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/hu/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..c74a58dab --- /dev/null +++ b/src/basic/fastlane/metadata/android/hu/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b915f240f7b9a1c9ff9c7dfe524096a98dd997ae4d0a25bc418ad977a645900e +size 84353 diff --git a/src/basic/fastlane/metadata/android/hu/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/hu/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..0d714fa9a --- /dev/null +++ b/src/basic/fastlane/metadata/android/hu/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e148d3a868143e2ce4894238d4b557b4874825c623f78219a5127db015bbd82 +size 76872 diff --git a/src/basic/fastlane/metadata/android/hu/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/hu/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..2fc2021d6 --- /dev/null +++ b/src/basic/fastlane/metadata/android/hu/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ce078bc6f2f886b51f7a7172bed73a2eedb41e3a5e77eb372aaae8c668b0eaf +size 187627 diff --git a/src/basic/fastlane/metadata/android/id/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/id/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..e49b14bae --- /dev/null +++ b/src/basic/fastlane/metadata/android/id/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc212245e73aca6816c38c3be8b7fb0dea2595260a932777d4a9d306241cf65d +size 113829 diff --git a/src/basic/fastlane/metadata/android/id/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/id/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..5d859e3cb --- /dev/null +++ b/src/basic/fastlane/metadata/android/id/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ffedb72c5a7fb85d8cd94987a7bcc25b46ad9aee7b5c6da500a6311533f52457 +size 82177 diff --git a/src/basic/fastlane/metadata/android/id/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/id/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..63abafeb0 --- /dev/null +++ b/src/basic/fastlane/metadata/android/id/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2d2c75329a8c08b9ee5bbc9ca65001ff592136df3562367e200181824c9963f +size 74881 diff --git a/src/basic/fastlane/metadata/android/id/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/id/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..6680aff08 --- /dev/null +++ b/src/basic/fastlane/metadata/android/id/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:330cecb80f6b83c927cbaad72dee893dc0e2ce2707c90014d104a897c2ba02b1 +size 185500 diff --git a/src/basic/fastlane/metadata/android/is/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/is/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..c6b14c00f --- /dev/null +++ b/src/basic/fastlane/metadata/android/is/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3ac52653517a621581526a1a15075b87b7151ead7a2ff20f474d1a2ec8f722ab +size 113305 diff --git a/src/basic/fastlane/metadata/android/is/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/is/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..d6a2f5753 --- /dev/null +++ b/src/basic/fastlane/metadata/android/is/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abdf111a290a5883aee749195ec9bc83a7409dd0325738309f789a07e2836b18 +size 82026 diff --git a/src/basic/fastlane/metadata/android/is/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/is/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..209175ff2 --- /dev/null +++ b/src/basic/fastlane/metadata/android/is/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f934ec73bcda9b3276e867593c60847e6b7cf7d40699954586b3996e31bfe99 +size 72538 diff --git a/src/basic/fastlane/metadata/android/is/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/is/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..1a367ed01 --- /dev/null +++ b/src/basic/fastlane/metadata/android/is/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b94add891b6730c11ab3b50a96e8aa51519dfd10464ceeb63195e2a811a8bd65 +size 188437 diff --git a/src/basic/fastlane/metadata/android/it/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/it/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..5c02aba0a --- /dev/null +++ b/src/basic/fastlane/metadata/android/it/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba60e25af4c83d27fdb165dc60e3c6696419a9890af2184f88730cb63b08f8ff +size 111166 diff --git a/src/basic/fastlane/metadata/android/it/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/it/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..a3bae4bd1 --- /dev/null +++ b/src/basic/fastlane/metadata/android/it/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:15c8ca3c2fe4d774bd0d6281c8cf117e391954bd09259069b0f044d243120a42 +size 80985 diff --git a/src/basic/fastlane/metadata/android/it/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/it/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..2eba62e19 --- /dev/null +++ b/src/basic/fastlane/metadata/android/it/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea126b47368ec0558e3b0ed5601590503f729fa55a27018bf1685b3cd2f649ca +size 74870 diff --git a/src/basic/fastlane/metadata/android/it/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/it/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..67c7c4940 --- /dev/null +++ b/src/basic/fastlane/metadata/android/it/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:30f4cd8358014e9e412c23af1b6f27f5aa43ca94cdbcef436ccedd76fd7f67e3 +size 183174 diff --git a/src/basic/fastlane/metadata/android/ja/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/ja/changelogs/2000008.txt similarity index 100% rename from src/basic/fastlane/metadata/android/ja/changelogs/2000007.txt rename to src/basic/fastlane/metadata/android/ja/changelogs/2000008.txt diff --git a/src/basic/fastlane/metadata/android/ja/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/ja/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..4c1e1a29a --- /dev/null +++ b/src/basic/fastlane/metadata/android/ja/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1926871c22629b98e4f243b29b30387b5827bdba71933b84b11d6d34f29eca27 +size 117456 diff --git a/src/basic/fastlane/metadata/android/ja/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/ja/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..45f100479 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ja/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:10d51cfd258792af65ec3ca77cfd738cc8fabb6cd707edcac00756309ff7e1fd +size 87101 diff --git a/src/basic/fastlane/metadata/android/ja/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/ja/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..f9693dede --- /dev/null +++ b/src/basic/fastlane/metadata/android/ja/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02f09df76a6a22559cded96a8891b73fa83f1f41385005bdc2e94b9a1a10779f +size 75602 diff --git a/src/basic/fastlane/metadata/android/ja/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/ja/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..5b1be9a41 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ja/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:195180fc27cc3bccd6d23981d91ac358bb1deeb184380f01a0e2d0a2fc5d17c9 +size 199164 diff --git a/src/basic/fastlane/metadata/android/kn/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/kn/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..d6f6b7df4 --- /dev/null +++ b/src/basic/fastlane/metadata/android/kn/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02609ce2be7d8691fca96c66f55226e7f6254e4355934b91e8c6c9f35af3d68d +size 121381 diff --git a/src/basic/fastlane/metadata/android/kn/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/kn/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..460bffe4d --- /dev/null +++ b/src/basic/fastlane/metadata/android/kn/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df5f6dae30281392e0cdc10af4e474e3421dc0219c03b03cbd821990f9abcdf9 +size 86273 diff --git a/src/basic/fastlane/metadata/android/kn/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/kn/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..ee2cc8ac4 --- /dev/null +++ b/src/basic/fastlane/metadata/android/kn/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6c84f7e30ea9dec640b138f6e1b782093b6a02110f59e44bf00f163903ac18a +size 81092 diff --git a/src/basic/fastlane/metadata/android/kn/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/kn/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..1b6cc854a --- /dev/null +++ b/src/basic/fastlane/metadata/android/kn/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:273a9283ab019f12110b0701a041216c9d95c9bfd9516a1c4197e6cfa72c0971 +size 188509 diff --git a/src/basic/fastlane/metadata/android/ko/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/ko/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..4faffc9b7 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ko/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acbf9a71f4dd62a54ea2113de13577030601b114e0cdcf38127d19fe84411934 +size 104965 diff --git a/src/basic/fastlane/metadata/android/ko/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/ko/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..c4bdffe64 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ko/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bcabd89fb1970dbb7b9f355c469b811b077e252bf90a6c5d24e17d8f2a6e2b6d +size 76720 diff --git a/src/basic/fastlane/metadata/android/ko/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/ko/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..78d283a2b --- /dev/null +++ b/src/basic/fastlane/metadata/android/ko/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:525d464726341279dcf1a54803b21bb8087ee9e5c6ca056ac6e975030f0cd2b2 +size 70573 diff --git a/src/basic/fastlane/metadata/android/ko/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/ko/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..b0a60ea54 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ko/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c36739936f2ad77e23b2a2fe1965701a8e9134368326eb16000038dfd9c059b +size 182110 diff --git a/src/basic/fastlane/metadata/android/lt/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/lt/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..65675e38d --- /dev/null +++ b/src/basic/fastlane/metadata/android/lt/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d7f98008d468d58d62e1a2f41a71d63a003603f3b0726859c6422175aeb5f34 +size 115300 diff --git a/src/basic/fastlane/metadata/android/lt/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/lt/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..15188794a --- /dev/null +++ b/src/basic/fastlane/metadata/android/lt/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cfce8d706587f1275dd9c6703f9f1388161ea0f1f93cc35d2ea6f8a26e37b1b4 +size 85581 diff --git a/src/basic/fastlane/metadata/android/lt/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/lt/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..caddda8e1 --- /dev/null +++ b/src/basic/fastlane/metadata/android/lt/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56d2bd3878a322294cf2ebd93dfb6a23e957f0432eb61897405a85a2014c29b0 +size 79305 diff --git a/src/basic/fastlane/metadata/android/lt/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/lt/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..0e242bbe8 --- /dev/null +++ b/src/basic/fastlane/metadata/android/lt/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82ed1100fb521626cda21fbc58fe312a02cb68d521010ca23a0bc5b939b4de7d +size 186654 diff --git a/src/basic/fastlane/metadata/android/lv/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/lv/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..b5cba3410 --- /dev/null +++ b/src/basic/fastlane/metadata/android/lv/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a2105c18bfe9bfe07aa290cda8f36c040996c338818e30012a87fde39f5e3067 +size 114124 diff --git a/src/basic/fastlane/metadata/android/lv/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/lv/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..be737933b --- /dev/null +++ b/src/basic/fastlane/metadata/android/lv/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bceab957f823b5e3aa332e42fb964f0f67a8253a273ac5b94063ef3e0b3dfd4f +size 83601 diff --git a/src/basic/fastlane/metadata/android/lv/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/lv/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..72eed1489 --- /dev/null +++ b/src/basic/fastlane/metadata/android/lv/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf771e0abeabb05fc96118bc5923a57099d68b14e656f19da19fda138aa2fdd7 +size 73349 diff --git a/src/basic/fastlane/metadata/android/lv/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/lv/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..4e0593269 --- /dev/null +++ b/src/basic/fastlane/metadata/android/lv/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b793d1cd559ad4bd86a5379b6650b077a8be431badc48e0eda034bbe9e477ae7 +size 184472 diff --git a/src/basic/fastlane/metadata/android/ml/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/ml/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..1e5577a28 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ml/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b5d4d0aafa1b1fedb33d6a20ecc306e5ab0846e65c8366cb2ef1f9527450a12 +size 119276 diff --git a/src/basic/fastlane/metadata/android/ml/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/ml/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..ad94c5fd7 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ml/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cacc87dda1de3412cd82d0ba7d0166eb0976a78f9f8752f681b2f7ede07733e0 +size 86673 diff --git a/src/basic/fastlane/metadata/android/ml/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/ml/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..bbf231246 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ml/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:051e571fda744d027c314f91558e944e021dbb1979aada7b2a7383937ccb1abb +size 81447 diff --git a/src/basic/fastlane/metadata/android/ml/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/ml/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..35760b73d --- /dev/null +++ b/src/basic/fastlane/metadata/android/ml/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa145c7b2b0f5e7236b562511e4bc8f187ce69f1d44f96a7af541a59d7434e72 +size 185847 diff --git a/src/basic/fastlane/metadata/android/nb/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/nb/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..b5ef278f9 --- /dev/null +++ b/src/basic/fastlane/metadata/android/nb/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9606207b45806af3cc6f50f39b45615299c970bd0e6a4217caeabe75a759a02 +size 112922 diff --git a/src/basic/fastlane/metadata/android/nb/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/nb/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..ce6e6658d --- /dev/null +++ b/src/basic/fastlane/metadata/android/nb/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:963ecf6343f1979072a1224fb42212fb2600e6dc8d15443f58dd8e1b835798a7 +size 82667 diff --git a/src/basic/fastlane/metadata/android/nb/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/nb/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..8282f19c1 --- /dev/null +++ b/src/basic/fastlane/metadata/android/nb/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cfc39d2d042effafc64f9d3f7020bea08b637d4fea7f7479c713cffb888ae9b3 +size 75549 diff --git a/src/basic/fastlane/metadata/android/nb/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/nb/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..0c9bfa657 --- /dev/null +++ b/src/basic/fastlane/metadata/android/nb/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9ad51880405c6b7aca4d91889f05a7b3b72799bd5d1479d00744ca25922d857 +size 185856 diff --git a/src/basic/fastlane/metadata/android/nl/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/nl/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..d90a14fd9 --- /dev/null +++ b/src/basic/fastlane/metadata/android/nl/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d4a959306c98df7de41151fb0c9ea65e61c79cc8f6ef17fdd63063db3805d1af +size 115103 diff --git a/src/basic/fastlane/metadata/android/nl/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/nl/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..8973ec631 --- /dev/null +++ b/src/basic/fastlane/metadata/android/nl/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ab666fe7a3d175c2bfcc9fe32bc0384734cd80624f273d2105ec1ca16247156 +size 84139 diff --git a/src/basic/fastlane/metadata/android/nl/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/nl/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..fabe361e3 --- /dev/null +++ b/src/basic/fastlane/metadata/android/nl/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e7572170eb31f88304897ed21bbd6118dc0b5b2c75d851b433800e628627d94 +size 74127 diff --git a/src/basic/fastlane/metadata/android/nl/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/nl/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..1262e7d0b --- /dev/null +++ b/src/basic/fastlane/metadata/android/nl/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f4fe18b1aae5694d94fe1e8dbbb3c3f7641bf37fda0c3f0208b67be4517e9a8 +size 186171 diff --git a/src/basic/fastlane/metadata/android/nn/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/nn/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..03bc4b2df --- /dev/null +++ b/src/basic/fastlane/metadata/android/nn/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc45f151a5408bbe55c02d4234649ddb76c109ea0dfe2ace47ffddd5c273fbac +size 114589 diff --git a/src/basic/fastlane/metadata/android/nn/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/nn/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..46d9164e7 --- /dev/null +++ b/src/basic/fastlane/metadata/android/nn/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ea335aa4a660c313ad48bd3055a29a4eccb22c1cce5cf52ea5e35841c301e02 +size 81631 diff --git a/src/basic/fastlane/metadata/android/nn/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/nn/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..41a0882e0 --- /dev/null +++ b/src/basic/fastlane/metadata/android/nn/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3def3576eabef516a7e4b9fc308619d6fd8f35560cf00780d5b415d0f3b48d86 +size 74077 diff --git a/src/basic/fastlane/metadata/android/nn/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/nn/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..5069ad02d --- /dev/null +++ b/src/basic/fastlane/metadata/android/nn/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a0e7dbcb011173923cb933b8881ebd9f0619aded295b9f5d50cd7f74e062421 +size 182066 diff --git a/src/basic/fastlane/metadata/android/pa/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/pa/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..18823af37 --- /dev/null +++ b/src/basic/fastlane/metadata/android/pa/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04975f2267859d17bccc0414be955c36264dccfa6f33056bdea15568f400e8d6 +size 112825 diff --git a/src/basic/fastlane/metadata/android/pa/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/pa/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..8309aee03 --- /dev/null +++ b/src/basic/fastlane/metadata/android/pa/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6022c9b552fe960e0d961f346e46a48a8695d186282d7398a27f37a20c564800 +size 82100 diff --git a/src/basic/fastlane/metadata/android/pa/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/pa/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..e8a936f1b --- /dev/null +++ b/src/basic/fastlane/metadata/android/pa/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e948d8f28f1837eee5d9efcf54a4765c99b8daff65bfd5fb3f0cc6ae7fdc55d7 +size 73764 diff --git a/src/basic/fastlane/metadata/android/pa/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/pa/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..d42811927 --- /dev/null +++ b/src/basic/fastlane/metadata/android/pa/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73757527b8ffc3761021614c1fac8c931e418b86648b7c20ca037526d096072f +size 186069 diff --git a/src/basic/fastlane/metadata/android/pl/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/pl/changelogs/2000008.txt similarity index 100% rename from src/basic/fastlane/metadata/android/pl/changelogs/2000007.txt rename to src/basic/fastlane/metadata/android/pl/changelogs/2000008.txt diff --git a/src/basic/fastlane/metadata/android/pl/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/pl/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..8c9b84977 --- /dev/null +++ b/src/basic/fastlane/metadata/android/pl/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:44f74587f84336277b5f3030fb736e943d5ba33cf48805d110bdf861f0b3d909 +size 115816 diff --git a/src/basic/fastlane/metadata/android/pl/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/pl/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..987afc781 --- /dev/null +++ b/src/basic/fastlane/metadata/android/pl/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c149f7a583a22abbd5587ce80532ea4d62e0c194cf594205ae824b5ab3c16fb +size 82151 diff --git a/src/basic/fastlane/metadata/android/pl/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/pl/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..fe1372fd4 --- /dev/null +++ b/src/basic/fastlane/metadata/android/pl/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acb9b3419edb21b0976c23c9e8c9ab95537599292adbc33869a99f9f4512ae3f +size 77053 diff --git a/src/basic/fastlane/metadata/android/pl/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/pl/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..53cf547b4 --- /dev/null +++ b/src/basic/fastlane/metadata/android/pl/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b2d7f120634f36d5e19bafa63120390b75ff07c9fd58aab736b97883827ff2dc +size 188183 diff --git a/src/basic/fastlane/metadata/android/pt-BR/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/pt-BR/changelogs/2000008.txt similarity index 100% rename from src/basic/fastlane/metadata/android/pt-BR/changelogs/2000007.txt rename to src/basic/fastlane/metadata/android/pt-BR/changelogs/2000008.txt diff --git a/src/basic/fastlane/metadata/android/pt-BR/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/pt-BR/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..0863bb8bc --- /dev/null +++ b/src/basic/fastlane/metadata/android/pt-BR/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3cec861c6aac0b07149e88308b77ccdd069ec15d5b31f5d0711460620ca8c977 +size 115557 diff --git a/src/basic/fastlane/metadata/android/pt-BR/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/pt-BR/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..1ac5e36bf --- /dev/null +++ b/src/basic/fastlane/metadata/android/pt-BR/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3ca181a34c7ce96b33712ebf264e3fa131064575fe71eda5156fcc4e205d9b51 +size 81002 diff --git a/src/basic/fastlane/metadata/android/pt-BR/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/pt-BR/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..d14e512b5 --- /dev/null +++ b/src/basic/fastlane/metadata/android/pt-BR/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c402d4235031cd19934182fe96daa82f5879b445582400a706022f941d9fe6be +size 76146 diff --git a/src/basic/fastlane/metadata/android/pt-BR/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/pt-BR/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..2da28d5b0 --- /dev/null +++ b/src/basic/fastlane/metadata/android/pt-BR/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e6f7257572e7f5c70c6fa094517990a206f87b4bcaee513c076024e8c84756d +size 188634 diff --git a/src/basic/fastlane/metadata/android/pt-PT/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/pt-PT/changelogs/2000008.txt similarity index 100% rename from src/basic/fastlane/metadata/android/pt-PT/changelogs/2000007.txt rename to src/basic/fastlane/metadata/android/pt-PT/changelogs/2000008.txt diff --git a/src/basic/fastlane/metadata/android/pt-PT/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/pt-PT/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..c6e9c152f --- /dev/null +++ b/src/basic/fastlane/metadata/android/pt-PT/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0414426e6c107b09d70e4d9be587217d8f83bc821d54eedbef6507f5d908246 +size 114602 diff --git a/src/basic/fastlane/metadata/android/pt-PT/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/pt-PT/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..1515c2a76 --- /dev/null +++ b/src/basic/fastlane/metadata/android/pt-PT/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:283fc587ab3466021514d22ae9fac110e610f71b37cc1a47ac8057dbabc0a8b9 +size 81596 diff --git a/src/basic/fastlane/metadata/android/pt-PT/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/pt-PT/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..1c62a6725 --- /dev/null +++ b/src/basic/fastlane/metadata/android/pt-PT/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e08d25f4c0e1c96606a63250483193d4358627b6ac4f33f319d61b6a73b17ffa +size 75452 diff --git a/src/basic/fastlane/metadata/android/pt-PT/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/pt-PT/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..c2fc888e6 --- /dev/null +++ b/src/basic/fastlane/metadata/android/pt-PT/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:841afe20d083244f9e36d927ad293da9f01ee34f7fa19b2f98de02c40050bd33 +size 187981 diff --git a/src/basic/fastlane/metadata/android/pt/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/pt/changelogs/2000008.txt similarity index 100% rename from src/basic/fastlane/metadata/android/pt/changelogs/2000007.txt rename to src/basic/fastlane/metadata/android/pt/changelogs/2000008.txt diff --git a/src/basic/fastlane/metadata/android/pt/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/pt/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..554f141a4 --- /dev/null +++ b/src/basic/fastlane/metadata/android/pt/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:46ce92331b26c349cc30d9eb602bf67b54d694a8e0510f372ae87bd71301fbda +size 114701 diff --git a/src/basic/fastlane/metadata/android/pt/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/pt/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..7291f595d --- /dev/null +++ b/src/basic/fastlane/metadata/android/pt/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:053b624d04d65ad3055eb89567f2159dce49d05d459f6684f5299c98e4d8e1fc +size 82005 diff --git a/src/basic/fastlane/metadata/android/pt/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/pt/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..39e81af27 --- /dev/null +++ b/src/basic/fastlane/metadata/android/pt/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:adb25e6bded3f4b56c0d835091dc15a039b1d9a956c3db0562f9e9f3970a1fbc +size 77648 diff --git a/src/basic/fastlane/metadata/android/pt/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/pt/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..792ad1f7a --- /dev/null +++ b/src/basic/fastlane/metadata/android/pt/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec2c55e31d06f0befe7d067325143251644deade6af410cb81552e1d160eacf2 +size 186249 diff --git a/src/basic/fastlane/metadata/android/ro/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/ro/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..4286a3db2 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ro/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4a7ad7cd99b704ccb2139254734d959a912fed960b596da90d15e164a54d112 +size 113647 diff --git a/src/basic/fastlane/metadata/android/ro/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/ro/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..75ecca661 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ro/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48eef2b958110c26121b77a5d7c3bba60c4efb31ade2ca3a38574b95f01cdad4 +size 81384 diff --git a/src/basic/fastlane/metadata/android/ro/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/ro/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..efb74682f --- /dev/null +++ b/src/basic/fastlane/metadata/android/ro/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c2d5ba4da173ad76ec1d72db9d8f9840f38b4104600d1bba324baefef311684 +size 75491 diff --git a/src/basic/fastlane/metadata/android/ro/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/ro/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..d63656a3b --- /dev/null +++ b/src/basic/fastlane/metadata/android/ro/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1cdb8b394d09d442f919f10a136f7615904b7698d3239946b6a071b3e35cd34d +size 186909 diff --git a/src/basic/fastlane/metadata/android/ru/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/ru/changelogs/2000008.txt similarity index 100% rename from src/basic/fastlane/metadata/android/ru/changelogs/2000007.txt rename to src/basic/fastlane/metadata/android/ru/changelogs/2000008.txt diff --git a/src/basic/fastlane/metadata/android/ru/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/ru/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..406bfb2b2 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ru/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06eb112fd145ab7b302b7641d2162acbe83fe2db5b6526e444ca98bc08f50de9 +size 114112 diff --git a/src/basic/fastlane/metadata/android/ru/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/ru/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..a43c124eb --- /dev/null +++ b/src/basic/fastlane/metadata/android/ru/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:507caa2ae99fe0bc93b980c4998ed70d64c71e20639c58a04094a41e7ebe878b +size 84896 diff --git a/src/basic/fastlane/metadata/android/ru/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/ru/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..ecf8998cd --- /dev/null +++ b/src/basic/fastlane/metadata/android/ru/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f663e039254f2ab7d1ca4b8ac1a324f2bdc72c13efda80b551504e337833010d +size 77213 diff --git a/src/basic/fastlane/metadata/android/ru/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/ru/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..84601b8a7 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ru/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18b024f7aa6279740be18e1a24129cc6a77b044593ab66bb72ebeb9202869079 +size 186890 diff --git a/src/basic/fastlane/metadata/android/sc/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/sc/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..efd671299 --- /dev/null +++ b/src/basic/fastlane/metadata/android/sc/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c861b238b2de81000b0bab6a6f8bab66d83ee207d2c34598ced15a3515fb4780 +size 114364 diff --git a/src/basic/fastlane/metadata/android/sc/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/sc/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..a1f33a006 --- /dev/null +++ b/src/basic/fastlane/metadata/android/sc/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0bbcfc49e757e9160b2027f836af9afdb39d619e464a112714e024003b6b041 +size 84631 diff --git a/src/basic/fastlane/metadata/android/sc/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/sc/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..39ce7eb46 --- /dev/null +++ b/src/basic/fastlane/metadata/android/sc/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4bee920bc1e7fa1e882e938893fb8cb048912c9497b1ef2e9018cb611505ca4e +size 73107 diff --git a/src/basic/fastlane/metadata/android/sc/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/sc/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..b8ae5b28a --- /dev/null +++ b/src/basic/fastlane/metadata/android/sc/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d0bb62d768407682393f39d413a33120bb58ffdb28b467804d53741cb77f171 +size 185023 diff --git a/src/basic/fastlane/metadata/android/sk/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/sk/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..abe49a0a3 --- /dev/null +++ b/src/basic/fastlane/metadata/android/sk/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b9e8e0da6af52940478ef18ff2f12b4a14e26522eed095dab02cedd79781c77 +size 115929 diff --git a/src/basic/fastlane/metadata/android/sk/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/sk/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..95fb7e674 --- /dev/null +++ b/src/basic/fastlane/metadata/android/sk/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c976b1b2f1788a9ec10826ef4aa53ff575e6ed458422027f4d1489f05fd3d5cc +size 84715 diff --git a/src/basic/fastlane/metadata/android/sk/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/sk/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..2df79c3bb --- /dev/null +++ b/src/basic/fastlane/metadata/android/sk/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aef6b10585aef00dda883a695274b5aeaa51a10d5717e5fc8008cc2f39cc2366 +size 74917 diff --git a/src/basic/fastlane/metadata/android/sk/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/sk/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..2b1216882 --- /dev/null +++ b/src/basic/fastlane/metadata/android/sk/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9343a9ddb873746194130c36d3a1182b0742e80fbecdb73700413824ed220fe8 +size 187041 diff --git a/src/basic/fastlane/metadata/android/sl/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/sl/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..823737737 --- /dev/null +++ b/src/basic/fastlane/metadata/android/sl/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6dce0f86a8a17c49e36cd531c4db7689dfa361de3ca10f124652155e4b5da8f6 +size 116545 diff --git a/src/basic/fastlane/metadata/android/sl/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/sl/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..05ab84604 --- /dev/null +++ b/src/basic/fastlane/metadata/android/sl/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bdc98b17223d7ebd703c278938908a44a4ad7705abf28b4d0e5adecfd547a569 +size 83602 diff --git a/src/basic/fastlane/metadata/android/sl/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/sl/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..4bac6b9de --- /dev/null +++ b/src/basic/fastlane/metadata/android/sl/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:944867547d292fe434d958c3701b3aaf38045a7be44454b5e3cf386237d8429c +size 78711 diff --git a/src/basic/fastlane/metadata/android/sl/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/sl/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..af4b46a06 --- /dev/null +++ b/src/basic/fastlane/metadata/android/sl/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e9d88a243d4ceb6c2ed29075ea3a8cceafd505c6b8882a5061c6bda6a1b7f0c +size 191291 diff --git a/src/basic/fastlane/metadata/android/sq/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/sq/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..3bcda7138 --- /dev/null +++ b/src/basic/fastlane/metadata/android/sq/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0eb210f99585177852b2de312d06d2f90447b2cd95c1cbc7bdb95d1fed86dbf6 +size 113494 diff --git a/src/basic/fastlane/metadata/android/sq/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/sq/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..bb67b9be1 --- /dev/null +++ b/src/basic/fastlane/metadata/android/sq/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7775f16c4c044fbc0e760bd03ae1e60eede92ac8edd2a8b912cbe1413cfbe6d9 +size 83103 diff --git a/src/basic/fastlane/metadata/android/sq/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/sq/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..4fa43c15b --- /dev/null +++ b/src/basic/fastlane/metadata/android/sq/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19e010c04b9fdc67cf86d2859cf0b72e3a331572454952ca14a5e41488a70355 +size 76244 diff --git a/src/basic/fastlane/metadata/android/sq/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/sq/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..e2672a1de --- /dev/null +++ b/src/basic/fastlane/metadata/android/sq/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9db0d5230f701c772e3d3b1d2a97bb528b41c9cbbd9c74d135762477f6defb92 +size 184716 diff --git a/src/basic/fastlane/metadata/android/sr/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/sr/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..c5a83bf98 --- /dev/null +++ b/src/basic/fastlane/metadata/android/sr/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8e01e96343b3ff4b3de7c89362aac4b197a91032d7ed81ed667502dcd11d5f58 +size 113713 diff --git a/src/basic/fastlane/metadata/android/sr/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/sr/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..7f748fdd3 --- /dev/null +++ b/src/basic/fastlane/metadata/android/sr/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acabcf5fa410b31a39c9f475ece7cc49cc13df6622ef97315055bf2d3d1c9d1c +size 80775 diff --git a/src/basic/fastlane/metadata/android/sr/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/sr/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..1a4e57ace --- /dev/null +++ b/src/basic/fastlane/metadata/android/sr/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20a5c87b38f28aec9888800c05a27540c4eb166e305d90ae1f09b632e1d86dd9 +size 73643 diff --git a/src/basic/fastlane/metadata/android/sr/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/sr/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..749cb3cb4 --- /dev/null +++ b/src/basic/fastlane/metadata/android/sr/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8bd22d6381d6b5d5eb5df1b1b112052b485a3f20f00d97667a3a853f737bde9f +size 186956 diff --git a/src/basic/fastlane/metadata/android/sv-SE/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/sv-SE/changelogs/2000008.txt similarity index 100% rename from src/basic/fastlane/metadata/android/sv-SE/changelogs/2000007.txt rename to src/basic/fastlane/metadata/android/sv-SE/changelogs/2000008.txt diff --git a/src/basic/fastlane/metadata/android/sv/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/sv/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..a16042272 --- /dev/null +++ b/src/basic/fastlane/metadata/android/sv/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a1803da23bce81b2d6cb23c3b20b806c3e346cdce3d91f3a5d83810ed0a50c8 +size 114108 diff --git a/src/basic/fastlane/metadata/android/sv/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/sv/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..fc049283b --- /dev/null +++ b/src/basic/fastlane/metadata/android/sv/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa470b94e84393abd20d31324b22fa85c52bf1f3eec9ac8bd57cab722ad72473 +size 80382 diff --git a/src/basic/fastlane/metadata/android/sv/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/sv/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..8ed6dfe09 --- /dev/null +++ b/src/basic/fastlane/metadata/android/sv/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a4b6cacb5ef19524b5dea79f5ffacc25b0e02010277e2ba5c3cc7d6e347ea54 +size 73992 diff --git a/src/basic/fastlane/metadata/android/sv/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/sv/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..061d807f8 --- /dev/null +++ b/src/basic/fastlane/metadata/android/sv/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f98dbab2c6bdb223331f13faa6d5a79b22903a8035de0fec5e303649ce4ed2aa +size 186111 diff --git a/src/basic/fastlane/metadata/android/sw/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/sw/changelogs/2000008.txt similarity index 100% rename from src/basic/fastlane/metadata/android/sw/changelogs/2000007.txt rename to src/basic/fastlane/metadata/android/sw/changelogs/2000008.txt diff --git a/src/basic/fastlane/metadata/android/sw/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/sw/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..811f5f4e9 --- /dev/null +++ b/src/basic/fastlane/metadata/android/sw/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5cc525f99aafd00615b1bc11f82298ec436b31acb40d930919b25fe64a734b97 +size 116397 diff --git a/src/basic/fastlane/metadata/android/sw/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/sw/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..129829f15 --- /dev/null +++ b/src/basic/fastlane/metadata/android/sw/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72c633c5d05353808581cd9618ab917cc9c5ad5c920f5aa157604644de8326cf +size 83483 diff --git a/src/basic/fastlane/metadata/android/sw/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/sw/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..fbec93dea --- /dev/null +++ b/src/basic/fastlane/metadata/android/sw/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b54c4f7c5cfd63b4d1f8e642c0e4a5bcf17b6f3b5c5789eada8c0caa3f4215dd +size 73877 diff --git a/src/basic/fastlane/metadata/android/sw/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/sw/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..d7798b13a --- /dev/null +++ b/src/basic/fastlane/metadata/android/sw/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7a17a2e407c0d864985a797b018fa23a9cc171720d5d5044f8dc3d58907bc6e +size 186898 diff --git a/src/basic/fastlane/metadata/android/ta/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/ta/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..c97243f2b --- /dev/null +++ b/src/basic/fastlane/metadata/android/ta/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac41351196287677bbea02740a3be810aae285086a77e73b4f0f9a8e68c3b1b6 +size 118374 diff --git a/src/basic/fastlane/metadata/android/ta/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/ta/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..00527beda --- /dev/null +++ b/src/basic/fastlane/metadata/android/ta/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a10b9e783409d995e3e8839ac7b41c76f254708f13b42fd3443cd5cec16c1849 +size 88595 diff --git a/src/basic/fastlane/metadata/android/ta/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/ta/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..f16d80c90 --- /dev/null +++ b/src/basic/fastlane/metadata/android/ta/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c66cd5294c990f17c5c830867db4016dd42b9e56c3bd0d5061dec1d9b5e630b8 +size 75899 diff --git a/src/basic/fastlane/metadata/android/ta/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/ta/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..4fc60193b --- /dev/null +++ b/src/basic/fastlane/metadata/android/ta/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:840779b48356232b517c8372b7f6a813e58e5abb4ab29830d9a8456920a0947f +size 192799 diff --git a/src/basic/fastlane/metadata/android/th/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/th/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..0c299225d --- /dev/null +++ b/src/basic/fastlane/metadata/android/th/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9367e8a66f8b66c3a82a704e5e2ec974605b8c41e5077cb4ce02524d9e065a3d +size 113640 diff --git a/src/basic/fastlane/metadata/android/th/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/th/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..a15693112 --- /dev/null +++ b/src/basic/fastlane/metadata/android/th/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1edf3cad081fac1cda4b5278d638c7b90a1a14b2d15045c82e1660cecbd31111 +size 82887 diff --git a/src/basic/fastlane/metadata/android/th/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/th/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..b6f9df076 --- /dev/null +++ b/src/basic/fastlane/metadata/android/th/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ca03b0f6b5c25c1a2acea5d31443b297f5482985d7e4f77ddb026bc5b8448fd +size 76960 diff --git a/src/basic/fastlane/metadata/android/th/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/th/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..593b52559 --- /dev/null +++ b/src/basic/fastlane/metadata/android/th/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71728da5bd1f1f831c267c15b8f0ecef6649dcf9081e97255e3a03bf01e2ba34 +size 183428 diff --git a/src/basic/fastlane/metadata/android/tr/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/tr/changelogs/2000008.txt similarity index 100% rename from src/basic/fastlane/metadata/android/tr/changelogs/2000007.txt rename to src/basic/fastlane/metadata/android/tr/changelogs/2000008.txt diff --git a/src/basic/fastlane/metadata/android/tr/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/tr/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..ce11b2852 --- /dev/null +++ b/src/basic/fastlane/metadata/android/tr/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73c5ac550e06a71c6b46188b815b264f4e20e82fd0e45cf76c775aa73ad18af6 +size 115144 diff --git a/src/basic/fastlane/metadata/android/tr/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/tr/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..22f09142a --- /dev/null +++ b/src/basic/fastlane/metadata/android/tr/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6abe92d38adf1d476bba8b100d7c585d28946b0289eb6e9fc6a130ea3259398 +size 81545 diff --git a/src/basic/fastlane/metadata/android/tr/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/tr/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..84844bd06 --- /dev/null +++ b/src/basic/fastlane/metadata/android/tr/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0666c5aa8438b4554878bfd54f84d85b655b19ef9a6ac23873d3fca8ca98de55 +size 76220 diff --git a/src/basic/fastlane/metadata/android/tr/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/tr/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..20fbe5573 --- /dev/null +++ b/src/basic/fastlane/metadata/android/tr/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:875854ef2d8c9328e53c7a9272768b476deac820a7f3200ddd61de478ee53e94 +size 185372 diff --git a/src/basic/fastlane/metadata/android/uk/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/uk/changelogs/2000008.txt similarity index 100% rename from src/basic/fastlane/metadata/android/uk/changelogs/2000007.txt rename to src/basic/fastlane/metadata/android/uk/changelogs/2000008.txt diff --git a/src/basic/fastlane/metadata/android/uk/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/uk/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..2dde9c7e5 --- /dev/null +++ b/src/basic/fastlane/metadata/android/uk/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23dbdb2034cb4b811e4dc4a8c34f30d2071cecb0f6bd34bdf3f726e21960ce98 +size 110675 diff --git a/src/basic/fastlane/metadata/android/uk/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/uk/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..e02a39e8d --- /dev/null +++ b/src/basic/fastlane/metadata/android/uk/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a14ebe1678973ae101ab758f7d1198ba8198ce7deec7dfaa12f0cfbc7031532 +size 83032 diff --git a/src/basic/fastlane/metadata/android/uk/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/uk/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..c9a56c288 --- /dev/null +++ b/src/basic/fastlane/metadata/android/uk/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5faaf310dd9f8f76092bf88fee6210f73207ccffb1293cb305edd24e58e38481 +size 75747 diff --git a/src/basic/fastlane/metadata/android/uk/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/uk/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..672f77b5e --- /dev/null +++ b/src/basic/fastlane/metadata/android/uk/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2652c283f4a3b0aaae95cb63b700e24f78e42fcba53df525b0faae404b654d8 +size 185251 diff --git a/src/basic/fastlane/metadata/android/vi/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/vi/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..61d097de7 --- /dev/null +++ b/src/basic/fastlane/metadata/android/vi/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b50e7127d83fec96f8eb828a2647c6de33c07ca74457b80a1fb92e99e8afe1e +size 113834 diff --git a/src/basic/fastlane/metadata/android/vi/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/vi/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..0ff716a51 --- /dev/null +++ b/src/basic/fastlane/metadata/android/vi/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3bd32a878e6d863e2d498031ee0ddf0a1d42be39406818b570d14255be47d0df +size 83432 diff --git a/src/basic/fastlane/metadata/android/vi/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/vi/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..71d362b0e --- /dev/null +++ b/src/basic/fastlane/metadata/android/vi/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c5fd94beb5591232cce1e8ee1ffdb55841a31ab65e24904e3e7f21eff1f4b78 +size 74108 diff --git a/src/basic/fastlane/metadata/android/vi/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/vi/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..c4a472162 --- /dev/null +++ b/src/basic/fastlane/metadata/android/vi/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:609b41f70b73933c898dc97a79ba430a18f2cad85a2e6df9e0aad7b8e1d0ff03 +size 184909 diff --git a/src/basic/fastlane/metadata/android/yue/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/yue/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..3022ec876 --- /dev/null +++ b/src/basic/fastlane/metadata/android/yue/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bea79de2ca3bd9008adbe34f1027050fcc75392d6385a08f971d105395b674a0 +size 113467 diff --git a/src/basic/fastlane/metadata/android/yue/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/yue/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..3042ce44b --- /dev/null +++ b/src/basic/fastlane/metadata/android/yue/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5276af43726cf125c68f9b64f4693a4a396cd77574f30eed94f421e11f5d66e +size 83521 diff --git a/src/basic/fastlane/metadata/android/yue/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/yue/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..a513d5375 --- /dev/null +++ b/src/basic/fastlane/metadata/android/yue/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc118ef018317cdcb8e087cc8c1cd8a93a4ae2cd8d9b05eae73747ddb46c0710 +size 72970 diff --git a/src/basic/fastlane/metadata/android/yue/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/yue/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..9035da98e --- /dev/null +++ b/src/basic/fastlane/metadata/android/yue/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c97f979f8de5ac8657984463aefebd8832be1a2e4c5c795d7dcc8c22751da848 +size 184831 diff --git a/src/basic/fastlane/metadata/android/zh-CN/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/zh-CN/changelogs/2000008.txt similarity index 100% rename from src/basic/fastlane/metadata/android/zh-CN/changelogs/2000007.txt rename to src/basic/fastlane/metadata/android/zh-CN/changelogs/2000008.txt diff --git a/src/basic/fastlane/metadata/android/zh-CN/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/zh-CN/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..0a97c58ad --- /dev/null +++ b/src/basic/fastlane/metadata/android/zh-CN/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1bef5e4e0fbbe959a114a9632b126149815a03bd1fb9e2ec2efc2f2dc353ebc5 +size 115976 diff --git a/src/basic/fastlane/metadata/android/zh-CN/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/zh-CN/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..859e2b8a1 --- /dev/null +++ b/src/basic/fastlane/metadata/android/zh-CN/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:337825b2f11ed6a0e2c62693f80ba12621ffb2ba7450bd18fc8e356b86727b25 +size 91352 diff --git a/src/basic/fastlane/metadata/android/zh-CN/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/zh-CN/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..223ab1e81 --- /dev/null +++ b/src/basic/fastlane/metadata/android/zh-CN/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc02eb74fe5c4b08b3dee29b02c80ad61d0a92cb454107a7655364036ae1f9cf +size 74337 diff --git a/src/basic/fastlane/metadata/android/zh-CN/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/zh-CN/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..f1c78e77a --- /dev/null +++ b/src/basic/fastlane/metadata/android/zh-CN/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b01d898df39df2ea5838dfdd0689cf2aaedb9d85431846e9ab2d232a8a18f1d +size 193774 diff --git a/src/basic/fastlane/metadata/android/zh-HK/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/zh-HK/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..2f0ce1330 --- /dev/null +++ b/src/basic/fastlane/metadata/android/zh-HK/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc98aab1db61a5bb3990df91131a06bf9376f77fd74cbad62cf1626d851a54ff +size 119621 diff --git a/src/basic/fastlane/metadata/android/zh-HK/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/zh-HK/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..b8870f69e --- /dev/null +++ b/src/basic/fastlane/metadata/android/zh-HK/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e64b0d2bb8ae2aa476f211f114f226fd22a35fe19603e18354fa5c866ec1c685 +size 90989 diff --git a/src/basic/fastlane/metadata/android/zh-HK/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/zh-HK/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..3ec54e7b3 --- /dev/null +++ b/src/basic/fastlane/metadata/android/zh-HK/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:641bc448afc1d2d8ee433be09016f706ede45d13879f08f9b30fdaafa78eb24c +size 80403 diff --git a/src/basic/fastlane/metadata/android/zh-HK/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/zh-HK/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..2df42a831 --- /dev/null +++ b/src/basic/fastlane/metadata/android/zh-HK/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4769298e8d27debe7163287a8eb32838a8fb475fcddacf101c7680e36f7b16b9 +size 197125 diff --git a/src/basic/fastlane/metadata/android/zh-TW/changelogs/2000007.txt b/src/basic/fastlane/metadata/android/zh-TW/changelogs/2000008.txt similarity index 100% rename from src/basic/fastlane/metadata/android/zh-TW/changelogs/2000007.txt rename to src/basic/fastlane/metadata/android/zh-TW/changelogs/2000008.txt diff --git a/src/basic/fastlane/metadata/android/zh-TW/images/phoneScreenshots/1_Discover.png b/src/basic/fastlane/metadata/android/zh-TW/images/phoneScreenshots/1_Discover.png new file mode 100644 index 000000000..40e850e21 --- /dev/null +++ b/src/basic/fastlane/metadata/android/zh-TW/images/phoneScreenshots/1_Discover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:315716395e7e4d67d0e1fd1f812a8bbc45e13d40185b7eaef0da17bea6a0e6e9 +size 118115 diff --git a/src/basic/fastlane/metadata/android/zh-TW/images/phoneScreenshots/2_Search.png b/src/basic/fastlane/metadata/android/zh-TW/images/phoneScreenshots/2_Search.png new file mode 100644 index 000000000..4521a7c34 --- /dev/null +++ b/src/basic/fastlane/metadata/android/zh-TW/images/phoneScreenshots/2_Search.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c7bab98bbf0eaf4640a1ba9b1bc620a87fc95e8bfd78fcbd2e8bc4a6d1fad8b +size 91714 diff --git a/src/basic/fastlane/metadata/android/zh-TW/images/phoneScreenshots/3_My_Apps.png b/src/basic/fastlane/metadata/android/zh-TW/images/phoneScreenshots/3_My_Apps.png new file mode 100644 index 000000000..e0823934b --- /dev/null +++ b/src/basic/fastlane/metadata/android/zh-TW/images/phoneScreenshots/3_My_Apps.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a63ae000e0ed5824330f423e71db1b263c50cbb5be7b0f9e40ce9f3ce329e33 +size 77052 diff --git a/src/basic/fastlane/metadata/android/zh-TW/images/phoneScreenshots/4_Details.png b/src/basic/fastlane/metadata/android/zh-TW/images/phoneScreenshots/4_Details.png new file mode 100644 index 000000000..c031a81aa --- /dev/null +++ b/src/basic/fastlane/metadata/android/zh-TW/images/phoneScreenshots/4_Details.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd1a45955d0f621617fef02cb133688535ad5e7437f076e546e9f539e54eafea +size 195434 diff --git a/tools/screenshot-demo-mode.sh b/tools/screenshot-demo-mode.sh new file mode 100755 index 000000000..c24959ab3 --- /dev/null +++ b/tools/screenshot-demo-mode.sh @@ -0,0 +1,31 @@ +#!/bin/sh +CMD=$1 + +if [[ $ADB == "" ]]; then + ADB=adb +fi + +if [[ $CMD != "on" && $CMD != "off" ]]; then + echo "Usage: $0 [on|off]" >&2 + exit +fi + +$ADB root || exit +$ADB wait-for-devices +$ADB shell settings put system time_12_24 24 +$ADB shell settings put global sysui_demo_allowed 1 + +if [ $CMD == "on" ]; then + $ADB shell settings put system screen_off_timeout 2147483647 + $ADB shell am broadcast -a com.android.systemui.demo -e command enter || exit + $ADB shell am broadcast -a com.android.systemui.demo -e command clock -e hhmm 1337 + $ADB shell am broadcast -a com.android.systemui.demo -e command battery -e plugged false + $ADB shell am broadcast -a com.android.systemui.demo -e command battery -e level 100 + $ADB shell am broadcast -a com.android.systemui.demo -e command network -e wifi show -e fully true -e level 4 + $ADB shell am broadcast -a com.android.systemui.demo -e command network -e mobile show -e fully true -e datatype none -e level 4 + $ADB shell am broadcast -a com.android.systemui.demo -e command notifications -e visible false +elif [ $CMD == "off" ]; then + $ADB shell am broadcast -a com.android.systemui.demo -e command exit + $ADB shell settings put system screen_off_timeout 30000 + $ADB shell settings put global sysui_demo_allowed 0 +fi diff --git a/tools/take-screenshots.py b/tools/take-screenshots.py new file mode 100755 index 000000000..1b988ab38 --- /dev/null +++ b/tools/take-screenshots.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python3 +# +# Takes localized screenshots on a device and saves them to the proper directory. +# +# Careful: this removes ../screenshots folder if it exists. Also removes screenshots from device. +# +import shutil +import subprocess +from pathlib import Path + +script_dir = Path(__file__).parent.resolve() +screenshots_dir = script_dir.parent / 'screenshots' + +shutil.rmtree(screenshots_dir, ignore_errors=True) +subprocess.run(["adb", "shell", "rm", "-r", "/sdcard/Android/data/org.fdroid.basic.debug/files/screenshots"]) +subprocess.run(["./screenshot-demo-mode.sh", "on"], cwd=script_dir) +try: + print("Running connectedAndroidTest to take screenshots...") + subprocess.run(["./gradlew", ":app:connectedBasicDefaultDebugAndroidTest", + "-Pandroid.testInstrumentationRunnerArguments.fdroid_screenshots=true"], + cwd=script_dir.parent, check=True) + + print("Downloading screenshots...") + screenshots_dir = script_dir.parent / 'screenshots' + subprocess.run( + ["adb", "pull", "/sdcard/Android/data/org.fdroid.basic.debug/files/screenshots", script_dir.parent], + cwd=script_dir.parent, check=True) + + print("Running pngquant on screenshots...") + screenshots = [str(f) for f in screenshots_dir.glob('basic/fastlane/metadata/android/*/images/*/*')] + for screenshot in screenshots: + subprocess.run(["pngquant", "--force", "--ext", ".png", "--skip-if-larger", "--speed", "1", screenshot]) + + target_dir = script_dir.parent / 'src' + old_screenshots = [str(f) for f in target_dir.glob('basic/fastlane/metadata/android/*/images/phoneScreenshots/*')] + for s in old_screenshots: + print(f"Removing old screenshot {s}") + Path(s).unlink() + + print("Copying new screenshots to target directory...") + shutil.copytree(screenshots_dir, target_dir, dirs_exist_ok=True) + + subprocess.run(["git", "add", target_dir], cwd=script_dir.parent) + subprocess.run(["git", "status"], cwd=script_dir.parent) + +finally: + subprocess.run(["./screenshot-demo-mode.sh", "off"], cwd=script_dir)