diff --git a/build.gradle b/build.gradle index 0c47a8d1..9a8fdc44 100644 --- a/build.gradle +++ b/build.gradle @@ -1,15 +1,17 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. -apply from: 'dependencies.gradle' - buildscript { apply from: 'dependencies.gradle' repositories { jcenter() + maven { + url "https://plugins.gradle.org/m2/" + } } dependencies { classpath gradlePlugins.androidTools classpath gradlePlugins.kotlin + classpath gradlePlugins.ktlintGradle } } diff --git a/dependencies.gradle b/dependencies.gradle index a177610f..b4802ddc 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -5,6 +5,8 @@ ext.versions = [ buildTools : "25.0.3", androidTools : "2.3.3", + ktlint : "0.9.0", + ktlintGradle : "2.1.0", androidSupport : "22.2.1", @@ -23,6 +25,7 @@ ext.versions = [ ext.gradlePlugins = [ androidTools : "com.android.tools.build:gradle:$versions.androidTools", kotlin : "org.jetbrains.kotlin:kotlin-gradle-plugin:$versions.kotlin", + ktlintGradle : "gradle.plugin.org.jlleitschuh.gradle:ktlint-gradle:$versions.ktlintGradle", ] ext.androidSupport = [ diff --git a/gradle_scripts/code_quality.gradle b/gradle_scripts/code_quality.gradle new file mode 100644 index 00000000..df65df11 --- /dev/null +++ b/gradle_scripts/code_quality.gradle @@ -0,0 +1,10 @@ +// Applies code quality plugins when -Pqc is passed to the gradle +def isCodeQualityEnabled = project.hasProperty('qc') + +if (isCodeQualityEnabled) { + apply plugin: "org.jlleitschuh.gradle.ktlint" + + ktlint { + version = versions.ktlint + } +} \ No newline at end of file diff --git a/subsonic-api/build.gradle b/subsonic-api/build.gradle index 1091d2f5..fa4fe445 100644 --- a/subsonic-api/build.gradle +++ b/subsonic-api/build.gradle @@ -1,4 +1,5 @@ apply plugin: 'kotlin' +apply from: '../gradle_scripts/code_quality.gradle' sourceSets { main.java.srcDirs += 'src/main/kotlin' diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClientTest.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClientTest.kt index 0dd81d46..41d1dd63 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClientTest.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIClientTest.kt @@ -23,7 +23,9 @@ import retrofit2.Response import java.nio.charset.Charset import java.security.MessageDigest import java.text.SimpleDateFormat -import java.util.* +import java.util.Calendar +import java.util.Locale +import java.util.TimeZone /** * Integration test for [SubsonicAPIClient] class. diff --git a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/rules/MockWebServerRule.kt b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/rules/MockWebServerRule.kt index 4c88ed26..022457f5 100644 --- a/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/rules/MockWebServerRule.kt +++ b/subsonic-api/src/integrationTest/kotlin/org/moire/ultrasonic/api/subsonic/rules/MockWebServerRule.kt @@ -8,11 +8,11 @@ import org.junit.runners.model.Statement /** * Starts mock web server for test and shut it down after. */ -class MockWebServerRule: TestRule { +class MockWebServerRule : TestRule { val mockWebServer = MockWebServer() override fun apply(base: Statement?, description: Description?): Statement { - val ruleStatement = object: Statement() { + val ruleStatement = object : Statement() { override fun evaluate() { try { mockWebServer.start() diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIVersions.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIVersions.kt index b6bb618c..27a8421a 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIVersions.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicAPIVersions.kt @@ -52,9 +52,9 @@ enum class SubsonicAPIVersions(val subsonicVersions: String, val restApiVersion: throw IllegalArgumentException("Unknown api version $apiVersion") } - class SubsonicAPIVersionsDeserializer: JsonDeserializer() { - override fun deserialize(p: JsonParser?, ctxt: DeserializationContext?): SubsonicAPIVersions { - if (p!!.currentName != "version") { + class SubsonicAPIVersionsDeserializer : JsonDeserializer() { + override fun deserialize(p: JsonParser, ctxt: DeserializationContext?): SubsonicAPIVersions { + if (p.currentName != "version") { throw JsonParseException(p, "Not valid token for API version!") } return fromApiVersion(p.text) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicError.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicError.kt index cce83f8a..d6b7160a 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicError.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/SubsonicError.kt @@ -25,9 +25,9 @@ enum class SubsonicError(val code: Int) { .filter { it.code == jsonErrorCode }.firstOrNull() ?: throw IllegalArgumentException("Unknown code $jsonErrorCode") - class SubsonicErrorDeserializer: JsonDeserializer() { - override fun deserialize(p: JsonParser?, ctxt: DeserializationContext?): SubsonicError { - p!!.nextToken() // "code" + class SubsonicErrorDeserializer : JsonDeserializer() { + override fun deserialize(p: JsonParser, ctxt: DeserializationContext?): SubsonicError { + p.nextToken() // "code" val error = parseErrorFromJson(p.valueAsInt) p.nextToken() // "message" p.nextToken() // end of error object diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Artist.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Artist.kt index b616c753..c1ca8d42 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Artist.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/Artist.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic.models -import java.util.* +import java.util.Calendar data class Artist(val id: Long, val name: String, diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectory.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectory.kt index cbe09064..10d0d0eb 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectory.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectory.kt @@ -1,7 +1,7 @@ package org.moire.ultrasonic.api.subsonic.models import com.fasterxml.jackson.annotation.JsonProperty -import java.util.* +import java.util.Calendar data class MusicDirectory(val id: Long, val name: String, diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectoryChild.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectoryChild.kt index dc7bae18..d4eb331d 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectoryChild.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/models/MusicDirectoryChild.kt @@ -1,6 +1,6 @@ package org.moire.ultrasonic.api.subsonic.models -import java.util.* +import java.util.Calendar data class MusicDirectoryChild(val id: Long, val parent: Long, val isDir: Boolean = false, val title: String = "", val album: String = "", diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/LicenseResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/LicenseResponse.kt index e5bcf81b..5cecbc8e 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/LicenseResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/LicenseResponse.kt @@ -7,5 +7,5 @@ import org.moire.ultrasonic.api.subsonic.models.License class LicenseResponse(val license: License = License(), status: Status, version: SubsonicAPIVersions, - error: SubsonicError?): + error: SubsonicError?) : SubsonicResponse(status, version, error) \ No newline at end of file diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/MusicFoldersResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/MusicFoldersResponse.kt index 24f91058..5f7bf796 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/MusicFoldersResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/MusicFoldersResponse.kt @@ -14,12 +14,12 @@ class MusicFoldersResponse(status: Status, version: SubsonicAPIVersions, error: SubsonicError?, @JsonDeserialize(using = MusicFoldersDeserializer::class) - val musicFolders: List = emptyList()): + val musicFolders: List = emptyList()) : SubsonicResponse(status, version, error) { companion object { - class MusicFoldersDeserializer(): JsonDeserializer>() { - override fun deserialize(p: JsonParser?, ctxt: DeserializationContext?): List { - p!!.nextToken() + class MusicFoldersDeserializer() : JsonDeserializer>() { + override fun deserialize(p: JsonParser, ctxt: DeserializationContext?): List { + p.nextToken() if (p.currentName == "musicFolder" && p.nextToken() == JsonToken.START_ARRAY) { val mfJavaType = ctxt!!.typeFactory .constructCollectionType(List::class.java, MusicFolder::class.java) diff --git a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SubsonicResponse.kt b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SubsonicResponse.kt index 8f15947d..2681ad04 100644 --- a/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SubsonicResponse.kt +++ b/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/response/SubsonicResponse.kt @@ -25,9 +25,9 @@ open class SubsonicResponse(val status: Status, .filter { it.jsonValue == jsonValue }.firstOrNull() ?: throw IllegalArgumentException("Unknown status value: $jsonValue") - class StatusJsonDeserializer: JsonDeserializer() { - override fun deserialize(p: JsonParser?, ctxt: DeserializationContext?): Status { - if (p!!.currentName != "status") { + class StatusJsonDeserializer : JsonDeserializer() { + override fun deserialize(p: JsonParser, ctxt: DeserializationContext?): Status { + if (p.currentName != "status") { throw JsonParseException(p, "Current token is not status. Current token name ${p.currentName}.") } diff --git a/ultrasonic/build.gradle b/ultrasonic/build.gradle index 258d5052..e9bcd67c 100644 --- a/ultrasonic/build.gradle +++ b/ultrasonic/build.gradle @@ -1,5 +1,6 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' +apply from: "../gradle_scripts/code_quality.gradle" android { compileSdkVersion versions.compileSdk