mirror of
				https://github.com/commons-app/apps-android-commons.git
				synced 2025-10-30 22:34:02 +01:00 
			
		
		
		
	Merge branch 'main' into fix/infinite-progress-bar
This commit is contained in:
		
						commit
						ab2f71227f
					
				
					 17 changed files with 747 additions and 510 deletions
				
			
		
							
								
								
									
										431
									
								
								app/build.gradle
									
										
									
									
									
								
							
							
						
						
									
										431
									
								
								app/build.gradle
									
										
									
									
									
								
							|  | @ -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" |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
							
								
								
									
										445
									
								
								app/build.gradle.kts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										445
									
								
								app/build.gradle.kts
									
										
									
									
									
										Normal file
									
								
							|  | @ -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<Exec>("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<com.github.triplet.gradle.play.PlayPublisherExtension> { | ||||||
|  |         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 | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -173,6 +173,9 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C | ||||||
|     override fun onCreate(savedInstanceState: Bundle?) { |     override fun onCreate(savedInstanceState: Bundle?) { | ||||||
|         super.onCreate(savedInstanceState) |         super.onCreate(savedInstanceState) | ||||||
| 
 | 
 | ||||||
|  |         // Ensure basicKvStoreFactory is always initialized before use | ||||||
|  |         presenter?.setupBasicKvStoreFactory { BasicKvStore(this@UploadActivity, it) } | ||||||
|  | 
 | ||||||
|         _binding = ActivityUploadBinding.inflate(layoutInflater) |         _binding = ActivityUploadBinding.inflate(layoutInflater) | ||||||
|         setContentView(binding.root) |         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 |                     // Save the user's choice to not show the dialog again | ||||||
|                     defaultKvStore.putBoolean("hasAlreadyLaunchedCategoriesDialog", true) |                     defaultKvStore.putBoolean("hasAlreadyLaunchedCategoriesDialog", true) | ||||||
|                 } |                 } | ||||||
|                 presenter!!.setupBasicKvStoreFactory { BasicKvStore(this@UploadActivity, it) } |  | ||||||
|                 presenter!!.checkImageQuality(0) |                 presenter!!.checkImageQuality(0) | ||||||
|                 UploadMediaPresenter.isCategoriesDialogShowing = false |                 UploadMediaPresenter.isCategoriesDialogShowing = false | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  | @ -34,8 +34,7 @@ class UploadPresenter @Inject internal constructor( | ||||||
| 
 | 
 | ||||||
|     private val compositeDisposable = CompositeDisposable() |     private val compositeDisposable = CompositeDisposable() | ||||||
| 
 | 
 | ||||||
|     lateinit var basicKvStoreFactory: (String) -> BasicKvStore |     private var basicKvStoreFactory: ((String) -> BasicKvStore)? = null | ||||||
| 
 |  | ||||||
|     /** |     /** | ||||||
|      * Called by the submit button in [UploadActivity] |      * Called by the submit button in [UploadActivity] | ||||||
|      */ |      */ | ||||||
|  | @ -132,14 +131,38 @@ class UploadPresenter @Inject internal constructor( | ||||||
|         basicKvStoreFactory = factory |         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 |      * Calls checkImageQuality of UploadMediaPresenter to check image quality of next image | ||||||
|      * |      * | ||||||
|      * @param uploadItemIndex Index of next image, whose quality is to be checked |      * @param uploadItemIndex Index of next image, whose quality is to be checked | ||||||
|      */ |      */ | ||||||
|     override fun checkImageQuality(uploadItemIndex: Int) { |     override fun checkImageQuality(uploadItemIndex: Int) { | ||||||
|  |         requireFactoryInitialized() | ||||||
|         repository.getUploadItem(uploadItemIndex)?.let { |         repository.getUploadItem(uploadItemIndex)?.let { | ||||||
|             presenter.setupBasicKvStoreFactory(basicKvStoreFactory) |             presenter.setupBasicKvStoreFactory(getBasicKvStoreFactory()) | ||||||
|             presenter.checkImageQuality(it, uploadItemIndex) |             presenter.checkImageQuality(it, uploadItemIndex) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -13,6 +13,7 @@ | ||||||
| * Hhaboh162002 | * Hhaboh162002 | ||||||
| * Kassem7899 | * Kassem7899 | ||||||
| * LaMagiaaa | * LaMagiaaa | ||||||
|  | * Lolekek | ||||||
| * Meno25 | * Meno25 | ||||||
| * Mido | * Mido | ||||||
| * Monrokhoury | * Monrokhoury | ||||||
|  | @ -853,6 +854,7 @@ | ||||||
|   <string name="talk">نقاش</string> |   <string name="talk">نقاش</string> | ||||||
|   <string name="write_something_about_the_item">اكتب شيئًا عن العنصر \'%1$s\'. سيكون مرئيًا للعامة.</string> |   <string name="write_something_about_the_item">اكتب شيئًا عن العنصر \'%1$s\'. سيكون مرئيًا للعامة.</string> | ||||||
|   <string name="does_not_exist_anymore_no_picture_can_ever_be_taken_of_it">\'%1$s\' لم يعد موجودًا، ولا يمكن التقاط صورة له أبدًا.</string> |   <string name="does_not_exist_anymore_no_picture_can_ever_be_taken_of_it">\'%1$s\' لم يعد موجودًا، ولا يمكن التقاط صورة له أبدًا.</string> | ||||||
|  |   <string name="is_at_a_different_place_wikidata">\'%1$s\' في مكان آخر.</string> | ||||||
|   <string name="is_at_a_different_place_please_specify_the_correct_place_below_if_possible_tell_us_the_correct_latitude_longitude">\'%1$s\' موجود في مكان مختلف. يرجى تحديد المكان الصحيح أدناه، وإذا أمكن، اكتب خط العرض وخط الطول الصحيحين.</string> |   <string name="is_at_a_different_place_please_specify_the_correct_place_below_if_possible_tell_us_the_correct_latitude_longitude">\'%1$s\' موجود في مكان مختلف. يرجى تحديد المكان الصحيح أدناه، وإذا أمكن، اكتب خط العرض وخط الطول الصحيحين.</string> | ||||||
|   <string name="other_problem_or_information_please_explain_below">مشكلة أو معلومات أخرى (يرجى التوضيح أدناه).</string> |   <string name="other_problem_or_information_please_explain_below">مشكلة أو معلومات أخرى (يرجى التوضيح أدناه).</string> | ||||||
|   <string name="feedback_destination_note">سيتم نشر تعليقاتك على صفحة الويكي التالية:  <a href=\"https://commons.wikimedia.org/wiki/Commons:Mobile_app/Feedback\">Commons:Mobile app/Feedback</a></string> |   <string name="feedback_destination_note">سيتم نشر تعليقاتك على صفحة الويكي التالية:  <a href=\"https://commons.wikimedia.org/wiki/Commons:Mobile_app/Feedback\">Commons:Mobile app/Feedback</a></string> | ||||||
|  |  | ||||||
|  | @ -789,6 +789,7 @@ | ||||||
|   <string name="talk">Tal</string> |   <string name="talk">Tal</string> | ||||||
|   <string name="write_something_about_the_item">Skriv noget om elementet \'%1$s\'. Det vil være offentligt synligt.</string> |   <string name="write_something_about_the_item">Skriv noget om elementet \'%1$s\'. Det vil være offentligt synligt.</string> | ||||||
|   <string name="does_not_exist_anymore_no_picture_can_ever_be_taken_of_it">\'%1$s\' eksisterer ikke længere, der vil aldrig kunne tages et billede af det.</string> |   <string name="does_not_exist_anymore_no_picture_can_ever_be_taken_of_it">\'%1$s\' eksisterer ikke længere, der vil aldrig kunne tages et billede af det.</string> | ||||||
|  |   <string name="is_at_a_different_place_wikidata">\'%1$s\' ligger et andet sted.</string> | ||||||
|   <string name="is_at_a_different_place_please_specify_the_correct_place_below_if_possible_tell_us_the_correct_latitude_longitude">\'%1$s\' ligger et andet sted. Angiv venligst det korrekte sted nedenfor, og skriv om muligt den korrekte bredde- og længdegrad.</string> |   <string name="is_at_a_different_place_please_specify_the_correct_place_below_if_possible_tell_us_the_correct_latitude_longitude">\'%1$s\' ligger et andet sted. Angiv venligst det korrekte sted nedenfor, og skriv om muligt den korrekte bredde- og længdegrad.</string> | ||||||
|   <string name="other_problem_or_information_please_explain_below">Andet problem eller anden information (forklar venligst nedenfor).</string> |   <string name="other_problem_or_information_please_explain_below">Andet problem eller anden information (forklar venligst nedenfor).</string> | ||||||
|   <string name="feedback_destination_note">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></string> |   <string name="feedback_destination_note">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></string> | ||||||
|  |  | ||||||
|  | @ -829,6 +829,7 @@ | ||||||
|   <string name="talk">Discussion</string> |   <string name="talk">Discussion</string> | ||||||
|   <string name="write_something_about_the_item">Écrivez quelque chose à propos de l’élément « %1$s ». Il sera visible publiquement.</string> |   <string name="write_something_about_the_item">Écrivez quelque chose à propos de l’élément « %1$s ». Il sera visible publiquement.</string> | ||||||
|   <string name="does_not_exist_anymore_no_picture_can_ever_be_taken_of_it">\'%1$s\' n\'existe plus, aucune photo ne pourra jamais en être prise.</string> |   <string name="does_not_exist_anymore_no_picture_can_ever_be_taken_of_it">\'%1$s\' n\'existe plus, aucune photo ne pourra jamais en être prise.</string> | ||||||
|  |   <string name="is_at_a_different_place_wikidata">\'%1$s\' est à un endroit différent.</string> | ||||||
|   <string name="is_at_a_different_place_please_specify_the_correct_place_below_if_possible_tell_us_the_correct_latitude_longitude">\'%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.</string> |   <string name="is_at_a_different_place_please_specify_the_correct_place_below_if_possible_tell_us_the_correct_latitude_longitude">\'%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.</string> | ||||||
|   <string name="other_problem_or_information_please_explain_below">Autre problème ou information (merci d\'expliquer ci-dessous).</string> |   <string name="other_problem_or_information_please_explain_below">Autre problème ou information (merci d\'expliquer ci-dessous).</string> | ||||||
|   <string name="feedback_destination_note">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></string> |   <string name="feedback_destination_note">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></string> | ||||||
|  |  | ||||||
|  | @ -303,7 +303,7 @@ | ||||||
|   <string name="retry">やり直す</string> |   <string name="retry">やり直す</string> | ||||||
|   <string name="showcase_view_whole_nearby_activity">以下のとおり、近くにウィキペディアの記事に使う写真が足りない場所があります。\n\n\'この近くを検索\' ボタンを押すと、地図をロックしてその地点周辺の検索結果を表示します。</string> |   <string name="showcase_view_whole_nearby_activity">以下のとおり、近くにウィキペディアの記事に使う写真が足りない場所があります。\n\n\'この近くを検索\' ボタンを押すと、地図をロックしてその地点周辺の検索結果を表示します。</string> | ||||||
|   <string name="showcase_view_needs_photo">この場所の写真を募集中です。</string> |   <string name="showcase_view_needs_photo">この場所の写真を募集中です。</string> | ||||||
|   <string name="showcase_view_has_photo">この場所の写真はすでにあります。</string> |   <string name="showcase_view_has_photo">この場所の写真は既にあります。</string> | ||||||
|   <string name="showcase_view_no_longer_exists">この場所はもうありません</string> |   <string name="showcase_view_no_longer_exists">この場所はもうありません</string> | ||||||
|   <string name="no_images_found">画像がありません</string> |   <string name="no_images_found">画像がありません</string> | ||||||
|   <string name="error_loading_images">画像の読み込み中にエラーが発生しました</string> |   <string name="error_loading_images">画像の読み込み中にエラーが発生しました</string> | ||||||
|  | @ -393,7 +393,7 @@ | ||||||
|   <string name="step_count">全部で%2$d件のうち%1$d件目の手順:%3$s</string> |   <string name="step_count">全部で%2$d件のうち%1$d件目の手順:%3$s</string> | ||||||
|   <string name="next">次へ</string> |   <string name="next">次へ</string> | ||||||
|   <string name="previous">前へ</string> |   <string name="previous">前へ</string> | ||||||
|   <string name="upload_title_duplicate">%1$s という題名のファイルはすでに保存されています。処理をほんとうに続けますか?\n\n注記:ファイル名には適切な接頭辞が自動的に付与されます。</string> |   <string name="upload_title_duplicate">%1$s という名前のファイルは既に存在します。本当に処理を続行してよろしいですか?\n\n注: ファイル名には適切な接尾辞が自動的に付加されます。</string> | ||||||
|   <string name="map_application_missing">お使いの機器に適したアプリが見つかりませんでした。この機能を使用できる地図アプリをインストールしてください。</string> |   <string name="map_application_missing">お使いの機器に適したアプリが見つかりませんでした。この機能を使用できる地図アプリをインストールしてください。</string> | ||||||
|   <string name="title_page_bookmarks_pictures">画像</string> |   <string name="title_page_bookmarks_pictures">画像</string> | ||||||
|   <string name="title_page_bookmarks_locations">位置</string> |   <string name="title_page_bookmarks_locations">位置</string> | ||||||
|  | @ -668,7 +668,7 @@ | ||||||
|   <string name="your_feedback">あなたのフィードバック</string> |   <string name="your_feedback">あなたのフィードバック</string> | ||||||
|   <string name="mark_as_not_for_upload">アップロード不可としてマーク</string> |   <string name="mark_as_not_for_upload">アップロード不可としてマーク</string> | ||||||
|   <string name="no_more_images_found">これ以上画像が見つかりません</string> |   <string name="no_more_images_found">これ以上画像が見つかりません</string> | ||||||
|   <string name="this_image_is_already_uploaded">この画像はすでにアップロードされています</string> |   <string name="this_image_is_already_uploaded">この画像は既にアップロードされています</string> | ||||||
|   <string name="can_not_select_this_image_for_upload">この画像をアップロード用に選択できません</string> |   <string name="can_not_select_this_image_for_upload">この画像をアップロード用に選択できません</string> | ||||||
|   <string name="image_selected">画像が選択されました</string> |   <string name="image_selected">画像が選択されました</string> | ||||||
|   <string name="menu_view_report">報告</string> |   <string name="menu_view_report">報告</string> | ||||||
|  |  | ||||||
|  | @ -143,7 +143,9 @@ | ||||||
|   <string name="title_activity_category_details">وېشنيزه</string> |   <string name="title_activity_category_details">وېشنيزه</string> | ||||||
|   <string name="title_activity_review">ملگرو بياکتنه</string> |   <string name="title_activity_review">ملگرو بياکتنه</string> | ||||||
|   <string name="menu_about">په اړه</string> |   <string name="menu_about">په اړه</string> | ||||||
|   <string name="about_privacy_policy" fuzzy="true"><a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">د پټنتيا تگلاره</a></string> |   <string name="about_license">د ويکيرسنۍ خونديځ کاريال يو پرانيستې سرچينې کاريال دی چې د ويکيرسنۍ ټولنې د بسپنه ورکوونکو او خپلخوښو کارنانو له خوا جوړ شوی او ساتل کېږي. د ويکيرسنۍ بنسټ د دې کاريال په جوړولو، پراختيا او ساتنه کې ښکېل نه دی.</string> | ||||||
|  |   <string name="about_improve">د بگ راپور او وړانديزونو لپاره يوه <a href=\"%1$s\">گيټ هاب ستونزه</a> جوړه کړئ.</string> | ||||||
|  |   <string name="about_privacy_policy">د پټنتيا تگلار</string> | ||||||
|   <string name="title_activity_about">په اړه</string> |   <string name="title_activity_about">په اړه</string> | ||||||
|   <string name="menu_feedback">غبرگون لېږنه (برېښليک له لارې)</string> |   <string name="menu_feedback">غبرگون لېږنه (برېښليک له لارې)</string> | ||||||
|   <string name="no_email_client">هيڅ برېښليک سرچينه نه ده ځای پرځای شوې</string> |   <string name="no_email_client">هيڅ برېښليک سرچينه نه ده ځای پرځای شوې</string> | ||||||
|  | @ -161,13 +163,36 @@ | ||||||
|   <string name="license_name_cc_by_sa">ځانگړي کونگ-ورته وېشنه ۳.۰</string> |   <string name="license_name_cc_by_sa">ځانگړي کونگ-ورته وېشنه ۳.۰</string> | ||||||
|   <string name="license_name_cc_by">ځانگړي کونگ ۳.۰</string> |   <string name="license_name_cc_by">ځانگړي کونگ ۳.۰</string> | ||||||
|   <string name="license_name_cc_by_3_0">CC BY 3.0</string> |   <string name="license_name_cc_by_3_0">CC BY 3.0</string> | ||||||
|  |   <string name="tutorial_1_subtext">ستاسو انځورونه د نړۍ په گوټ گوټ کې خلکو ته زده کړه ورکوي!</string> | ||||||
|  |   <string name="tutorial_2_text">مهرباني وکړئ هغه انځورونه راپورته کړئ چې په بشپړ ډول تاسو اخيستي يا جوړ کړې وي:</string> | ||||||
|  |   <string name="tutorial_2_subtext_1">طبيعي څيزونه (گلان، څاروي، غرونه)</string> | ||||||
|  |   <string name="tutorial_2_subtext_2">گټور څيزونه (بايسيکلونه، اورگډو تمځايونه)</string> | ||||||
|  |   <string name="tutorial_2_subtext_3">نوميالي وگړي (ستاسو ښاروال، اولمپيک لوبغاړی چې تاسو ورسره وليدل)</string> | ||||||
|  |   <string name="tutorial_3_text">مهرباني وکړئ مه يې راپورته کوئ:</string> | ||||||
|  |   <string name="tutorial_3_subtext_1">د خپلو ملگرو ځانانځورنه او انځورونه</string> | ||||||
|  |   <string name="tutorial_3_subtext_2">هغه انځورنه چې تاسو له اينټرنېټ څخه راکښته کړې وي</string> | ||||||
|  |   <string name="tutorial_3_subtext_3">د ملکيتي کاريالونو سکرينشاټونه</string> | ||||||
|  |   <string name="tutorial_4_text">د پورته کولو بېلگه:</string> | ||||||
|  |   <string name="tutorial_4_subtext_1">سرليک: سيډني اوپېرا هاوس</string> | ||||||
|  |   <string name="tutorial_4_subtext_2">څرگنداوی: د خليج له خوا د سيډني اوپېرا هاوس ليدنه</string> | ||||||
|  |   <string name="tutorial_4_subtext_3">وېشنيزې: له لوېديځ څخه د سېډني اوپېرا هاوس ، د سېډني اوپېرا هاوس لرليد</string> | ||||||
|  |   <string name="welcome_wikipedia_text">خپل انځورونه شريک کړئ. د ويکيپېډيا ليکنو ته ژوند ورکولو کې مرسته وکړئ!</string> | ||||||
|  |   <string name="welcome_wikipedia_subtext">په ويکيپېډيا کې دا انځورونه له ويکيمېډيا خونديځ نه اخيستل شوي دي.</string> | ||||||
|  |   <string name="welcome_copyright_text">ستاسو انځورونه د نړۍ په گوټ گوټ کې خلکو ته زده کړه ورکوي!</string> | ||||||
|  |   <string name="welcome_copyright_subtext">له اينټرنېته د لمېس رېښتو لرونکو موادو او د پوسټرونو، کتاب پوښونو او نورو انځورنو د خپرلو څخه ډډه وکړئ.</string> | ||||||
|  |   <string name="welcome_final_text">ستا په اند ته پوه شوې؟</string> | ||||||
|   <string name="welcome_final_button_text">هو</string> |   <string name="welcome_final_button_text">هو</string> | ||||||
|  |   <string name="welcome_help_button_text">نور مالومات</string> | ||||||
|   <string name="detail_panel_cats_label">وېشنيزې</string> |   <string name="detail_panel_cats_label">وېشنيزې</string> | ||||||
|   <string name="detail_panel_cats_loading">رابرسېرېږي...</string> |   <string name="detail_panel_cats_loading">رابرسېرېږي...</string> | ||||||
|   <string name="detail_panel_cats_none">هېڅ هم نه دی ټاکل شوی</string> |   <string name="detail_panel_cats_none">هېڅ هم نه دی ټاکل شوی</string> | ||||||
|  |   <string name="detail_caption_empty">هيڅ نيونگ نشته</string> | ||||||
|   <string name="detail_description_empty">څرگندونه نشته</string> |   <string name="detail_description_empty">څرگندونه نشته</string> | ||||||
|  |   <string name="detail_discussion_empty">هيڅ شننه نشته</string> | ||||||
|   <string name="detail_license_empty">نامعلوم جواز</string> |   <string name="detail_license_empty">نامعلوم جواز</string> | ||||||
|   <string name="menu_refresh">تازه کول</string> |   <string name="menu_refresh">تازه کول</string> | ||||||
|  |   <string name="storage_permission_title">د زېرمه کولو د پرېښولي غوښتنه کول</string> | ||||||
|  |   <string name="read_storage_permission_rationale">اړينه پرېښولی: بهرنۍ زېرمه ولولئ. کاريال ستاسو انځورتونه ته پرته له دې لاسرسی نشي موندلی.</string> | ||||||
|   <string name="ok">ښه</string> |   <string name="ok">ښه</string> | ||||||
|   <string name="warning">گواښنه</string> |   <string name="warning">گواښنه</string> | ||||||
|   <string name="yes">هو</string> |   <string name="yes">هو</string> | ||||||
|  |  | ||||||
							
								
								
									
										29
									
								
								build.gradle
									
										
									
									
									
								
							
							
						
						
									
										29
									
								
								build.gradle
									
										
									
									
									
								
							|  | @ -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'] |  | ||||||
|     } |  | ||||||
| } |  | ||||||
							
								
								
									
										13
									
								
								build.gradle.kts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								build.gradle.kts
									
										
									
									
									
										Normal file
									
								
							|  | @ -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<Test>().configureEach { | ||||||
|  |         jvmArgs = (jvmArgs ?: emptyList()) + listOf("--add-opens=java.base/java.lang=ALL-UNNAMED") | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -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 |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -17,24 +17,10 @@ org.gradle.jvmargs=-Xmx1536M | ||||||
| org.gradle.caching=true | org.gradle.caching=true | ||||||
| android.enableR8.fullMode=false | 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.proxyPort=0 | ||||||
| #systemProp.http.proxyHost= | #systemProp.http.proxyHost= | ||||||
| android.useAndroidX=true | android.useAndroidX=true | ||||||
| android.enableJetifier=true | android.enableJetifier=true | ||||||
| android.jetifier.ignorelist=bcprov-jdk15on | android.jetifier.ignorelist=bcprov-jdk15on | ||||||
| android.defaults.buildfeatures.buildconfig=true |  | ||||||
| android.nonTransitiveRClass=false | android.nonTransitiveRClass=false | ||||||
| android.nonFinalResIds=false | android.nonFinalResIds=false | ||||||
|  |  | ||||||
							
								
								
									
										209
									
								
								gradle/libs.versions.toml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										209
									
								
								gradle/libs.versions.toml
									
										
									
									
									
										Normal file
									
								
							|  | @ -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" } | ||||||
							
								
								
									
										2
									
								
								gradle/wrapper/gradle-wrapper.properties
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								gradle/wrapper/gradle-wrapper.properties
									
										
									
									
										vendored
									
									
								
							|  | @ -1,6 +1,6 @@ | ||||||
| #Sun Apr 23 18:22:54 IST 2023 | #Sun Apr 23 18:22:54 IST 2023 | ||||||
| distributionBase=GRADLE_USER_HOME | distributionBase=GRADLE_USER_HOME | ||||||
| distributionPath=wrapper/dists | 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 | zipStoreBase=GRADLE_USER_HOME | ||||||
| zipStorePath=wrapper/dists | zipStorePath=wrapper/dists | ||||||
|  | @ -1 +0,0 @@ | ||||||
| include ':app' |  | ||||||
							
								
								
									
										17
									
								
								settings.gradle.kts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								settings.gradle.kts
									
										
									
									
									
										Normal file
									
								
							|  | @ -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") | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Nicolas Raoul
						Nicolas Raoul