Compare commits

...

12 Commits

Author SHA1 Message Date
Imran
a56069e881 Merge pull request #2537 from ImranR98/dev
Fix versionCode issue (#2505) + Flutter upgrades
2025-09-12 15:16:01 -04:00
Imran Remtulla
a34e45363b Fix versionCode issue (#2505) + Flutter upgrades 2025-09-12 15:13:20 -04:00
Imran
e1a89f5f67 Merge pull request #2531 from ar-lex/feature/3rd-party-fdroid-per-app-author
Add per-application author parsing for third-party F-Droid repos (#2527)
2025-09-12 14:44:10 -04:00
Imran
f7f6e0cde7 Merge pull request #2532 from ar-lex/feature/3rd-party-fdroid-changelog
Support changelog field for third-party F-Droid repos (#2528)
2025-09-12 14:44:04 -04:00
Alexey Arutyunov
5a58522bf6 Support changelog field for third-party F-Droid repos (#2528) 2025-09-12 20:39:23 +02:00
Alexey Arutyunov
9347af2090 Add per-application author parsing for third-party F-Droid repos (#2527) 2025-09-12 20:33:49 +02:00
Imran
b294e57367 Merge pull request #2530 from ar-lex/feature/3rd-party-fdroid-suggested-version
Implement suggested version code for third-party F-Droid repos (#2524)
2025-09-12 14:23:30 -04:00
Imran
4234e16432 Merge pull request #2533 from solokot/main
Translation: update ru.json
2025-09-12 14:21:10 -04:00
Imran
a64f2e1af7 Merge pull request #2522 from bluefly000/japanese-translation
Update ja.json
2025-09-12 14:20:50 -04:00
solokot
926462407c Translation: update ru.json
Fix machine translation
2025-09-12 09:57:50 +03:00
Alexey Arutyunov
1b499700fd Implement suggested version code for third-party F-Droid repos (#2524)
Enable it by default for both official and third-party F-Droid sources.

Reuse trySelectingSuggestedVersionCode label from official F-Droid repository source.
2025-09-11 23:34:28 +02:00
bluefly000
930a4b411e Update ja.json 2025-09-06 18:54:11 +09:00
7 changed files with 70 additions and 41 deletions

View File

@@ -1,6 +1,7 @@
import java.io.FileInputStream
import java.util.Properties
import com.android.build.api.variant.FilterConfiguration.FilterType.*
import com.android.build.gradle.internal.api.ApkVariantOutputImpl
plugins {
id("com.android.application")
@@ -86,18 +87,17 @@ android {
val abiCodes = mapOf("x86_64" to 1, "armeabi-v7a" to 2, "arm64-v8a" to 3)
androidComponents {
onVariants { variant ->
variant.outputs.forEach { output ->
val name = output.filters.find { it.filterType == ABI }?.identifier
val baseAbiCode = abiCodes[name] ?: 0
if (baseAbiCode != null) {
output.versionCode.set(baseAbiCode + ((output.versionCode.get() ?: 0) * 10))
}
android.applicationVariants.configureEach {
val variant = this
variant.outputs.forEach { output ->
val abiVersionCode = abiCodes[output.filters.find { it.filterType == "ABI" }?.identifier]
if (abiVersionCode != null) {
(output as ApkVariantOutputImpl).versionCodeOverride = variant.versionCode * 10 + abiVersionCode
}
}
}
dependencies {
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5")
}

View File

@@ -335,7 +335,7 @@
"foregroundService": "Obtainium フォアグラウンドサービス",
"foregroundServiceExplanation": "アップデート確認にフォアグラウンドサービスを使用する(より信頼性が高いが、より電力を消費する)",
"fgServiceNotice": "この通知は、バックグラウンドでアップデートを確認するために必要ですOSの設定で非表示にできます。",
"excludeSecrets": "秘密を除く",
"excludeSecrets": "シークレットを除く",
"removeAppQuestion": {
"one": "アプリを削除しますか?",
"other": "アプリを削除しますか?"

View File

@@ -253,8 +253,8 @@
"backgroundUpdateLimitsExplanation": "Успешность фоновой установки можно определить только после открытия Obtainium",
"verifyLatestTag": "Проверять метку «latest»",
"intermediateLinkRegex": "Фильтр для «промежуточной» ссылки для посещения",
"filterByLinkText": "Фильтрация ссылок по тексту ссылки",
"matchLinksOutsideATags": "Сопоставляйте ссылки вне тегов <a>",
"filterByLinkText": "Фильтровать ссылки по тексту ссылки",
"matchLinksOutsideATags": "Сопоставлять ссылки вне тегов <a>",
"intermediateLinkNotFound": "Промежуточная ссылка не найдена",
"intermediateLink": "Промежуточная ссылка",
"exemptFromBackgroundUpdates": "Исключить из фоновых обновлений (если включено)",

View File

@@ -32,6 +32,7 @@ class FDroid extends AppSource {
GeneratedFormSwitch(
'trySelectingSuggestedVersionCode',
label: tr('trySelectingSuggestedVersionCode'),
defaultValue: true,
),
],
[

View File

@@ -29,6 +29,13 @@ class FDroidRepo extends AppSource {
defaultValue: false,
),
],
[
GeneratedFormSwitch(
'trySelectingSuggestedVersionCode',
label: tr('trySelectingSuggestedVersionCode'),
defaultValue: true,
),
],
];
}
@@ -170,6 +177,7 @@ class FDroidRepo extends AppSource {
}
standardUrl = removeQueryParamsFromUrl(standardUrl);
bool pickHighestVersionCode = additionalSettings['pickHighestVersionCode'];
bool trySelectingSuggestedVersionCode = additionalSettings['trySelectingSuggestedVersionCode'];
if (appIdOrName == null) {
throw NoReleasesError();
}
@@ -207,38 +215,58 @@ class FDroidRepo extends AppSource {
foundApps[0].querySelector('name')?.innerHtml ?? appId;
var appName = foundApps[0].querySelector('name')?.innerHtml ?? appId;
var releases = foundApps[0].querySelectorAll('package');
if (releases.isEmpty) {
throw NoReleasesError();
}
String? changeLog = foundApps[0].querySelector('changelog')?.innerHtml;
String? latestVersion = releases[0].querySelector('version')?.innerHtml;
String? added = releases[0].querySelector('added')?.innerHtml;
DateTime? releaseDate = added != null ? DateTime.parse(added) : null;
if (latestVersion == null) {
throw NoVersionError();
}
var latestVersionReleases = releases
.where(
(element) =>
element.querySelector('version')?.innerHtml == latestVersion &&
element.querySelector('apkname') != null,
)
.toList();
if (latestVersionReleases.length > 1 && pickHighestVersionCode) {
latestVersionReleases.sort((e1, e2) {
return int.parse(
e2.querySelector('versioncode')!.innerHtml,
).compareTo(int.parse(e1.querySelector('versioncode')!.innerHtml));
});
latestVersionReleases = [latestVersionReleases[0]];
String? marketvercodeStr = foundApps[0].querySelector('marketvercode')?.innerHtml;
int? marketvercode = int.tryParse(marketvercodeStr ?? '');
List selectedReleases = [];
if (trySelectingSuggestedVersionCode && marketvercode != null) {
selectedReleases = releases.where((e) =>
int.tryParse(e.querySelector('versioncode')?.innerHtml ?? '') == marketvercode &&
e.querySelector('apkname') != null
).toList();
}
List<String> apkUrls = latestVersionReleases
String? appAuthorName = foundApps[0].querySelector('author')?.innerHtml;
if (appAuthorName != null) {
authorName = appAuthorName;
}
if (selectedReleases.isEmpty) {
selectedReleases = releases.where((e) =>
e.querySelector('version')?.innerHtml == latestVersion &&
e.querySelector('apkname') != null
).toList();
if (selectedReleases.length > 1 && pickHighestVersionCode) {
selectedReleases.sort((e1, e2) {
return int.parse(e2.querySelector('versioncode')!.innerHtml)
.compareTo(int.parse(e1.querySelector('versioncode')!.innerHtml));
});
selectedReleases = [selectedReleases[0]];
}
}
String? selectedVersion = selectedReleases[0].querySelector('version')?.innerHtml;
if (selectedVersion == null) {
throw NoVersionError();
}
String? added = selectedReleases[0].querySelector('added')?.innerHtml;
DateTime? releaseDate = added != null ? DateTime.parse(added) : null;
List<String> apkUrls = selectedReleases
.map(
(e) =>
'${res.request!.url.toString().split('/').reversed.toList().sublist(1).reversed.join('/')}/${e.querySelector('apkname')!.innerHtml}',
)
.toList();
return APKDetails(
latestVersion,
selectedVersion,
getApkUrlsFromUrls(apkUrls),
AppNames(authorName, appName),
releaseDate: releaseDate,
changeLog: changeLog,
);
} else {
throw getObtainiumHttpError(res);

View File

@@ -232,10 +232,10 @@ packages:
dependency: "direct main"
description:
name: dynamic_color
sha256: eae98052fa6e2826bdac3dd2e921c6ce2903be15c6b7f8b6d8a5d49b5086298d
sha256: "43a5a6679649a7731ab860334a5812f2067c2d9ce6452cf069c5e0c25336c17c"
url: "https://pub.dev"
source: hosted
version: "1.7.0"
version: "1.8.1"
easy_localization:
dependency: "direct main"
description:
@@ -288,10 +288,10 @@ packages:
dependency: "direct main"
description:
name: file_picker
sha256: e7e16c9d15c36330b94ca0e2ad8cb61f93cd5282d0158c09805aed13b5452f22
sha256: f2d9f173c2c14635cc0e9b14c143c49ef30b4934e8d1d274d6206fcb0086a06f
url: "https://pub.dev"
source: hosted
version: "10.3.2"
version: "10.3.3"
fixnum:
dependency: transitive
description:
@@ -572,10 +572,10 @@ packages:
dependency: transitive
description:
name: leak_tracker
sha256: "8dcda04c3fc16c14f48a7bb586d4be1f0d1572731b6d81d51772ef47c02081e0"
sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de"
url: "https://pub.dev"
source: hosted
version: "11.0.1"
version: "11.0.2"
leak_tracker_flutter_testing:
dependency: transitive
description:
@@ -1059,10 +1059,10 @@ packages:
dependency: transitive
description:
name: url_launcher_android
sha256: "69ee86740f2847b9a4ba6cffa74ed12ce500bbe2b07f3dc1e643439da60637b7"
sha256: "07cffecb7d68cbc6437cd803d5f11a86fe06736735c3dfe46ff73bcb0f958eed"
url: "https://pub.dev"
source: hosted
version: "6.3.18"
version: "6.3.21"
url_launcher_ios:
dependency: transitive
description:
@@ -1155,10 +1155,10 @@ packages:
dependency: transitive
description:
name: webview_flutter_android
sha256: "9a25f6b4313978ba1c2cda03a242eea17848174912cfb4d2d8ee84a556f248e3"
sha256: "3c4eb4fcc252b40c2b5ce7be20d0481428b70f3ff589b0a8b8aaeb64c6bed701"
url: "https://pub.dev"
source: hosted
version: "4.10.1"
version: "4.10.2"
webview_flutter_platform_interface:
dependency: transitive
description:
@@ -1209,4 +1209,4 @@ packages:
version: "6.3.0"
sdks:
dart: ">=3.9.0 <4.0.0"
flutter: ">=3.29.0"
flutter: ">=3.35.0"