diff --git a/.github/workflows/Android-CI-Espresso.yml b/.github/workflows/Android-CI-Espresso.yml
index 7f28fb76..225e9e38 100644
--- a/.github/workflows/Android-CI-Espresso.yml
+++ b/.github/workflows/Android-CI-Espresso.yml
@@ -20,17 +20,19 @@ jobs:
abi: [ x86_64 ]
tag: [ 'default' ]
java_version: [ 17 ]
-# include:
-# - java_version: 17
-# os: macOS-14
-# api: 31
-# abi: arm64-v8a
-# tag: 'google_apis'
+ # include:
+ # - java_version: 17
+ # os: macOS-14
+ # api: 31
+ # abi: arm64-v8a
+ # tag: 'google_apis'
steps:
- name: Show architecture
run: uname -a
- - name: Checkout
- uses: actions/checkout@v6
+ - uses: actions/checkout@v6
+ with:
+ fetch-depth: 0
+ submodules: true
- name: Install JDK ${{ matrix.java_version }}
uses: actions/setup-java@v5
with:
@@ -88,8 +90,10 @@ jobs:
os: [ ubuntu-latest ]
java_version: [ 17 ]
steps:
- - name: Checkout
- uses: actions/checkout@v6
+ - uses: actions/checkout@v6
+ with:
+ fetch-depth: 0
+ submodules: true
- name: Install JDK ${{ matrix.java_version }}
uses: actions/setup-java@v5
with:
diff --git a/.github/workflows/Android-CI-release.yml b/.github/workflows/Android-CI-release.yml
index 31d066d3..ab253e16 100644
--- a/.github/workflows/Android-CI-release.yml
+++ b/.github/workflows/Android-CI-release.yml
@@ -10,10 +10,10 @@ jobs:
name: Publish release
runs-on: ubuntu-latest
steps:
- - name: Checkout
- uses: actions/checkout@v6
+ - uses: actions/checkout@v6
with:
fetch-depth: 0
+ submodules: true
- name: Get the version
id: tagger
uses: jimschubert/query-tag-action@v2
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 00000000..4328b650
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "buildSrc"]
+ path = buildSrc
+ url = git@github.com:hannesa2/KotlinBuildSource.git
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index e476c95e..4f1bb290 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -28,6 +28,40 @@
+
+
+
diff --git a/LogcatCoreLib/build.gradle b/LogcatCoreLib/build.gradle
deleted file mode 100644
index f6e7824a..00000000
--- a/LogcatCoreLib/build.gradle
+++ /dev/null
@@ -1,53 +0,0 @@
-plugins {
- id "com.android.library"
- id "kotlin-android"
- id "maven-publish"
-}
-
-android {
- defaultConfig {
- compileSdk propCompileSdkVersion
- buildConfigField "String", "VERSIONNAME", "\"" + getTag() + "\""
-
- minSdkVersion 23
- project.archivesBaseName = "LogcatCore"
- }
- namespace "info.hannes.logcat"
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_17
- targetCompatibility JavaVersion.VERSION_17
- }
- buildFeatures {
- buildConfig true
- }
- publishing {
- singleVariant("release") {}
- }
-}
-
-dependencies {
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2"
- implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.9.4"
- implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.9.4"
- api "com.jakewharton.timber:timber:5.0.1"
-}
-
-publishing {
- publications {
- release(MavenPublication) {
- afterEvaluate {
- from components.release {
- pom {
- licenses {
- license {
- name = "Apache License Version 2.0"
- url = "https://github.com/AppDevNext/Logcat/blob/master/LICENSE"
- }
- }
- }
- }
- }
- }
- }
-}
diff --git a/LogcatCoreLib/build.gradle.kts b/LogcatCoreLib/build.gradle.kts
new file mode 100644
index 00000000..43b727c9
--- /dev/null
+++ b/LogcatCoreLib/build.gradle.kts
@@ -0,0 +1,54 @@
+import info.git.versionHelper.getVersionText
+
+plugins {
+ id("com.android.library")
+ id("kotlin-android")
+ id("maven-publish")
+}
+
+android {
+ namespace = "info.hannes.logcat"
+ defaultConfig {
+ compileSdk = 36
+ buildConfigField("String", "VERSION_NAME", "\"${getVersionText()}\"")
+
+ minSdk = 23
+ setProperty("archivesBaseName", "LogcatCore")
+ }
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
+ }
+ buildFeatures {
+ buildConfig = true
+ }
+ publishing {
+ singleVariant("release") {}
+ }
+}
+
+dependencies {
+ implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.20")
+ implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2")
+ implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.9.4")
+ implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.9.4")
+ api("com.jakewharton.timber:timber:5.0.1")
+}
+
+afterEvaluate {
+ publishing {
+ publications {
+ create("maven") {
+ from(components["release"])
+ pom {
+ licenses {
+ license {
+ name = "Apache License Version 2.0"
+ url = "https://github.com/AppDevNext/Logcat/blob/master/LICENSE"
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/LogcatCoreUI/build.gradle b/LogcatCoreUI/build.gradle
deleted file mode 100644
index 661775a7..00000000
--- a/LogcatCoreUI/build.gradle
+++ /dev/null
@@ -1,56 +0,0 @@
-plugins {
- id "com.android.library"
- id "kotlin-android"
- id "maven-publish"
-}
-
-android {
- defaultConfig {
- compileSdk propCompileSdkVersion
- buildConfigField "String", "VERSIONNAME", "\"" + getTag() + "\""
-
- minSdkVersion 23
- project.archivesBaseName = "LogcatCore"
- }
- buildFeatures {
- viewBinding = true
- buildConfig true
- }
- namespace "info.hannes.logcat.ui"
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_17
- targetCompatibility JavaVersion.VERSION_17
- }
- publishing {
- singleVariant("release") {}
- }
-}
-
-dependencies {
- api project(":LogcatCoreLib")
- implementation "androidx.core:core-ktx:1.17.0"
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2"
- implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.9.4"
- implementation "androidx.recyclerview:recyclerview:1.4.0"
- api "com.google.android.material:material:1.13.0"
-}
-
-publishing {
- publications {
- release(MavenPublication) {
- afterEvaluate {
- from components.release {
- pom {
- licenses {
- license {
- name = "Apache License Version 2.0"
- url = "https://github.com/AppDevNext/Logcat/blob/master/LICENSE"
- }
- }
- }
- }
- }
- }
- }
-}
diff --git a/LogcatCoreUI/build.gradle.kts b/LogcatCoreUI/build.gradle.kts
new file mode 100644
index 00000000..b289ee2c
--- /dev/null
+++ b/LogcatCoreUI/build.gradle.kts
@@ -0,0 +1,57 @@
+import info.git.versionHelper.getVersionText
+
+plugins {
+ id("com.android.library")
+ id("kotlin-android")
+ id("maven-publish")
+}
+
+android {
+ namespace = "info.hannes.logcat.ui"
+ defaultConfig {
+ compileSdk = 36
+ buildConfigField("String", "VERSION_NAME", "\"${getVersionText()}\"")
+
+ minSdk = 23
+ setProperty("archivesBaseName", "LogcatCoreUI")
+ }
+ buildFeatures {
+ viewBinding = true
+ buildConfig = true
+ }
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
+ }
+ publishing {
+ singleVariant("release") {}
+ }
+}
+
+dependencies {
+ api(project(":LogcatCoreLib"))
+ implementation("androidx.core:core-ktx:1.17.0")
+ implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.2.20")
+ implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2")
+ implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.9.4")
+ implementation("androidx.recyclerview:recyclerview:1.4.0")
+ api("com.google.android.material:material:1.13.0")
+}
+
+afterEvaluate {
+ publishing {
+ publications {
+ create("maven") {
+ from(components["release"])
+ pom {
+ licenses {
+ license {
+ name = "Apache License Version 2.0"
+ url = "https://github.com/AppDevNext/Logcat/blob/master/LICENSE"
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/LogcatCountlyLib/build.gradle b/LogcatCountlyLib/build.gradle
deleted file mode 100644
index 6f32f00a..00000000
--- a/LogcatCountlyLib/build.gradle
+++ /dev/null
@@ -1,45 +0,0 @@
-plugins {
- id "com.android.library"
- id "kotlin-android"
- id "maven-publish"
-}
-
-android {
- defaultConfig {
- compileSdk propCompileSdkVersion
- minSdkVersion 23
- project.archivesBaseName = "LogcatCountly"
- }
- namespace "info.hannes.logcat.countly"
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_17
- targetCompatibility JavaVersion.VERSION_17
- }
- publishing {
- singleVariant("release") {}
- }
-}
-
-dependencies {
- api project(":LogcatCoreLib")
- api "ly.count.android:sdk:25.4.4"
-}
-
-publishing {
- publications {
- release(MavenPublication) {
- afterEvaluate {
- from components.release {
- pom {
- licenses {
- license {
- name = "Apache License Version 2.0"
- url = "https://github.com/AppDevNext/Logcat/blob/master/LICENSE"
- }
- }
- }
- }
- }
- }
- }
-}
diff --git a/LogcatCountlyLib/build.gradle.kts b/LogcatCountlyLib/build.gradle.kts
new file mode 100644
index 00000000..c40c6d9f
--- /dev/null
+++ b/LogcatCountlyLib/build.gradle.kts
@@ -0,0 +1,44 @@
+plugins {
+ id("com.android.library")
+ id("kotlin-android")
+ id("maven-publish")
+}
+
+android {
+ namespace = "info.hannes.logcat.countly"
+ defaultConfig {
+ compileSdk = 36
+ minSdk = 23
+ setProperty("archivesBaseName", "LogcatCountly")
+ }
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
+ }
+ publishing {
+ singleVariant("release") {}
+ }
+}
+
+dependencies {
+ api(project(":LogcatCoreLib"))
+ api("ly.count.android:sdk:25.4.4")
+}
+
+afterEvaluate {
+ publishing {
+ publications {
+ create("maven") {
+ from(components["release"])
+ pom {
+ licenses {
+ license {
+ name = "Apache License Version 2.0"
+ url = "https://github.com/AppDevNext/Logcat/blob/master/LICENSE"
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/LogcatCountlyLib/src/main/java/info/hannes/countly/Analytics.kt b/LogcatCountlyLib/src/main/java/info/hannes/countly/Analytics.kt
index b29aad13..38560979 100644
--- a/LogcatCountlyLib/src/main/java/info/hannes/countly/Analytics.kt
+++ b/LogcatCountlyLib/src/main/java/info/hannes/countly/Analytics.kt
@@ -67,7 +67,7 @@ class Analytics : IAnalytics {
} catch (ignore: PackageManager.NameNotFoundException) {
}
segmentation["app_version"] = version
- segmentation["logging_version"] = BuildConfig.VERSIONNAME
+ segmentation["logging_version"] = BuildConfig.VERSION_NAME
val config = CountlyConfig()
.setAppKey(countlyKey)
diff --git a/LogcatCrashlyticLib/build.gradle b/LogcatCrashlyticLib/build.gradle
deleted file mode 100644
index dc2f4e44..00000000
--- a/LogcatCrashlyticLib/build.gradle
+++ /dev/null
@@ -1,51 +0,0 @@
-plugins {
- id "com.android.library"
- id "kotlin-android"
- id "maven-publish"
- id "com.google.firebase.crashlytics"
-}
-
-android {
- defaultConfig {
- compileSdk propCompileSdkVersion
- minSdkVersion 23
- project.archivesBaseName = "LogcatCrashlytic"
- }
- namespace "info.hannes.logcat.crashlytic"
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_17
- targetCompatibility JavaVersion.VERSION_17
- }
- publishing {
- singleVariant("release") {}
- }
-}
-
-dependencies {
- api project(":LogcatCoreLib")
- // Import the BoM for the Firebase platform
- api platform("com.google.firebase:firebase-bom:34.5.0")
-
- // Add the dependencies for the Crashlytics and Analytics libraries
- // When using the BoM, you don"t specify versions in Firebase library dependencies
- api "com.google.firebase:firebase-crashlytics"
-}
-
-publishing {
- publications {
- release(MavenPublication) {
- afterEvaluate {
- from components.release {
- pom {
- licenses {
- license {
- name = "Apache License Version 2.0"
- url = "https://github.com/AppDevNext/Logcat/blob/master/LICENSE"
- }
- }
- }
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/LogcatCrashlyticLib/build.gradle.kts b/LogcatCrashlyticLib/build.gradle.kts
new file mode 100644
index 00000000..34a52a84
--- /dev/null
+++ b/LogcatCrashlyticLib/build.gradle.kts
@@ -0,0 +1,50 @@
+plugins {
+ id("com.android.library")
+ id("kotlin-android")
+ id("maven-publish")
+ id("com.google.firebase.crashlytics")
+}
+
+android {
+ namespace = "info.hannes.logcat.crashlytic"
+ defaultConfig {
+ compileSdk = 36
+ minSdk = 23
+ setProperty("archivesBaseName", "LogcatCrashlytic")
+ }
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
+ }
+ publishing {
+ singleVariant("release") {}
+ }
+}
+
+dependencies {
+ api(project(":LogcatCoreLib"))
+ // Import the BoM for the Firebase platform
+ api(platform("com.google.firebase:firebase-bom:34.5.0"))
+
+ // Add the dependencies for the Crashlytics and Analytics libraries
+ // When using the BoM, you don"t specify versions in Firebase library dependencies
+ api("com.google.firebase:firebase-crashlytics")
+}
+
+afterEvaluate {
+ publishing {
+ publications {
+ create("maven") {
+ from(components["release"])
+ pom {
+ licenses {
+ license {
+ name = "Apache License Version 2.0"
+ url = "https://github.com/AppDevNext/Logcat/blob/master/LICENSE"
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/app/build.gradle b/app/build.gradle
deleted file mode 100644
index 4b1ea0af..00000000
--- a/app/build.gradle
+++ /dev/null
@@ -1,72 +0,0 @@
-plugins {
- id "com.android.application"
- id "kotlin-android"
-// id "com.google.gms.google-services"
-// id "com.google.firebase.crashlytics"
-}
-
-if (useFirebase() == "true") {
- apply plugin: "com.google.gms.google-services"
- apply plugin: "com.google.firebase.crashlytics"
-}
-
-android {
- namespace "info.hannes.logcat.app"
- testNamespace "info.hannes.logcat.sampletest"
-
- defaultConfig {
- applicationId "info.hannes.logcat.sample"
- versionCode 1
- versionName "1.0"
-
- minSdkVersion 23
- compileSdk propCompileSdkVersion
- targetSdkVersion 36
-
- buildConfigField "boolean", "WITH_FIREBASE", useFirebase()
-
- testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
- testInstrumentationRunnerArguments useTestStorageService: "true"
- }
-
- buildFeatures {
- viewBinding = true
- buildConfig true
- }
-
- buildTypes {
- release {
- }
- debug {
- }
- }
- packagingOptions {
- resources {
- pickFirsts += ["META-INF/atomicfu.kotlin_module"]
- }
- }
-
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_17
- targetCompatibility JavaVersion.VERSION_17
- }
-}
-
-dependencies {
- implementation project(":LogcatCoreLib")
- implementation project(":LogcatCoreUI")
- implementation project(":LogcatCrashlyticLib")
- implementation project(":LogcatCountlyLib")
- implementation "androidx.legacy:legacy-support-v4:1.0.0"
- implementation "androidx.appcompat:appcompat:1.7.1"
- implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2"
- implementation "androidx.test.uiautomator:uiautomator:2.3.0"
-
- androidTestImplementation "androidx.test:rules:1.7.0" // GrantPermissionRule
- androidTestImplementation "com.github.AppDevNext:Moka:1.8"
- androidTestImplementation "androidx.test.ext:junit-ktx:1.3.0"
- androidTestUtil "androidx.test.services:test-services:1.6.0"
- androidTestImplementation "org.hamcrest:hamcrest:3.0"
- androidTestImplementation "androidx.test.espresso:espresso-contrib:3.7.0"
-}
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
new file mode 100644
index 00000000..48db4158
--- /dev/null
+++ b/app/build.gradle.kts
@@ -0,0 +1,84 @@
+import info.shell.runCommand
+
+plugins {
+ id("com.android.application")
+ id("kotlin-android")
+}
+
+if (useFirebase() == "true") {
+ apply(plugin = "com.google.gms.google-services")
+ apply(plugin = "com.google.firebase.crashlytics")
+}
+
+android {
+ namespace = "info.hannes.logcat.app"
+ testNamespace = "info.hannes.logcat.sampletest"
+
+ defaultConfig {
+ applicationId = "info.hannes.logcat.sample"
+ versionCode = 1
+ versionName = "1.0"
+
+ minSdk = 23
+ compileSdk = 36
+ targetSdk { version = release(36) }
+
+ buildConfigField("boolean", "WITH_FIREBASE", useFirebase())
+
+ testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+ testInstrumentationRunnerArguments.putAll(
+ mapOf(
+ "useTestStorageService" to "true",
+ ),
+ )
+ }
+
+ buildFeatures {
+ viewBinding = true
+ buildConfig = true
+ }
+
+ buildTypes {
+ release {
+ }
+ debug {
+ }
+ }
+ packaging {
+ resources {
+ pickFirsts += setOf("META-INF/atomicfu.kotlin_module")
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
+ }
+}
+
+dependencies {
+ implementation(project(":LogcatCoreLib"))
+ implementation(project(":LogcatCoreUI"))
+ implementation(project(":LogcatCrashlyticLib"))
+ implementation(project(":LogcatCountlyLib"))
+ implementation("androidx.legacy:legacy-support-v4:1.0.0")
+ implementation("androidx.appcompat:appcompat:1.7.1")
+ implementation("org.jetbrains.kotlin:kotlin-stdlib:2.2.20")
+ implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2")
+ implementation("androidx.test.uiautomator:uiautomator:2.3.0")
+
+ androidTestImplementation("androidx.test:rules:1.7.0") // GrantPermissionRule
+ androidTestImplementation("com.github.AppDevNext:Moka:1.8")
+ androidTestImplementation("androidx.test.ext:junit-ktx:1.3.0")
+ androidTestUtil("androidx.test.services:test-services:1.6.0")
+ androidTestImplementation("org.hamcrest:hamcrest:3.0")
+ androidTestImplementation("androidx.test.espresso:espresso-contrib:3.7.0")
+}
+
+fun useFirebase(): String {
+ val process = "grep DUMMYKEY app/google-services.json -R | wc -c".runCommand()
+ val grepResult = process.trim().split(":")[1].toInt()
+ val result = grepResult != 1
+ println("Firebase=$result")
+ return result.toString()
+}
diff --git a/app/src/main/java/info/hannes/logcat/app/CrashlyticApplication.kt b/app/src/main/java/info/hannes/logcat/app/CrashlyticApplication.kt
index 7384d597..89af44d2 100644
--- a/app/src/main/java/info/hannes/logcat/app/CrashlyticApplication.kt
+++ b/app/src/main/java/info/hannes/logcat/app/CrashlyticApplication.kt
@@ -38,7 +38,7 @@ class CrashlyticApplication : LoggingApplication() {
if (BuildConfig.WITH_FIREBASE) {
Timber.i("I use Firebase")
- FirebaseCrashlytics.getInstance().setCustomKey("VERSION_NAME", info.hannes.logcat.ui.BuildConfig.VERSIONNAME)
+ FirebaseCrashlytics.getInstance().setCustomKey("VERSION_NAME", info.hannes.logcat.ui.BuildConfig.VERSION_NAME)
Timber.plant(CrashlyticsTree(Settings.Secure.getString(applicationContext.contentResolver, Settings.Secure.ANDROID_ID)))
} else
Timber.w("No valid Firebase key was given")
diff --git a/build.gradle b/build.gradle
deleted file mode 100644
index 81e03a79..00000000
--- a/build.gradle
+++ /dev/null
@@ -1,63 +0,0 @@
-buildscript {
- ext.kotlin_version = "2.2.20"
- repositories {
- google()
- mavenCentral()
- maven { url "https://plugins.gradle.org/m2/" } // ktlint
- }
-
- dependencies {
- classpath "com.android.tools.build:gradle:8.13.0"
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
- classpath "org.jlleitschuh.gradle:ktlint-gradle:12.1.2"
-
- classpath "com.google.gms:google-services:4.4.4"
- classpath "com.google.firebase:firebase-crashlytics-gradle:2.9.9"
- }
-}
-
-subprojects {
- apply plugin: "org.jlleitschuh.gradle.ktlint" // Version should be inherited from parent
-
- // Optionally configure plugin
- ktlint {
- debug = false
- }
-}
-
-allprojects {
- repositories {
- google()
- mavenCentral()
- maven { url "https://jitpack.io" }
- }
-}
-
-ext {
- propCompileSdkVersion = 36
- coreVersion = "1.4.0"
- runnerVersion = "1.5.0"
- extJUnitVersion = "1.1.3"
- espresso_core = "3.4.0"
-}
-
-@SuppressWarnings("unused")
-static def getTag() {
- def process = "git describe --tags --abbrev=0".execute()
- return process.text.toString().trim()
-}
-
-@SuppressWarnings("unused")
-static def useFirebase() {
- def process = "grep DUMMYKEY app/google-services.json -R | wc -c".execute()
- def grepResult = process.text.toString().split(":")[1].toInteger()
- def result = !(grepResult == 1)
- println("Firebase=$result")
- return result.toString()
-}
-
-@SuppressWarnings("unused")
-static def getGitCommitCount() {
- def process = "git describe --tags --abbrev=0".execute()
- return process.text.toString().trim()
-}
diff --git a/build.gradle.kts b/build.gradle.kts
new file mode 100644
index 00000000..f2cbcb5b
--- /dev/null
+++ b/build.gradle.kts
@@ -0,0 +1,32 @@
+buildscript {
+ repositories {
+ google()
+ mavenCentral()
+ maven { url = uri("https://plugins.gradle.org/m2/") } // ktlint
+ }
+
+ dependencies {
+ classpath("com.android.tools.build:gradle:8.13.0")
+ classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.20")
+ classpath("org.jlleitschuh.gradle:ktlint-gradle:12.1.2")
+ classpath("com.google.gms:google-services:4.4.4")
+ classpath("com.google.firebase:firebase-crashlytics-gradle:2.9.9")
+ }
+}
+
+subprojects {
+ apply(plugin = "org.jlleitschuh.gradle.ktlint")
+
+ // Optionally configure plugin
+ configure {
+ debug.set(false)
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ maven { url = uri("https://jitpack.io") }
+ }
+}
diff --git a/buildSrc b/buildSrc
new file mode 160000
index 00000000..f0cefe2c
--- /dev/null
+++ b/buildSrc
@@ -0,0 +1 @@
+Subproject commit f0cefe2c666cf17226b050f711e7c21e2e411cc7
diff --git a/settings.gradle b/settings.gradle
deleted file mode 100644
index 3cf32126..00000000
--- a/settings.gradle
+++ /dev/null
@@ -1,5 +0,0 @@
-include ":LogcatCoreLib"
-include ":LogcatCoreUI"
-include ":LogcatCrashlyticLib"
-include ":LogcatCountlyLib"
-include ":app"
\ No newline at end of file
diff --git a/settings.gradle.kts b/settings.gradle.kts
new file mode 100644
index 00000000..00b729d9
--- /dev/null
+++ b/settings.gradle.kts
@@ -0,0 +1,5 @@
+include(":LogcatCoreLib")
+include(":LogcatCoreUI")
+include(":LogcatCrashlyticLib")
+include(":LogcatCountlyLib")
+include(":app")