From 91ca2e6672a38c667dbd29ecd6503dece00eecc5 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Mon, 26 May 2025 14:01:50 +0200 Subject: [PATCH 1/3] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-ar/strings.xml | 2 ++ app/src/main/res/values-da/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-ja/strings.xml | 6 +++--- app/src/main/res/values-ps/strings.xml | 27 +++++++++++++++++++++++++- 5 files changed, 33 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 9122f4767..5025b94cb 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -13,6 +13,7 @@ * Hhaboh162002 * Kassem7899 * LaMagiaaa +* Lolekek * Meno25 * Mido * Monrokhoury @@ -853,6 +854,7 @@ نقاش اكتب شيئًا عن العنصر \'%1$s\'. سيكون مرئيًا للعامة. \'%1$s\' لم يعد موجودًا، ولا يمكن التقاط صورة له أبدًا. + \'%1$s\' في مكان آخر. \'%1$s\' موجود في مكان مختلف. يرجى تحديد المكان الصحيح أدناه، وإذا أمكن، اكتب خط العرض وخط الطول الصحيحين. مشكلة أو معلومات أخرى (يرجى التوضيح أدناه). سيتم نشر تعليقاتك على صفحة الويكي التالية: <a href=\"https://commons.wikimedia.org/wiki/Commons:Mobile_app/Feedback\">Commons:Mobile app/Feedback</a> diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 106959d04..bc2b23dbf 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -789,6 +789,7 @@ Tal Skriv noget om elementet \'%1$s\'. Det vil være offentligt synligt. \'%1$s\' eksisterer ikke længere, der vil aldrig kunne tages et billede af det. + \'%1$s\' ligger et andet sted. \'%1$s\' ligger et andet sted. Angiv venligst det korrekte sted nedenfor, og skriv om muligt den korrekte bredde- og længdegrad. Andet problem eller anden information (forklar venligst nedenfor). Din feedback bliver slået op på følgende wiki-side: <a href=\"https://commons.wikimedia.org/wiki/Commons:Mobile_app/Feedback\">Commons:Mobile app/Feedback</a> diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index d8854df10..9603f1806 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -829,6 +829,7 @@ Discussion Écrivez quelque chose à propos de l’élément « %1$s ». Il sera visible publiquement. \'%1$s\' n\'existe plus, aucune photo ne pourra jamais en être prise. + \'%1$s\' est à un endroit différent. \'%1$s\' se trouve à un endroit différent. Veuillez indiquer l\'endroit correct ci-dessous et, si possible, indiquez la latitude et la longitude correctes. Autre problème ou information (merci d\'expliquer ci-dessous). Vos commentaires sont publiés sur la page wiki suivante : <a href=\"https://commons.wikimedia.org/wiki/Commons:Mobile_app/Feedback\">Commons:Mobile app/Feedback</a> diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 967b49e8d..662ddcd23 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -303,7 +303,7 @@ やり直す 以下のとおり、近くにウィキペディアの記事に使う写真が足りない場所があります。\n\n\'この近くを検索\' ボタンを押すと、地図をロックしてその地点周辺の検索結果を表示します。 この場所の写真を募集中です。 - この場所の写真はすでにあります。 + この場所の写真は既にあります。 この場所はもうありません 画像がありません 画像の読み込み中にエラーが発生しました @@ -393,7 +393,7 @@ 全部で%2$d件のうち%1$d件目の手順:%3$s 次へ 前へ - %1$s という題名のファイルはすでに保存されています。処理をほんとうに続けますか?\n\n注記:ファイル名には適切な接頭辞が自動的に付与されます。 + %1$s という名前のファイルは既に存在します。本当に処理を続行してよろしいですか?\n\n注: ファイル名には適切な接尾辞が自動的に付加されます。 お使いの機器に適したアプリが見つかりませんでした。この機能を使用できる地図アプリをインストールしてください。 画像 位置 @@ -668,7 +668,7 @@ あなたのフィードバック アップロード不可としてマーク これ以上画像が見つかりません - この画像はすでにアップロードされています + この画像は既にアップロードされています この画像をアップロード用に選択できません 画像が選択されました 報告 diff --git a/app/src/main/res/values-ps/strings.xml b/app/src/main/res/values-ps/strings.xml index 83d30e8b7..a9ecd54f9 100644 --- a/app/src/main/res/values-ps/strings.xml +++ b/app/src/main/res/values-ps/strings.xml @@ -143,7 +143,9 @@ وېشنيزه ملگرو بياکتنه په اړه - <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">د پټنتيا تگلاره</a> + د ويکي‌رسنۍ خونديځ کاريال يو پرانيستې سرچينې کاريال دی چې د ويکي‌رسنۍ ټولنې د بسپنه ورکوونکو او خپل‌خوښو کارنانو له خوا جوړ شوی او ساتل کېږي. د ويکي‌رسنۍ بنسټ د دې کاريال په جوړولو، پراختيا او ساتنه کې ښکېل نه دی. + د بگ راپور او وړانديزونو لپاره يوه <a href=\"%1$s\">گيټ هاب ستونزه</a> جوړه کړئ. + د پټنتيا تگلار په اړه غبرگون لېږنه (برېښليک له لارې) هيڅ برېښليک سرچينه نه ده ځای پرځای شوې @@ -161,13 +163,36 @@ ځانگړي کونگ-ورته وېشنه ۳.۰ ځانگړي کونگ ۳.۰ CC BY 3.0 + ستاسو انځورونه د نړۍ په گوټ گوټ کې خلکو ته زده کړه ورکوي! + مهرباني وکړئ هغه انځورونه راپورته کړئ چې په بشپړ ډول تاسو اخيستي يا جوړ کړې وي: + طبيعي څيزونه (گلان، څاروي، غرونه) + گټور څيزونه (بايسيکلونه، اورگډو تمځايونه) + نوميالي وگړي (ستاسو ښاروال، اولمپيک لوبغاړی چې تاسو ورسره وليدل) + مهرباني وکړئ مه يې راپورته کوئ: + د خپلو ملگرو ځان‌انځورنه او انځورونه + هغه انځورنه چې تاسو له اينټرنېټ څخه راکښته کړې وي + د ملکيتي کاريالونو سکرين‌شاټونه + د پورته کولو بېلگه: + سرليک: سيډني اوپېرا هاوس + څرگنداوی: د خليج له خوا د سيډني اوپېرا هاوس ليدنه + وېشنيزې: له لوېديځ څخه د سېډني اوپېرا هاوس ، د سېډني اوپېرا هاوس لرليد + خپل انځورونه شريک کړئ. د ويکيپېډيا ليکنو ته ژوند ورکولو کې مرسته وکړئ! + په ويکيپېډيا کې دا انځورونه له ويکيمېډيا خونديځ نه اخيستل شوي دي. + ستاسو انځورونه د نړۍ په گوټ گوټ کې خلکو ته زده کړه ورکوي! + له اينټرنېته د لمېس رېښتو لرونکو موادو او د پوسټرونو، کتاب پوښونو او نورو انځورنو د خپرلو څخه ډډه وکړئ. + ستا په اند ته پوه شوې؟ هو + نور مالومات وېشنيزې رابرسېرېږي... هېڅ هم نه دی ټاکل شوی + هيڅ نيونگ نشته څرگندونه نشته + هيڅ شننه نشته نامعلوم جواز تازه کول + د زېرمه کولو د پرېښولي غوښتنه کول + اړينه پرېښولی: بهرنۍ زېرمه ولولئ. کاريال ستاسو انځورتونه ته پرته له دې لاسرسی نشي موندلی. ښه گواښنه هو From c49c85e68bed7c73efde41728bf6c39cac9be558 Mon Sep 17 00:00:00 2001 From: Sonal Yadav Date: Wed, 28 May 2025 14:23:28 +0530 Subject: [PATCH 2/3] Fix : UninitializedPropertyAccessException (#6248) * Fix crash when uploading a duplicate file * Fix: app crash * added Kdoc * remove line b/w kdoc and function --------- Co-authored-by: Nicolas Raoul --- .../free/nrw/commons/upload/UploadActivity.kt | 4 ++- .../nrw/commons/upload/UploadPresenter.kt | 29 +++++++++++++++++-- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt index ee0b21210..38e7dace8 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt @@ -173,6 +173,9 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + // Ensure basicKvStoreFactory is always initialized before use + presenter?.setupBasicKvStoreFactory { BasicKvStore(this@UploadActivity, it) } + _binding = ActivityUploadBinding.inflate(layoutInflater) setContentView(binding.root) @@ -903,7 +906,6 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C // Save the user's choice to not show the dialog again defaultKvStore.putBoolean("hasAlreadyLaunchedCategoriesDialog", true) } - presenter!!.setupBasicKvStoreFactory { BasicKvStore(this@UploadActivity, it) } presenter!!.checkImageQuality(0) UploadMediaPresenter.isCategoriesDialogShowing = false } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.kt index 5d721f408..251f868ad 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.kt @@ -34,8 +34,7 @@ class UploadPresenter @Inject internal constructor( private val compositeDisposable = CompositeDisposable() - lateinit var basicKvStoreFactory: (String) -> BasicKvStore - + private var basicKvStoreFactory: ((String) -> BasicKvStore)? = null /** * Called by the submit button in [UploadActivity] */ @@ -132,14 +131,38 @@ class UploadPresenter @Inject internal constructor( basicKvStoreFactory = factory } + /** + * Returns the current BasicKvStore factory or throws if not initialized. + * + * @throws IllegalStateException if basicKvStoreFactory has not been initialized. + */ + private fun getBasicKvStoreFactory(): (String) -> BasicKvStore { + return basicKvStoreFactory ?: throw IllegalStateException("basicKvStoreFactory has not been initialized") + } + + /** + * Ensures that the BasicKvStore factory has been initialized before use. + * + * @throws IllegalStateException if the factory is null. + */ + private fun requireFactoryInitialized() { + val field = this::class.java.getDeclaredField("basicKvStoreFactory") + field.isAccessible = true + val value = field.get(this) + if (value == null) { + throw IllegalStateException("basicKvStoreFactory must be initialized before use. Please call setupBasicKvStoreFactory() before using presenter methods that require it.") + } + } + /** * Calls checkImageQuality of UploadMediaPresenter to check image quality of next image * * @param uploadItemIndex Index of next image, whose quality is to be checked */ override fun checkImageQuality(uploadItemIndex: Int) { + requireFactoryInitialized() repository.getUploadItem(uploadItemIndex)?.let { - presenter.setupBasicKvStoreFactory(basicKvStoreFactory) + presenter.setupBasicKvStoreFactory(getBasicKvStoreFactory()) presenter.checkImageQuality(it, uploadItemIndex) } } From ed1485ca2223a4e5859e29e83860e9cd99b2cb7a Mon Sep 17 00:00:00 2001 From: Rohit Verma <101377978+rohit9625@users.noreply.github.com> Date: Wed, 28 May 2025 17:13:13 +0530 Subject: [PATCH 3/3] Migrated from Groovy to Kotlin DSL and upgrade AGP version (#6322) * chore: migrate groovy build files to Kotlin DSL and upgrade AGP chore: use version catalog to manage dependencies chore: move plugins to version catalog remove deprecated way of enabling build-config and redundant code chore: setup triplet-play plugin configuration refactor: move dependency block and tasks to the end of build file refactor: move dependency block and mark redundant dependencies * cleanup: remove redundant dependencies from build file * cleanup: remove git utils file as the functions moved to build file --------- Co-authored-by: Nicolas Raoul --- app/build.gradle | 431 ---------------------- app/build.gradle.kts | 445 +++++++++++++++++++++++ build.gradle | 29 -- build.gradle.kts | 13 + gitutils.gradle | 26 -- gradle.properties | 14 - gradle/libs.versions.toml | 209 +++++++++++ gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle | 1 - settings.gradle.kts | 17 + 10 files changed, 685 insertions(+), 502 deletions(-) delete mode 100644 app/build.gradle create mode 100644 app/build.gradle.kts delete mode 100644 build.gradle create mode 100644 build.gradle.kts delete mode 100644 gitutils.gradle create mode 100644 gradle/libs.versions.toml delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index 34dd7f008..000000000 --- a/app/build.gradle +++ /dev/null @@ -1,431 +0,0 @@ -plugins { - id 'com.github.triplet.play' version '2.7.2' apply false -} -apply from: '../gitutils.gradle' -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply plugin: 'kotlin-kapt' -apply plugin: 'kotlin-parcelize' -apply from: "$rootDir/jacoco.gradle" - -def isRunningOnTravisAndIsNotPRBuild = System.getenv("CI") == "true" && file('../play.p12').exists() - -if (isRunningOnTravisAndIsNotPRBuild) { - apply plugin: 'com.github.triplet.play' -} - -dependencies { - - // Utils - implementation 'in.yuvi:http.fluent:1.3' - implementation 'com.google.code.gson:gson:2.8.5' - implementation ("com.squareup.okhttp3:okhttp:$OKHTTP_VERSION!!"){ - // Forcing dependency versions using force = true on a first-level dependency has been deprecated. - // Ref: https://docs.gradle.org/7.5/userguide/upgrading_version_5.html#forced_dependencies - //force = true //API 19 support - } - implementation 'com.squareup.retrofit2:retrofit:2.8.1' - implementation "com.squareup.retrofit2:converter-gson:2.8.1" - implementation "com.squareup.retrofit2:adapter-rxjava2:2.8.1" - implementation 'com.squareup.okio:okio:2.2.2' - implementation 'io.reactivex.rxjava2:rxandroid:2.1.0' - implementation 'io.reactivex.rxjava2:rxjava:2.2.3' - implementation 'com.jakewharton.rxbinding2:rxbinding:2.1.1' - implementation 'com.jakewharton.rxbinding3:rxbinding-appcompat:3.0.0' - implementation 'com.jakewharton.rxbinding2:rxbinding-support-v4:2.1.1' - implementation 'com.jakewharton.rxbinding2:rxbinding-appcompat-v7:2.1.1' - implementation 'com.jakewharton.rxbinding2:rxbinding-design:2.1.1' - implementation 'com.facebook.fresco:fresco:1.13.0' - implementation 'org.apache.commons:commons-lang3:3.8.1' - - // UI - implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar' - implementation 'com.github.chrisbanes:PhotoView:2.0.0' - implementation 'com.github.pedrovgs:renderers:3.3.3' - implementation "org.maplibre.gl:android-sdk:$MAPLIBRE_VERSION" - implementation 'org.maplibre.gl:android-plugin-scalebar-v9:1.0.0' - - implementation 'com.jakewharton.timber:timber:4.7.1' - implementation 'com.github.deano2390:MaterialShowcaseView:1.2.0' - implementation "com.google.android.material:material:1.12.0" - implementation 'com.karumi:dexter:5.0.0' - implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' - implementation 'androidx.compose.ui:ui-tooling-preview' - androidTestImplementation 'androidx.compose.ui:ui-test-junit4' - - // Jetpack Compose - def composeBom = platform('androidx.compose:compose-bom:2024.11.00') - - implementation "androidx.activity:activity-compose:1.9.3" - implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.8.4" - implementation (composeBom) - implementation "androidx.compose.runtime:runtime" - implementation "androidx.compose.ui:ui" - implementation "androidx.compose.ui:ui-viewbinding" - implementation "androidx.compose.ui:ui-graphics" - implementation "androidx.compose.ui:ui-tooling" - implementation "androidx.compose.foundation:foundation" - implementation "androidx.compose.foundation:foundation-layout" - implementation "androidx.compose.material3:material3" - androidTestImplementation(composeBom) - - implementation "com.hannesdorfmann:adapterdelegates4-kotlin-dsl-viewbinding:$ADAPTER_DELEGATES_VERSION" - implementation "com.hannesdorfmann:adapterdelegates4-pagination:$ADAPTER_DELEGATES_VERSION" - implementation "androidx.paging:paging-runtime-ktx:$PAGING_VERSION" - testImplementation "androidx.paging:paging-common-ktx:$PAGING_VERSION" - implementation "androidx.paging:paging-rxjava2-ktx:$PAGING_VERSION" - implementation "androidx.recyclerview:recyclerview:1.2.0-alpha02" - implementation "com.squareup.okhttp3:okhttp-ws:$OKHTTP_VERSION" - - // Logging - implementation 'ch.acra:acra-dialog:5.8.4' - implementation 'ch.acra:acra-mail:5.8.4' - implementation 'org.slf4j:slf4j-api:1.7.25' - api('com.github.tony19:logback-android-classic:1.1.1-6') { - exclude group: 'com.google.android', module: 'android' - } - implementation "com.squareup.okhttp3:logging-interceptor:$OKHTTP_VERSION" - - // Dependency injector - implementation "com.google.dagger:dagger-android:$DAGGER_VERSION" - implementation "com.google.dagger:dagger-android-support:$DAGGER_VERSION" - debugImplementation 'androidx.compose.ui:ui-tooling' - debugImplementation 'androidx.compose.ui:ui-test-manifest' - kapt "com.google.dagger:dagger-android-processor:$DAGGER_VERSION" - kapt "com.google.dagger:dagger-compiler:$DAGGER_VERSION" - annotationProcessor "com.google.dagger:dagger-android-processor:$DAGGER_VERSION" - - implementation "org.jetbrains.kotlin:kotlin-reflect:$KOTLIN_VERSION" - - //Mocking - testImplementation 'com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0' - testImplementation 'org.mockito:mockito-inline:5.2.0' - testImplementation 'org.mockito:mockito-core:5.6.0' - testImplementation "org.powermock:powermock-module-junit4:2.0.9" - testImplementation "org.powermock:powermock-api-mockito2:2.0.9" - testImplementation("io.mockk:mockk:1.13.5") - - // Unit testing - testImplementation 'junit:junit:4.13.2' - testImplementation 'org.robolectric:robolectric:4.11.1' - testImplementation 'androidx.test:core:1.5.0' - testImplementation "androidx.test:runner:1.5.2" - testImplementation 'androidx.test.ext:junit:1.1.5' - testImplementation "androidx.test:rules:1.5.0" - testImplementation "com.squareup.okhttp3:mockwebserver:$OKHTTP_VERSION" - testImplementation "com.jraska.livedata:testing-ktx:1.2.0" - testImplementation "androidx.arch.core:core-testing:2.2.0" - testImplementation "org.junit.jupiter:junit-jupiter-api:5.10.0" - testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.10.0" - testImplementation 'com.facebook.soloader:soloader:0.10.5' - testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3" - debugImplementation("androidx.fragment:fragment-testing-manifest:1.6.2") - androidTestImplementation("androidx.fragment:fragment-testing:1.6.2") - testImplementation "commons-io:commons-io:2.6" - - // Android testing - androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0-alpha04' - androidTestImplementation 'androidx.test.espresso:espresso-intents:3.4.0' - androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.5.0-alpha04' - androidTestImplementation 'androidx.test:runner:1.4.0' - androidTestImplementation 'androidx.test:rules:1.4.1-alpha04' - androidTestImplementation 'androidx.test:core:1.4.0' - androidTestImplementation 'androidx.test.ext:junit:1.1.3' - androidTestImplementation 'androidx.annotation:annotation:1.3.0' - androidTestImplementation 'com.squareup.okhttp3:mockwebserver:4.8.0' - androidTestImplementation "androidx.test.uiautomator:uiautomator:2.2.0" - androidTestUtil 'androidx.test:orchestrator:1.4.1' - - // Debugging - debugImplementation "com.squareup.leakcanary:leakcanary-android:$LEAK_CANARY_VERSION" - - // Support libraries - implementation "com.google.android.material:material:1.1.0-alpha04" - implementation "androidx.browser:browser:1.3.0" - implementation "androidx.cardview:cardview:1.0.0" - implementation 'androidx.constraintlayout:constraintlayout:1.1.3' - implementation 'androidx.exifinterface:exifinterface:1.3.7' - implementation "androidx.core:core-ktx:$CORE_KTX_VERSION" - implementation 'com.simplecityapps:recyclerview-fastscroll:2.0.1' - - //swipe_layout - implementation 'com.daimajia.swipelayout:library:1.2.0@aar' - - //Room - implementation "androidx.room:room-runtime:$ROOM_VERSION" - implementation "androidx.room:room-ktx:$ROOM_VERSION" - implementation "androidx.room:room-rxjava2:$ROOM_VERSION" - kapt "androidx.room:room-compiler:$ROOM_VERSION" - // For Kotlin use kapt instead of annotationProcessor - testImplementation "androidx.arch.core:core-testing:2.1.0" - - // Pref - // Java language implementation - implementation "androidx.preference:preference:$PREFERENCE_VERSION" - // Kotlin - implementation "androidx.preference:preference-ktx:$PREFERENCE_VERSION" - //Android Media - implementation 'com.github.juanitobananas:AndroidMediaUtil:v1.0-1' - - implementation "androidx.multidex:multidex:$MULTIDEX_VERSION" - - def work_version = "2.8.1" - // Kotlin + coroutines - implementation "androidx.work:work-runtime-ktx:$work_version" - implementation("androidx.work:work-runtime:$work_version") - testImplementation "androidx.work:work-testing:$work_version" - - //Glide - implementation 'com.github.bumptech.glide:glide:4.16.0' - annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0' - kaptTest "androidx.databinding:databinding-compiler:8.0.2" - kaptAndroidTest "androidx.databinding:databinding-compiler:8.0.2" - - implementation("io.github.coordinates2country:coordinates2country-android:1.8") { exclude group: 'com.google.android', module: 'android' } - - //OSMDroid - implementation ("org.osmdroid:osmdroid-android:$OSMDROID_VERSION") - constraints { - implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0") { - because("kotlin-stdlib-jdk7 is now a part of kotlin-stdlib") - } - implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0") { - because("kotlin-stdlib-jdk8 is now a part of kotlin-stdlib") - } - } -} - -task disableAnimations(type: Exec) { - def adb = "$System.env.ANDROID_HOME/platform-tools/adb" - commandLine "$adb", 'shell', 'settings', 'put', 'global', 'window_animation_scale', '0' - commandLine "$adb", 'shell', 'settings', 'put', 'global', 'transition_animation_scale', '0' - commandLine "$adb", 'shell', 'settings', 'put', 'global', 'animator_duration_scale', '0' -} - -project.gradle.taskGraph.whenReady { - connectedBetaDebugAndroidTest.dependsOn disableAnimations - connectedProdDebugAndroidTest.dependsOn disableAnimations -} - -android { - compileSdkVersion 34 - - defaultConfig { - //applicationId 'fr.free.nrw.commons' - - versionCode 1051 - versionName '5.4.0' - setProperty("archivesBaseName", "app-commons-v$versionName-" + getBranchName()) - - minSdkVersion 21 - targetSdkVersion 34 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - testInstrumentationRunnerArguments clearPackageData: 'true' - - multiDexEnabled true - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - - vectorDrawables.useSupportLibrary = true - } - packagingOptions { - jniLibs { - excludes += ['META-INF/androidx.*'] - } - resources { - excludes += ['META-INF/androidx.*', 'META-INF/proguard/androidx-annotations.pro', '/META-INF/LICENSE.md', '/META-INF/LICENSE-notice.md'] - } - } - - - testOptions { - animationsDisabled true - - unitTests { - returnDefaultValues = true - includeAndroidResources = true - } - - unitTests.all { - jvmArgs '-noverify' - } - } - - sourceSets { - // use kotlin only in tests (for now) - test.java.srcDirs += 'src/test/kotlin' - - // use main assets and resources in test - test.assets.srcDirs += 'src/main/assets' - test.resources.srcDirs += 'src/main/resoures' - } - - signingConfigs { - release - } - - buildTypes { - release { - minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' - testProguardFile 'test-proguard-rules.txt' - signingConfig signingConfigs.debug - if (isRunningOnTravisAndIsNotPRBuild) { - signingConfig signingConfigs.release - } - } - debug { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' - testProguardFile 'test-proguard-rules.txt' - versionNameSuffix "-debug-" + getBranchName() - enableUnitTestCoverage true - enableAndroidTestCoverage true - } - } - - if (isRunningOnTravisAndIsNotPRBuild) { - // configure keystore based on env vars in Travis for automated alpha builds - signingConfigs.release.storeFile = file("../nr-commons.keystore") - signingConfigs.release.storePassword = System.getenv("keystore_password") - signingConfigs.release.keyAlias = System.getenv("key_alias") - signingConfigs.release.keyPassword = System.getenv("key_password") - } - - configurations.all { - resolutionStrategy.force 'androidx.annotation:annotation:1.1.0' - resolutionStrategy.force 'com.jakewharton.timber:timber:4.7.1' - resolutionStrategy.force 'androidx.fragment:fragment:1.3.6' - exclude module: 'okhttp-ws' - } - flavorDimensions 'tier' - productFlavors { - prod { - - applicationId 'fr.free.nrw.commons' - - buildConfigField "String", "WIKIMEDIA_API_POTD", "\"https://commons.wikimedia.org/w/api.php?action=featuredfeed&feed=potd&feedformat=rss&language=en\"" - buildConfigField "String", "WIKIMEDIA_API_HOST", "\"https://commons.wikimedia.org/w/api.php\"" - buildConfigField "String", "WIKIDATA_API_HOST", "\"https://www.wikidata.org/w/api.php\"" - buildConfigField "String", "WIKIDATA_URL", "\"https://www.wikidata.org\"" - buildConfigField "String", "WIKIMEDIA_FORGE_API_HOST", "\"https://tools.wmflabs.org/\"" - buildConfigField "String", "WIKIMEDIA_CAMPAIGNS_URL", "\"https://raw.githubusercontent.com/commons-app/campaigns/master/campaigns.json\"" - buildConfigField "String", "IMAGE_URL_BASE", "\"https://upload.wikimedia.org/wikipedia/commons\"" - buildConfigField "String", "HOME_URL", "\"https://commons.wikimedia.org/wiki/\"" - buildConfigField "String", "COMMONS_URL", "\"https://commons.wikimedia.org\"" - buildConfigField "String", "WIKIDATA_URL", "\"https://www.wikidata.org\"" - buildConfigField "String", "MOBILE_HOME_URL", "\"https://commons.m.wikimedia.org/wiki/\"" - buildConfigField "String", "MOBILE_META_URL", "\"https://meta.m.wikimedia.org/wiki/\"" - buildConfigField "String", "SIGNUP_LANDING_URL", "\"https://commons.m.wikimedia.org/w/index.php?title=Special:CreateAccount&returnto=Main+Page&returntoquery=welcome%3Dyes\"" - buildConfigField "String", "SIGNUP_SUCCESS_REDIRECTION_URL", "\"https://commons.m.wikimedia.org/w/index.php?title=Main_Page&welcome=yes\"" - buildConfigField "String", "FORGOT_PASSWORD_URL", "\"https://commons.wikimedia.org/wiki/Special:PasswordReset\"" - buildConfigField "String", "PRIVACY_POLICY_URL", "\"https://commons-app.github.io/privacy-policy\"" - buildConfigField "String", "FILE_USAGES_BASE_URL", "\"https://commons.wikimedia.org/w/api.php?action=query&format=json&formatversion=2\"" - buildConfigField "String", "ACCOUNT_TYPE", "\"fr.free.nrw.commons\"" - buildConfigField "String", "CONTRIBUTION_AUTHORITY", "\"fr.free.nrw.commons.contributions.contentprovider\"" - buildConfigField "String", "MODIFICATION_AUTHORITY", "\"fr.free.nrw.commons.modifications.contentprovider\"" - buildConfigField "String", "CATEGORY_AUTHORITY", "\"fr.free.nrw.commons.categories.contentprovider\"" - buildConfigField "String", "RECENT_SEARCH_AUTHORITY", "\"fr.free.nrw.commons.explore.recentsearches.contentprovider\"" - buildConfigField "String", "RECENT_LANGUAGE_AUTHORITY", "\"fr.free.nrw.commons.recentlanguages.contentprovider\"" - buildConfigField "String", "BOOKMARK_AUTHORITY", "\"fr.free.nrw.commons.bookmarks.contentprovider\"" - buildConfigField "String", "BOOKMARK_LOCATIONS_AUTHORITY", "\"fr.free.nrw.commons.bookmarks.locations.contentprovider\"" - buildConfigField "String", "BOOKMARK_ITEMS_AUTHORITY", "\"fr.free.nrw.commons.bookmarks.items.contentprovider\"" - buildConfigField "String", "COMMIT_SHA", "\"" + getBuildVersion().toString() + "\"" - buildConfigField "String", "TEST_USERNAME", "\"" + getTestUserName() + "\"" - buildConfigField "String", "TEST_PASSWORD", "\"" + getTestPassword() + "\"" - buildConfigField "String", "DEPICTS_PROPERTY", "\"P180\"" - buildConfigField "String", "CREATOR_PROPERTY", "\"P170\"" - dimension 'tier' - } - - beta { - applicationId 'fr.free.nrw.commons.beta' - - // What values do we need to hit the BETA versions of the site / api ? - buildConfigField "String", "WIKIMEDIA_API_POTD", "\"https://commons.wikimedia.org/w/api.php?action=featuredfeed&feed=potd&feedformat=rss&language=en\"" - buildConfigField "String", "WIKIMEDIA_API_HOST", "\"https://commons.wikimedia.beta.wmflabs.org/w/api.php\"" - buildConfigField "String", "WIKIDATA_API_HOST", "\"https://www.wikidata.org/w/api.php\"" - buildConfigField "String", "WIKIDATA_URL", "\"https://www.wikidata.org\"" - buildConfigField "String", "WIKIMEDIA_FORGE_API_HOST", "\"https://tools.wmflabs.org/\"" - buildConfigField "String", "WIKIMEDIA_CAMPAIGNS_URL", "\"https://raw.githubusercontent.com/commons-app/campaigns/master/campaigns_beta_active.json\"" - buildConfigField "String", "IMAGE_URL_BASE", "\"https://upload.beta.wmflabs.org/wikipedia/commons\"" - buildConfigField "String", "HOME_URL", "\"https://commons.wikimedia.beta.wmflabs.org/wiki/\"" - buildConfigField "String", "COMMONS_URL", "\"https://commons.wikimedia.beta.wmflabs.org\"" - buildConfigField "String", "WIKIDATA_URL", "\"https://www.wikidata.org\"" - buildConfigField "String", "MOBILE_HOME_URL", "\"https://commons.m.wikimedia.beta.wmflabs.org/wiki/\"" - buildConfigField "String", "MOBILE_META_URL", "\"https://meta.m.wikimedia.beta.wmflabs.org/wiki/\"" - buildConfigField "String", "SIGNUP_LANDING_URL", "\"https://commons.m.wikimedia.beta.wmflabs.org/w/index.php?title=Special:CreateAccount&returnto=Main+Page&returntoquery=welcome%3Dyes\"" - buildConfigField "String", "SIGNUP_SUCCESS_REDIRECTION_URL", "\"https://commons.m.wikimedia.beta.wmflabs.org/w/index.php?title=Main_Page&welcome=yes\"" - buildConfigField "String", "FORGOT_PASSWORD_URL", "\"https://commons.wikimedia.beta.wmflabs.org/wiki/Special:PasswordReset\"" - buildConfigField "String", "PRIVACY_POLICY_URL", "\"https://commons-app.github.io/privacy-policy\"" - buildConfigField "String", "FILE_USAGES_BASE_URL", "\"https://commons.wikimedia.org/w/api.php?action=query&format=json&formatversion=2\"" - buildConfigField "String", "ACCOUNT_TYPE", "\"fr.free.nrw.commons.beta\"" - buildConfigField "String", "CONTRIBUTION_AUTHORITY", "\"fr.free.nrw.commons.beta.contributions.contentprovider\"" - buildConfigField "String", "MODIFICATION_AUTHORITY", "\"fr.free.nrw.commons.beta.modifications.contentprovider\"" - buildConfigField "String", "CATEGORY_AUTHORITY", "\"fr.free.nrw.commons.beta.categories.contentprovider\"" - buildConfigField "String", "RECENT_SEARCH_AUTHORITY", "\"fr.free.nrw.commons.beta.explore.recentsearches.contentprovider\"" - buildConfigField "String", "RECENT_LANGUAGE_AUTHORITY", "\"fr.free.nrw.commons.beta.recentlanguages.contentprovider\"" - buildConfigField "String", "BOOKMARK_AUTHORITY", "\"fr.free.nrw.commons.beta.bookmarks.contentprovider\"" - buildConfigField "String", "BOOKMARK_LOCATIONS_AUTHORITY", "\"fr.free.nrw.commons.beta.bookmarks.locations.contentprovider\"" - buildConfigField "String", "BOOKMARK_ITEMS_AUTHORITY", "\"fr.free.nrw.commons.beta.bookmarks.items.contentprovider\"" - buildConfigField "String", "COMMIT_SHA", "\"" + getBuildVersion().toString() + "\"" - buildConfigField "String", "TEST_USERNAME", "\"" + getTestUserName() + "\"" - buildConfigField "String", "TEST_PASSWORD", "\"" + getTestPassword() + "\"" - buildConfigField "String", "DEPICTS_PROPERTY", "\"P245962\"" - buildConfigField "String", "CREATOR_PROPERTY", "\"P253075\"" - dimension 'tier' - } - } - - - compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 - } - kotlinOptions { - jvmTarget = "17" - } - - buildToolsVersion buildToolsVersion - - buildFeatures { - viewBinding true - compose true - } - composeOptions { - kotlinCompilerExtensionVersion '1.5.8' - } - namespace 'fr.free.nrw.commons' - lint { - abortOnError false - disable 'MissingTranslation', 'ExtraTranslation' - } -} - -String getTestUserName() { - def propFile = rootProject.file("./local.properties") - def properties = new Properties() - properties.load(new FileInputStream(propFile)) - return properties['TEST_USER_NAME'] -} - -String getTestPassword() { - def propFile = rootProject.file("./local.properties") - def properties = new Properties() - properties.load(new FileInputStream(propFile)) - return properties['TEST_USER_PASSWORD'] -} - -if (isRunningOnTravisAndIsNotPRBuild) { - play { - track = "alpha" - userFraction = 1 - serviceAccountEmail = System.getenv("SERVICE_ACCOUNT_NAME") - serviceAccountCredentials = file("../play.p12") - - resolutionStrategy = "auto" - outputProcessor { // this: ApkVariantOutput - versionNameOverride = "$versionNameOverride.$versionCode" - } - } -} diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 000000000..c74f95fb4 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,445 @@ +import java.util.Properties +import java.io.ByteArrayOutputStream + +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.jetbrains.kotlin.android) + alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.kotlin.parcelize) +} + +apply(from = "$rootDir/jacoco.gradle") + +val isRunningOnTravisAndIsNotPRBuild = System.getenv("CI") == "true" && file("../play.p12").exists() + +if (isRunningOnTravisAndIsNotPRBuild) { + apply(plugin = "com.github.triplet.play") +} + +android { + namespace = "fr.free.nrw.commons" + compileSdk = 34 + + defaultConfig { + applicationId = "fr.free.nrw.commons" + minSdk = 21 + targetSdk = 34 + versionCode = 1043 + versionName = "5.1.2" + + setProperty("archivesBaseName", "app-commons-v$versionName-" + getBranchName()) + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + testInstrumentationRunnerArguments["clearPackageData"] = "true" + + multiDexEnabled = true + + vectorDrawables { + useSupportLibrary = true + } + } + + sourceSets { + getByName("test") { + // Use kotlin only in tests (for now) + java.srcDirs("src/test/kotlin") + + // Use main assets and resources in test + assets.srcDirs("src/main/assets") + resources.srcDirs("src/main/resources") + } + } + + signingConfigs { + create("release") { + // Configure keystore based on env vars in Travis for automated alpha builds + if(isRunningOnTravisAndIsNotPRBuild) { + storeFile = file("../nr-commons.keystore") + storePassword = System.getenv("keystore_password") + keyAlias = System.getenv("key_alias") + keyPassword = System.getenv("key_password") + } + } + } + + buildTypes { + release { + isMinifyEnabled = true + proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.txt") + testProguardFile("test-proguard-rules.txt") + + signingConfig = signingConfigs.getByName("debug") + if (isRunningOnTravisAndIsNotPRBuild) { + signingConfig = signingConfigs.getByName("release") + } + } + debug { + isMinifyEnabled = false + proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.txt") + testProguardFile("test-proguard-rules.txt") + + versionNameSuffix = "-debug-" + getBranchName() + enableUnitTestCoverage = true + enableAndroidTestCoverage = true + } + } + + configurations.all { + resolutionStrategy { + force("androidx.annotation:annotation:1.1.0") + force("com.jakewharton.timber:timber:4.7.1") + force("androidx.fragment:fragment:1.3.6") + } + exclude(module = "okhttp-ws") + } + + flavorDimensions += "tier" + productFlavors { + create("prod") { + dimension = "tier" + applicationId = "fr.free.nrw.commons" + + buildConfigField("String", "WIKIMEDIA_API_POTD", "\"https://commons.wikimedia.org/w/api.php?action=featuredfeed&feed=potd&feedformat=rss&language=en\"") + buildConfigField("String", "WIKIMEDIA_API_HOST", "\"https://commons.wikimedia.org/w/api.php\"") + buildConfigField("String", "WIKIDATA_API_HOST", "\"https://www.wikidata.org/w/api.php\"") + buildConfigField("String", "WIKIDATA_URL", "\"https://www.wikidata.org\"") + buildConfigField("String", "WIKIMEDIA_FORGE_API_HOST", "\"https://tools.wmflabs.org/\"") + buildConfigField("String", "WIKIMEDIA_CAMPAIGNS_URL", "\"https://raw.githubusercontent.com/commons-app/campaigns/master/campaigns.json\"") + buildConfigField("String", "IMAGE_URL_BASE", "\"https://upload.wikimedia.org/wikipedia/commons\"") + buildConfigField("String", "HOME_URL", "\"https://commons.wikimedia.org/wiki/\"") + buildConfigField("String", "COMMONS_URL", "\"https://commons.wikimedia.org\"") + buildConfigField("String", "WIKIDATA_URL", "\"https://www.wikidata.org\"") + buildConfigField("String", "MOBILE_HOME_URL", "\"https://commons.m.wikimedia.org/wiki/\"") + buildConfigField("String", "MOBILE_META_URL", "\"https://meta.m.wikimedia.org/wiki/\"") + buildConfigField("String", "SIGNUP_LANDING_URL", "\"https://commons.m.wikimedia.org/w/index.php?title=Special:CreateAccount&returnto=Main+Page&returntoquery=welcome%3Dyes\"") + buildConfigField("String", "SIGNUP_SUCCESS_REDIRECTION_URL", "\"https://commons.m.wikimedia.org/w/index.php?title=Main_Page&welcome=yes\"") + buildConfigField("String", "FORGOT_PASSWORD_URL", "\"https://commons.wikimedia.org/wiki/Special:PasswordReset\"") + buildConfigField("String", "PRIVACY_POLICY_URL", "\"https://github.com/commons-app/commons-app-documentation/blob/master/android/Privacy-policy.md\"") + buildConfigField("String", "FILE_USAGES_BASE_URL", "\"https://commons.wikimedia.org/w/api.php?action=query&format=json&formatversion=2\"") + buildConfigField("String", "ACCOUNT_TYPE", "\"fr.free.nrw.commons\"") + buildConfigField("String", "CONTRIBUTION_AUTHORITY", "\"fr.free.nrw.commons.contributions.contentprovider\"") + buildConfigField("String", "MODIFICATION_AUTHORITY", "\"fr.free.nrw.commons.modifications.contentprovider\"") + buildConfigField("String", "CATEGORY_AUTHORITY", "\"fr.free.nrw.commons.categories.contentprovider\"") + buildConfigField("String", "RECENT_SEARCH_AUTHORITY", "\"fr.free.nrw.commons.explore.recentsearches.contentprovider\"") + buildConfigField("String", "RECENT_LANGUAGE_AUTHORITY", "\"fr.free.nrw.commons.recentlanguages.contentprovider\"") + buildConfigField("String", "BOOKMARK_AUTHORITY", "\"fr.free.nrw.commons.bookmarks.contentprovider\"") + buildConfigField("String", "BOOKMARK_LOCATIONS_AUTHORITY", "\"fr.free.nrw.commons.bookmarks.locations.contentprovider\"") + buildConfigField("String", "BOOKMARK_ITEMS_AUTHORITY", "\"fr.free.nrw.commons.bookmarks.items.contentprovider\"") + buildConfigField("String", "COMMIT_SHA", "\"" + getBuildVersion().toString() + "\"") + buildConfigField("String", "TEST_USERNAME", "\"" + getTestUserName() + "\"") + buildConfigField("String", "TEST_PASSWORD", "\"" + getTestPassword() + "\"") + buildConfigField("String", "DEPICTS_PROPERTY", "\"P180\"") + buildConfigField("String", "CREATOR_PROPERTY", "\"P170\"") + } + + create("beta") { + dimension = "tier" + applicationId = "fr.free.nrw.commons.beta" + + // What values do we need to hit the BETA versions of the site / api ? + buildConfigField("String", "WIKIMEDIA_API_POTD", "\"https://commons.wikimedia.org/w/api.php?action=featuredfeed&feed=potd&feedformat=rss&language=en\"") + buildConfigField("String", "WIKIMEDIA_API_HOST", "\"https://commons.wikimedia.beta.wmflabs.org/w/api.php\"") + buildConfigField("String", "WIKIDATA_API_HOST", "\"https://www.wikidata.org/w/api.php\"") + buildConfigField("String", "WIKIDATA_URL", "\"https://www.wikidata.org\"") + buildConfigField("String", "WIKIMEDIA_FORGE_API_HOST", "\"https://tools.wmflabs.org/\"") + buildConfigField("String", "WIKIMEDIA_CAMPAIGNS_URL", "\"https://raw.githubusercontent.com/commons-app/campaigns/master/campaigns_beta_active.json\"") + buildConfigField("String", "IMAGE_URL_BASE", "\"https://upload.beta.wmflabs.org/wikipedia/commons\"") + buildConfigField("String", "HOME_URL", "\"https://commons.wikimedia.beta.wmflabs.org/wiki/\"") + buildConfigField("String", "COMMONS_URL", "\"https://commons.wikimedia.beta.wmflabs.org\"") + buildConfigField("String", "WIKIDATA_URL", "\"https://www.wikidata.org\"") + buildConfigField("String", "MOBILE_HOME_URL", "\"https://commons.m.wikimedia.beta.wmflabs.org/wiki/\"") + buildConfigField("String", "MOBILE_META_URL", "\"https://meta.m.wikimedia.beta.wmflabs.org/wiki/\"") + buildConfigField("String", "SIGNUP_LANDING_URL", "\"https://commons.m.wikimedia.beta.wmflabs.org/w/index.php?title=Special:CreateAccount&returnto=Main+Page&returntoquery=welcome%3Dyes\"") + buildConfigField("String", "SIGNUP_SUCCESS_REDIRECTION_URL", "\"https://commons.m.wikimedia.beta.wmflabs.org/w/index.php?title=Main_Page&welcome=yes\"") + buildConfigField("String", "FORGOT_PASSWORD_URL", "\"https://commons.wikimedia.beta.wmflabs.org/wiki/Special:PasswordReset\"") + buildConfigField("String", "PRIVACY_POLICY_URL", "\"https://github.com/commons-app/commons-app-documentation/blob/master/android/Privacy-policy.md\"") + buildConfigField("String", "FILE_USAGES_BASE_URL", "\"https://commons.wikimedia.org/w/api.php?action=query&format=json&formatversion=2\"") + buildConfigField("String", "ACCOUNT_TYPE", "\"fr.free.nrw.commons.beta\"") + buildConfigField("String", "CONTRIBUTION_AUTHORITY", "\"fr.free.nrw.commons.beta.contributions.contentprovider\"") + buildConfigField("String", "MODIFICATION_AUTHORITY", "\"fr.free.nrw.commons.beta.modifications.contentprovider\"") + buildConfigField("String", "CATEGORY_AUTHORITY", "\"fr.free.nrw.commons.beta.categories.contentprovider\"") + buildConfigField("String", "RECENT_SEARCH_AUTHORITY", "\"fr.free.nrw.commons.beta.explore.recentsearches.contentprovider\"") + buildConfigField("String", "RECENT_LANGUAGE_AUTHORITY", "\"fr.free.nrw.commons.beta.recentlanguages.contentprovider\"") + buildConfigField("String", "BOOKMARK_AUTHORITY", "\"fr.free.nrw.commons.beta.bookmarks.contentprovider\"") + buildConfigField("String", "BOOKMARK_LOCATIONS_AUTHORITY", "\"fr.free.nrw.commons.beta.bookmarks.locations.contentprovider\"") + buildConfigField("String", "BOOKMARK_ITEMS_AUTHORITY", "\"fr.free.nrw.commons.beta.bookmarks.items.contentprovider\"") + buildConfigField("String", "COMMIT_SHA", "\"" + getBuildVersion().toString() + "\"") + buildConfigField("String", "TEST_USERNAME", "\"" + getTestUserName() + "\"") + buildConfigField("String", "TEST_PASSWORD", "\"" + getTestPassword() + "\"") + buildConfigField("String", "DEPICTS_PROPERTY", "\"P245962\"") + buildConfigField("String", "CREATOR_PROPERTY", "\"P253075\"") + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = "17" + } + buildFeatures { + buildConfig = true + viewBinding = true + compose = true + } + buildToolsVersion = buildToolsVersion + composeOptions { + kotlinCompilerExtensionVersion = "1.5.8" + } + packaging { + jniLibs { + excludes += listOf("META-INF/androidx.*") + } + resources { + excludes += listOf( + "META-INF/androidx.*", + "META-INF/proguard/androidx-annotations.pro", + "/META-INF/LICENSE.md", + "/META-INF/LICENSE-notice.md" + ) + } + } + testOptions { + animationsDisabled = true + unitTests { + isReturnDefaultValues = true + isIncludeAndroidResources = true + } + unitTests.all { + it.jvmArgs("-noverify") + } + } + lint { + abortOnError = false + disable += listOf("MissingTranslation", "ExtraTranslation") + } +} + +dependencies { + // Utils + implementation(libs.gson) + implementation(libs.okhttp) + implementation(libs.retrofit) + implementation(libs.retrofit.converter.gson) + implementation(libs.retrofit.adapter.rxjava) + implementation(libs.rxandroid) + implementation(libs.rxjava) + implementation(libs.rxbinding) + implementation(libs.rxbinding.appcompat) + implementation(libs.facebook.fresco) + implementation(libs.apache.commons.lang3) + + // UI + implementation("${libs.viewpagerindicator.library.get()}@aar") + implementation(libs.photoview) + implementation(libs.android.sdk) + implementation(libs.android.plugin.scalebar) + + implementation(libs.timber) + implementation(libs.android.material) + implementation(libs.dexter) + + // Jetpack Compose + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.activity.compose) + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.compose.runtime) + implementation(libs.androidx.ui) + implementation(libs.androidx.ui.graphics) + implementation(libs.androidx.ui.tooling.preview) + implementation(libs.androidx.ui.viewbinding) + implementation(libs.androidx.material3) + implementation(libs.androidx.foundation) + implementation(libs.androidx.foundation.layout) + androidTestImplementation(platform(libs.androidx.compose.bom)) + androidTestImplementation(libs.androidx.ui.test.junit4) + debugImplementation(libs.androidx.ui.tooling) + debugImplementation(libs.androidx.ui.test.manifest) + + implementation(libs.adapterdelegates4.kotlin.dsl.viewbinding) + implementation(libs.adapterdelegates4.pagination) + implementation(libs.androidx.paging.runtime.ktx) + testImplementation(libs.androidx.paging.common.ktx) + implementation(libs.androidx.paging.rxjava2.ktx) + implementation(libs.androidx.recyclerview) + + // Logging + implementation(libs.acra.dialog) + implementation(libs.acra.mail) + implementation(libs.slf4j.api) + implementation(libs.logback.android.classic) { + exclude(group = "com.google.android", module = "android") + } + implementation(libs.logging.interceptor) + + // Dependency injector + implementation(libs.dagger.android) + implementation(libs.dagger.android.support) + kapt(libs.dagger.android.processor) + kapt(libs.dagger.compiler) + annotationProcessor(libs.dagger.android.processor) + + implementation(libs.kotlin.reflect) + + //Mocking + testImplementation(libs.mockito.kotlin) + testImplementation(libs.mockito.core) + testImplementation(libs.powermock.module.junit) + testImplementation(libs.powermock.api.mockito) + testImplementation(libs.mockk) + + // Unit testing + testImplementation(libs.junit) + testImplementation(libs.robolectric) + testImplementation(libs.androidx.test.core) + testImplementation(libs.androidx.runner) + testImplementation(libs.androidx.test.ext.junit) + testImplementation(libs.androidx.test.rules) + testImplementation(libs.mockwebserver) + testImplementation(libs.livedata.testing.ktx) + testImplementation(libs.androidx.core.testing) + testImplementation(libs.junit.jupiter.api) + testRuntimeOnly(libs.junit.jupiter.engine) + testImplementation(libs.soloader) + testImplementation(libs.kotlinx.coroutines.test) + debugImplementation(libs.androidx.fragment.testing) + testImplementation(libs.commons.io) + + // Android testing + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(libs.androidx.espresso.intents) + androidTestImplementation(libs.androidx.espresso.contrib) + androidTestImplementation(libs.androidx.runner) + androidTestImplementation(libs.androidx.test.rules) + androidTestImplementation(libs.androidx.test.core) + androidTestImplementation(libs.androidx.test.ext.junit) + androidTestImplementation(libs.androidx.annotation) + androidTestImplementation(libs.mockwebserver) + androidTestImplementation(libs.androidx.uiautomator) + + // Debugging + debugImplementation(libs.leakcanary.android) + + // Support libraries + implementation(libs.androidx.browser) + implementation(libs.androidx.cardview) + implementation(libs.androidx.constraintlayout) + implementation(libs.androidx.exifinterface) + implementation(libs.recyclerview.fastscroll) + + //swipe_layout + implementation(libs.swipelayout.library) + + //Room + implementation(libs.androidx.room.runtime) + implementation(libs.androidx.room.ktx) + implementation(libs.androidx.room.rxjava) + kapt(libs.androidx.room.compiler) + + // Preferences + implementation(libs.androidx.preference) + implementation(libs.androidx.preference.ktx) + + //Android Media + implementation(libs.juanitobananas.androidDmediaUtil) + implementation(libs.androidx.multidex) + + // Kotlin + coroutines + implementation(libs.androidx.work.runtime.ktx) + implementation(libs.androidx.work.runtime) + testImplementation(libs.androidx.work.testing) + + //Glide + implementation(libs.glide) + annotationProcessor(libs.glide.compiler) + kaptTest(libs.androidx.databinding.compiler) + kaptAndroidTest(libs.androidx.databinding.compiler) + + implementation(libs.coordinates2country.android) { + exclude(group = "com.google.android", module = "android") + } + + //OSMDroid + implementation(libs.osmdroid.android) + constraints { + implementation(libs.kotlin.stdlib.jdk7) { + because("kotlin-stdlib-jdk7 is now a part of kotlin-stdlib") + } + implementation(libs.kotlin.stdlib.jdk8) { + because("kotlin-stdlib-jdk8 is now a part of kotlin-stdlib") + } + } +} + +tasks.register("disableAnimations") { + val adb = "${System.getenv("ANDROID_HOME")}/platform-tools/adb" + commandLine(adb, "shell", "settings", "put", "global", "window_animation_scale", "0") + commandLine(adb, "shell", "settings", "put", "global", "transition_animation_scale", "0") + commandLine(adb, "shell", "settings", "put", "global", "animator_duration_scale", "0") +} + +project.gradle.taskGraph.whenReady { + val connectedBetaDebugAndroidTest = tasks.named("connectedBetaDebugAndroidTest") + val connectedProdDebugAndroidTest = tasks.named("connectedProdDebugAndroidTest") + + connectedBetaDebugAndroidTest.configure { + dependsOn("disableAnimations") + } + connectedProdDebugAndroidTest.configure { + dependsOn("disableAnimations") + } +} + +fun getTestUserName(): String? { + val propFile = rootProject.file("./local.properties") + val properties = Properties() + propFile.inputStream().use { properties.load(it) } + return properties.getProperty("TEST_USER_NAME") +} + +fun getTestPassword(): String? { + val propFile = rootProject.file("./local.properties") + val properties = Properties() + propFile.inputStream().use { properties.load(it) } + return properties.getProperty("TEST_USER_PASSWORD") +} + +if (isRunningOnTravisAndIsNotPRBuild) { + configure { + track = "alpha" + userFraction = 1.0 + serviceAccountEmail = System.getenv("SERVICE_ACCOUNT_NAME") + serviceAccountCredentials = file("../play.p12") + + resolutionStrategy = "auto" + outputProcessor { // this: ApkVariantOutput + versionNameOverride = "$versionNameOverride.$versionCode" + } + } +} + +fun getBuildVersion(): String? { + return try { + val stdout = ByteArrayOutputStream() + exec { + commandLine("git", "rev-parse", "--short", "HEAD") + standardOutput = stdout + } + stdout.toString().trim() + } catch (e: Exception) { + null + } +} + +fun getBranchName(): String? { + return try { + val stdout = ByteArrayOutputStream() + exec { + commandLine("git", "rev-parse", "--abbrev-ref", "HEAD") + standardOutput = stdout + } + stdout.toString().trim() + } catch (e: Exception) { + null + } +} \ No newline at end of file diff --git a/build.gradle b/build.gradle deleted file mode 100644 index b0bad89a5..000000000 --- a/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. -buildscript { - repositories { - google() - mavenCentral() - maven { url "https://plugins.gradle.org/m2/" } - } - dependencies { - classpath 'com.android.tools.build:gradle:8.7.0' - classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.8.2' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$KOTLIN_VERSION" - classpath 'org.codehaus.groovy:groovy-all:2.4.15' - } -} - -allprojects { - repositories { - google() - mavenCentral() - gradlePluginPortal() // potential jcenter() replacement - maven { url "https://jitpack.io" } - maven { url "https://maven.google.com" } - } -} -subprojects{ - tasks.withType(Test).configureEach{ - jvmArgs = jvmArgs + ['--add-opens=java.base/java.lang=ALL-UNNAMED'] - } -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 000000000..d3860805e --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,13 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +plugins { + alias(libs.plugins.android.application) apply false + alias(libs.plugins.jetbrains.kotlin.android) apply false + alias(libs.plugins.github.triplet.play) apply false + alias(libs.plugins.getkeepsafe.dexcount) +} + +subprojects{ + tasks.withType().configureEach { + jvmArgs = (jvmArgs ?: emptyList()) + listOf("--add-opens=java.base/java.lang=ALL-UNNAMED") + } +} \ No newline at end of file diff --git a/gitutils.gradle b/gitutils.gradle deleted file mode 100644 index ffcc8e520..000000000 --- a/gitutils.gradle +++ /dev/null @@ -1,26 +0,0 @@ -ext.getBuildVersion = { -> - // Short-term fix for #1157. Should ideally look into why method is failing. - try { - def stdout = new ByteArrayOutputStream() - exec { - commandLine 'git' , 'rev-parse' , '--short' , 'HEAD' - standardOutput = stdout - } - return stdout.toString().trim() - } catch (ignored) { - return null - } -} - -ext.getBranchName = { -> - try { - def stdOut = new ByteArrayOutputStream() - exec { - commandLine 'git', 'rev-parse', '--abbrev-ref', 'HEAD' - standardOutput = stdOut - } - return stdOut.toString().trim() - } catch (ignored) { - return null - } -} diff --git a/gradle.properties b/gradle.properties index 090289fa6..61c3584e5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,24 +17,10 @@ org.gradle.jvmargs=-Xmx1536M org.gradle.caching=true android.enableR8.fullMode=false -KOTLIN_VERSION=1.9.22 -LEAK_CANARY_VERSION=2.10 -DAGGER_VERSION=2.23 -ROOM_VERSION=2.6.1 -PREFERENCE_VERSION=1.2.1 -CORE_KTX_VERSION=1.9.0 -ADAPTER_DELEGATES_VERSION=4.3.0 -PAGING_VERSION=2.1.2 -MULTIDEX_VERSION=2.0.1 -OKHTTP_VERSION=4.10.0 -MAPLIBRE_VERSION=10.0.1 -OSMDROID_VERSION=6.1.17 - #systemProp.http.proxyPort=0 #systemProp.http.proxyHost= android.useAndroidX=true android.enableJetifier=true android.jetifier.ignorelist=bcprov-jdk15on -android.defaults.buildfeatures.buildconfig=true android.nonTransitiveRClass=false android.nonFinalResIds=false diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 000000000..afb3615d2 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,209 @@ +[versions] +agp = "8.9.1" +acra = "5.8.4" +activityCompose = "1.9.3" +adapterdelegates = "4.3.0" +androidmediautil = "v1.0-1" +androidSdkVersion = "10.0.1" +androidPluginScalebar = "1.0.0" +androidxJunitVersion = "1.1.5" +annotation = "1.3.0" +browser = "1.3.0" +cardview = "1.0.0" +commonsIo = "2.6" +composeBom = "2024.11.00" +constraintlayout = "1.1.3" +coordinates2country = "1.8" +dexcount = "4.0.0" +githubTripletPlay = "2.7.2" +osmdroidAndroid = "6.1.17" +testCore = "1.4.0" +coreKtx = "1.9.0" +coreTesting = "2.2.0" +dagger = "2.23" +databindingCompiler = "8.0.2" +dexterVersion = "5.0.0" +espresso = "3.6.1" +exifinterface = "1.3.7" +fragmentTesting = "1.6.2" +frescoVersion = "1.13.0" +commonsLang3Version = "3.8.1" +glide = "4.12.0" +gson = "2.8.5" +junit = "4.13.2" +junitJupiter = "5.10.0" +kotlin = "1.9.22" +kotlinStdlib = "1.8.0" +coroutines = "1.7.3" +leakcanary = "2.10" +livedataTesting = "1.2.0" +swipelayout = "1.2.0" +viewpagerIndicator = "2.4.1.1" +lifecycleRuntimeKtx = "2.8.4" +loggingInterceptor = "4.10.0" +logbackAndroidClassic = "1.1.1-6" +material = "1.12.0" +mockitoCore = "5.6.0" +mockitoKotlin = "2.2.0" +mockk = "1.13.5" +mockwebserver = "4.10.0" +multidex = "2.0.1" +okHttp = "4.10.0" +paging = "2.1.2" +photoviewVersion = "2.0.0" +powermock = "2.0.9" +preference = "1.2.1" +recyclerview = "1.2.0-alpha02" +recyclerviewFastscroll = "2.0.1" +retrofit = "2.8.1" +robolectric = "4.11.1" +room = "2.6.1" +rules = "1.5.0" +runner = "1.5.2" +rxandroid = "2.1.0" +rxjava = "2.2.3" +rxbinding = "2.1.1" +rxbindingAppcompat = "3.0.0" +slf4jApi = "1.7.25" +soloader = "0.10.5" +timber = "4.7.1" +uiautomator = "2.2.0" +workManager = "2.8.1" + +[libraries] +# AndroidX Core Dependencies +androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } +androidx-annotation = { module = "androidx.annotation:annotation", version.ref = "annotation" } +androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } +androidx-compose-runtime = { group = "androidx.compose.runtime", name = "runtime" } +androidx-constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "constraintlayout" } +androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } +androidx-test-core = { module = "androidx.test:core", version.ref = "testCore" } +androidx-databinding-compiler = { module = "androidx.databinding:databinding-compiler", version.ref = "databindingCompiler" } +androidx-exifinterface = { module = "androidx.exifinterface:exifinterface", version.ref = "exifinterface" } +androidx-foundation = { module = "androidx.compose.foundation:foundation" } +androidx-foundation-layout = { module = "androidx.compose.foundation:foundation-layout" } +androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } +androidx-material3 = { group = "androidx.compose.material3", name = "material3" } +androidx-runner = { module = "androidx.test:runner", version.ref = "runner" } +androidx-test-ext-junit = { module = "androidx.test.ext:junit", version.ref = "androidxJunitVersion" } +androidx-test-rules = { module = "androidx.test:rules", version.ref = "rules" } +androidx-ui = { group = "androidx.compose.ui", name = "ui" } +androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } +androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } +androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } +androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } +androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } +androidx-ui-viewbinding = { group = "androidx.compose.ui", name = "ui-viewbinding" } + +# AndroidX Room +androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" } +androidx-room-rxjava = { module = "androidx.room:room-rxjava2", version.ref = "room" } +androidx-room-ktx = { module = "androidx.room:room-ktx", version.ref = "room" } +androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" } + +# AndroidX Preferences +androidx-preference = { module = "androidx.preference:preference", version.ref = "preference" } +androidx-preference-ktx = { module = "androidx.preference:preference-ktx", version.ref = "preference" } + +# AndroidX Paging +androidx-recyclerview = { module = "androidx.recyclerview:recyclerview", version.ref = "recyclerview" } +androidx-paging-common-ktx = { module = "androidx.paging:paging-common-ktx", version.ref = "paging" } +androidx-paging-runtime-ktx = { module = "androidx.paging:paging-runtime-ktx", version.ref = "paging" } +androidx-paging-rxjava2-ktx = { module = "androidx.paging:paging-rxjava2-ktx", version.ref = "paging" } + +# AndroidX Work Manager +androidx-work-testing = { module = "androidx.work:work-testing", version.ref = "workManager" } +androidx-work-runtime = { module = "androidx.work:work-runtime", version.ref = "workManager" } +androidx-work-runtime-ktx = { module = "androidx.work:work-runtime-ktx", version.ref = "workManager" } + +# Dependency injection (DI) +dagger-android-processor = { module = "com.google.dagger:dagger-android-processor", version.ref = "dagger" } +dagger-android-support = { module = "com.google.dagger:dagger-android-support", version.ref = "dagger" } +dagger-android = { module = "com.google.dagger:dagger-android", version.ref = "dagger" } +dagger-compiler = { module = "com.google.dagger:dagger-compiler", version.ref = "dagger" } + +# Image loading +facebook-fresco = { module = "com.facebook.fresco:fresco", version.ref = "frescoVersion" } +glide-compiler = { module = "com.github.bumptech.glide:compiler", version.ref = "glide" } +glide = { module = "com.github.bumptech.glide:glide", version.ref = "glide" } +photoview = { module = "com.github.chrisbanes:PhotoView", version.ref = "photoviewVersion" } + +# RxJava and Reactive Programming +rxandroid = { module = "io.reactivex.rxjava2:rxandroid", version.ref = "rxandroid" } +rxjava = { module = "io.reactivex.rxjava2:rxjava", version.ref = "rxjava" } +rxbinding = { module = "com.jakewharton.rxbinding2:rxbinding", version.ref = "rxbinding" } +rxbinding-appcompat = { module = "com.jakewharton.rxbinding3:rxbinding-appcompat", version.ref = "rxbindingAppcompat" } + +# Testing +androidx-core-testing = { module = "androidx.arch.core:core-testing", version.ref = "coreTesting" } +androidx-espresso-contrib = { module = "androidx.test.espresso:espresso-contrib", version.ref = "espresso" } +androidx-espresso-intents = { module = "androidx.test.espresso:espresso-intents", version.ref = "espresso" } +androidx-espresso-core = { module = "androidx.test.espresso:espresso-core", version.ref = "espresso" } +androidx-fragment-testing = { module = "androidx.fragment:fragment-testing", version.ref = "fragmentTesting" } +androidx-uiautomator = { module = "androidx.test.uiautomator:uiautomator", version.ref = "uiautomator" } +commons-io = { module = "commons-io:commons-io", version.ref = "commonsIo" } +junit = { module = "junit:junit", version.ref = "junit" } +junit-jupiter-engine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junitJupiter" } +junit-jupiter-api = { module = "org.junit.jupiter:junit-jupiter-api", version.ref = "junitJupiter" } +kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" } +livedata-testing-ktx = { module = "com.jraska.livedata:testing-ktx", version.ref = "livedataTesting" } +robolectric = { module = "org.robolectric:robolectric", version.ref = "robolectric" } +soloader = { module = "com.facebook.soloader:soloader", version.ref = "soloader" } + +# Mocking +mockk = { module = "io.mockk:mockk", version.ref = "mockk" } +mockwebserver = { module = "com.squareup.okhttp3:mockwebserver", version.ref = "mockwebserver" } +mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockitoCore" } +mockito-kotlin = { module = "com.nhaarman.mockitokotlin2:mockito-kotlin", version.ref = "mockitoKotlin" } +powermock-api-mockito = { module = "org.powermock:powermock-api-mockito2", version.ref = "powermock" } +powermock-module-junit = { module = "org.powermock:powermock-module-junit4", version.ref = "powermock" } + +# UI components & layouts +androidx-cardview = { module = "androidx.cardview:cardview", version.ref = "cardview" } +android-material = { group = "com.google.android.material", name = "material", version.ref = "material" } +adapterdelegates4-kotlin-dsl-viewbinding = { module = "com.hannesdorfmann:adapterdelegates4-kotlin-dsl-viewbinding", version.ref = "adapterdelegates" } +adapterdelegates4-pagination = { module = "com.hannesdorfmann:adapterdelegates4-pagination", version.ref = "adapterdelegates" } +dexter = { module = "com.karumi:dexter", version.ref = "dexterVersion" } +recyclerview-fastscroll = { module = "com.simplecityapps:recyclerview-fastscroll", version.ref = "recyclerviewFastscroll" } +swipelayout-library = { module = "com.daimajia.swipelayout:library", version.ref = "swipelayout" } +viewpagerindicator-library = { module = "fr.avianey.com.viewpagerindicator:library", version.ref = "viewpagerIndicator" } + +# Networking libraries +logging-interceptor = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "loggingInterceptor" } +okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okHttp" } +retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" } +retrofit-adapter-rxjava = { module = "com.squareup.retrofit2:adapter-rxjava2", version.ref = "retrofit" } +retrofit-converter-gson = { module = "com.squareup.retrofit2:converter-gson", version.ref = "retrofit" } + +# Utility libraries +androidx-browser = { module = "androidx.browser:browser", version.ref = "browser" } +apache-commons-lang3 = { module = "org.apache.commons:commons-lang3", version.ref = "commonsLang3Version" } +gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" } +juanitobananas-androidDmediaUtil = { module = "com.github.juanitobananas:AndroidMediaUtil", version.ref = "androidmediautil" } +androidx-multidex = { module = "androidx.multidex:multidex", version.ref = "multidex" } +kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" } +leakcanary-android = { module = "com.squareup.leakcanary:leakcanary-android", version.ref = "leakcanary" } + +# Logging & Crash Reporting +acra-mail = { module = "ch.acra:acra-mail", version.ref = "acra" } +acra-dialog = { module = "ch.acra:acra-dialog", version.ref = "acra" } +logback-android-classic = { module = "com.github.tony19:logback-android-classic", version.ref = "logbackAndroidClassic" } +slf4j-api = { module = "org.slf4j:slf4j-api", version.ref = "slf4jApi" } +timber = { module = "com.jakewharton.timber:timber", version.ref = "timber" } + +# Map & location services +android-sdk = { module = "org.maplibre.gl:android-sdk", version.ref = "androidSdkVersion" } +android-plugin-scalebar = { module = "org.maplibre.gl:android-plugin-scalebar-v9", version.ref = "androidPluginScalebar" } +coordinates2country-android = { module = "io.github.coordinates2country:coordinates2country-android", version.ref = "coordinates2country" } +osmdroid-android = { module = "org.osmdroid:osmdroid-android", version.ref = "osmdroidAndroid" } +kotlin-stdlib-jdk7 = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib-jdk7", version.ref = "kotlinStdlib" } +kotlin-stdlib-jdk8 = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib-jdk8", version.ref = "kotlinStdlib" } + +[plugins] +android-application = { id = "com.android.application", version.ref = "agp" } +jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +kotlin-kapt = { id = "org.jetbrains.kotlin.kapt" } +kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize" } +github-triplet-play = { id = "com.github.triplet.play", version.ref = "githubTripletPlay" } +getkeepsafe-dexcount = { id = "com.getkeepsafe.dexcount", version.ref = "dexcount" } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index fd53d45f9..26f6c44a2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Sun Apr 23 18:22:54 IST 2023 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists \ No newline at end of file diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index e7b4def49..000000000 --- a/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -include ':app' diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 000000000..1f3c89749 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,17 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + maven("https://jitpack.io") + } +} + +include(":app")