From 5f7b7eaf6368833b0b1e0f027e00d34bce2cd15c Mon Sep 17 00:00:00 2001 From: js6pak Date: Sat, 11 Feb 2023 12:01:02 +0100 Subject: [PATCH] Add CI (#236) * Create main.yml * Run ktlintFormat * Don't error on translation lint issues * Fix lint error about POST_NOTIFICATIONS permission * Increase memory limit to speedup the build * Only build debug * refactor: rename `main.yml` to `build.yaml` * lint: error on `ExtraTranslation` --------- Co-authored-by: Jarne Demeulemeester --- .github/workflows/build.yaml | 29 +++++++++++++++++++ app/phone/src/main/AndroidManifest.xml | 1 + .../dev/jdtech/jellyfin/BaseApplication.kt | 2 +- .../adapters/DownloadEpisodeListAdapter.kt | 2 +- .../jellyfin/fragments/LoginFragment.kt | 4 +-- .../jellyfin/fragments/SettingsFragment.kt | 2 +- .../dev/jdtech/jellyfin/utils/Extensions.kt | 2 +- build.gradle.kts | 13 +++++++++ .../java/dev/jdtech/jellyfin/di/ApiModule.kt | 2 +- .../jellyfin/dialogs/SortDialogFragment.kt | 2 +- .../dev/jdtech/jellyfin/models/EpisodeItem.kt | 4 +-- .../jdtech/jellyfin/models/ExceptionUiText.kt | 4 +-- .../dev/jdtech/jellyfin/models/HomeItem.kt | 2 +- .../java/dev/jdtech/jellyfin/models/UiText.kt | 6 ++-- .../jellyfin/viewmodels/AddServerViewModel.kt | 4 +-- .../jellyfin/viewmodels/LibraryViewModel.kt | 2 +- .../jellyfin/viewmodels/LoginViewModel.kt | 4 +-- .../viewmodels/ServerSelectViewModel.kt | 2 +- .../dev/jdtech/jellyfin/api/JellyfinApi.kt | 2 +- gradle.properties | 2 +- .../dialogs/TrackSelectionDialogFragment.kt | 2 +- .../java/dev/jdtech/jellyfin/mpv/TrackType.kt | 2 +- .../jellyfin/viewmodels/PlayerViewModel.kt | 2 +- 23 files changed, 70 insertions(+), 27 deletions(-) create mode 100644 .github/workflows/build.yaml diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 00000000..90fc2f1e --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,29 @@ +name: Build + +on: + push: + pull_request: + +jobs: + build: + name: Build + runs-on: ubuntu-22.04 + steps: + - name: Checkout repository + uses: actions/checkout@v3 + - name: Validate Gradle Wrapper + uses: gradle/wrapper-validation-action@v1 + - name: Set up JDK 11 + uses: actions/setup-java@v3 + with: + java-version: 11 + distribution: temurin + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + - name: Build with Gradle + run: ./gradlew lintDebug ktlintCheck assembleDebug + - name: Upload artifact + uses: actions/upload-artifact@v3 + with: + name: phone-universal-debug.apk + path: ./app/phone/build/outputs/apk/debug/phone-universal-debug.apk diff --git a/app/phone/src/main/AndroidManifest.xml b/app/phone/src/main/AndroidManifest.xml index 52c79592..f1d16eb1 100644 --- a/app/phone/src/main/AndroidManifest.xml +++ b/app/phone/src/main/AndroidManifest.xml @@ -2,6 +2,7 @@ + diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/BaseApplication.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/BaseApplication.kt index 4edd0bbd..2d7a78dc 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/BaseApplication.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/BaseApplication.kt @@ -4,8 +4,8 @@ import android.app.Application import androidx.appcompat.app.AppCompatDelegate import com.google.android.material.color.DynamicColors import dagger.hilt.android.HiltAndroidApp -import timber.log.Timber import javax.inject.Inject +import timber.log.Timber @HiltAndroidApp class BaseApplication : Application() { diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/DownloadEpisodeListAdapter.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/DownloadEpisodeListAdapter.kt index 1ff7e21f..793c492b 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/DownloadEpisodeListAdapter.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/adapters/DownloadEpisodeListAdapter.kt @@ -113,4 +113,4 @@ class DownloadEpisodeListAdapter( class OnClickListener(val clickListener: (item: PlayerItem) -> Unit) { fun onClick(item: PlayerItem) = clickListener(item) } -} \ No newline at end of file +} diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt index 1b9aad12..83ac59bb 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/LoginFragment.kt @@ -15,11 +15,11 @@ import androidx.lifecycle.repeatOnLifecycle import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import dagger.hilt.android.AndroidEntryPoint +import dev.jdtech.jellyfin.AppPreferences +import dev.jdtech.jellyfin.R import dev.jdtech.jellyfin.adapters.UserLoginListAdapter import dev.jdtech.jellyfin.database.ServerDatabaseDao import dev.jdtech.jellyfin.databinding.FragmentLoginBinding -import dev.jdtech.jellyfin.AppPreferences -import dev.jdtech.jellyfin.R import dev.jdtech.jellyfin.viewmodels.LoginViewModel import javax.inject.Inject import kotlinx.coroutines.launch diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsFragment.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsFragment.kt index 971a55a3..b209e5c5 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsFragment.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/fragments/SettingsFragment.kt @@ -7,8 +7,8 @@ import androidx.navigation.fragment.findNavController import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import dagger.hilt.android.AndroidEntryPoint -import dev.jdtech.jellyfin.R import dev.jdtech.jellyfin.AppPreferences +import dev.jdtech.jellyfin.R import javax.inject.Inject @AndroidEntryPoint diff --git a/app/phone/src/main/java/dev/jdtech/jellyfin/utils/Extensions.kt b/app/phone/src/main/java/dev/jdtech/jellyfin/utils/Extensions.kt index e177903f..63d08994 100644 --- a/app/phone/src/main/java/dev/jdtech/jellyfin/utils/Extensions.kt +++ b/app/phone/src/main/java/dev/jdtech/jellyfin/utils/Extensions.kt @@ -12,4 +12,4 @@ fun Fragment.checkIfLoginRequired(error: String?) { findNavController().navigate(AppNavigationDirections.actionGlobalLoginFragment(reLogin = true)) } } -} \ No newline at end of file +} diff --git a/build.gradle.kts b/build.gradle.kts index 471d7e4d..d931449c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,3 +1,5 @@ +import com.android.build.api.dsl.CommonExtension + // Top-level build file where you can add configuration options common to all sub-projects/modules. @Suppress("DSL_SCOPE_VIOLATION") // False positive plugins { @@ -18,6 +20,17 @@ allprojects { google() mavenCentral() } + + val configureAndroid = { _: AppliedPlugin -> + extensions.configure>("android") { + lint { + informational += "MissingTranslation" + } + } + } + + pluginManager.withPlugin("com.android.library", configureAndroid) + pluginManager.withPlugin("com.android.application", configureAndroid) } tasks.create("clean") { diff --git a/core/src/main/java/dev/jdtech/jellyfin/di/ApiModule.kt b/core/src/main/java/dev/jdtech/jellyfin/di/ApiModule.kt index f1113e95..b340ebb5 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/di/ApiModule.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/di/ApiModule.kt @@ -6,9 +6,9 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent +import dev.jdtech.jellyfin.AppPreferences import dev.jdtech.jellyfin.api.JellyfinApi import dev.jdtech.jellyfin.database.ServerDatabaseDao -import dev.jdtech.jellyfin.AppPreferences import javax.inject.Singleton @Module diff --git a/core/src/main/java/dev/jdtech/jellyfin/dialogs/SortDialogFragment.kt b/core/src/main/java/dev/jdtech/jellyfin/dialogs/SortDialogFragment.kt index 7c531251..06d4ba9f 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/dialogs/SortDialogFragment.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/dialogs/SortDialogFragment.kt @@ -11,8 +11,8 @@ import dev.jdtech.jellyfin.models.SortBy import dev.jdtech.jellyfin.viewmodels.LibraryViewModel import java.lang.IllegalStateException import java.util.UUID -import org.jellyfin.sdk.model.api.SortOrder import javax.inject.Inject +import org.jellyfin.sdk.model.api.SortOrder @AndroidEntryPoint class SortDialogFragment( diff --git a/core/src/main/java/dev/jdtech/jellyfin/models/EpisodeItem.kt b/core/src/main/java/dev/jdtech/jellyfin/models/EpisodeItem.kt index d7398652..9bebc374 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/models/EpisodeItem.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/models/EpisodeItem.kt @@ -1,7 +1,7 @@ package dev.jdtech.jellyfin.models -import org.jellyfin.sdk.model.api.BaseItemDto import java.util.UUID +import org.jellyfin.sdk.model.api.BaseItemDto sealed class EpisodeItem { abstract val id: UUID @@ -13,4 +13,4 @@ sealed class EpisodeItem { data class Episode(val episode: BaseItemDto) : EpisodeItem() { override val id = episode.id } -} \ No newline at end of file +} diff --git a/core/src/main/java/dev/jdtech/jellyfin/models/ExceptionUiText.kt b/core/src/main/java/dev/jdtech/jellyfin/models/ExceptionUiText.kt index 7c65a9d5..79b63652 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/models/ExceptionUiText.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/models/ExceptionUiText.kt @@ -2,8 +2,8 @@ package dev.jdtech.jellyfin.models data class ExceptionUiText( val uiText: UiText -): Exception() +) : Exception() data class ExceptionUiTexts( val uiTexts: Collection -): Exception() +) : Exception() diff --git a/core/src/main/java/dev/jdtech/jellyfin/models/HomeItem.kt b/core/src/main/java/dev/jdtech/jellyfin/models/HomeItem.kt index 7e5a99d2..58b6c69e 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/models/HomeItem.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/models/HomeItem.kt @@ -16,4 +16,4 @@ sealed class HomeItem { } abstract val id: UUID -} \ No newline at end of file +} diff --git a/core/src/main/java/dev/jdtech/jellyfin/models/UiText.kt b/core/src/main/java/dev/jdtech/jellyfin/models/UiText.kt index 51af2286..3d7c6257 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/models/UiText.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/models/UiText.kt @@ -4,14 +4,14 @@ import android.content.res.Resources import androidx.annotation.StringRes sealed class UiText { - data class DynamicString(val value: String): UiText() + data class DynamicString(val value: String) : UiText() class StringResource( @StringRes val resId: Int, vararg val args: Any? - ): UiText() + ) : UiText() fun asString(resources: Resources): String { - return when(this) { + return when (this) { is DynamicString -> return value is StringResource -> resources.getString(resId, args) } diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/AddServerViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/AddServerViewModel.kt index d45b8c09..f10a2c1e 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/AddServerViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/AddServerViewModel.kt @@ -3,8 +3,9 @@ package dev.jdtech.jellyfin.viewmodels import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import dev.jdtech.jellyfin.core.R +import dev.jdtech.jellyfin.AppPreferences import dev.jdtech.jellyfin.api.JellyfinApi +import dev.jdtech.jellyfin.core.R import dev.jdtech.jellyfin.database.ServerDatabaseDao import dev.jdtech.jellyfin.models.DiscoveredServer import dev.jdtech.jellyfin.models.ExceptionUiText @@ -12,7 +13,6 @@ import dev.jdtech.jellyfin.models.ExceptionUiTexts import dev.jdtech.jellyfin.models.Server import dev.jdtech.jellyfin.models.ServerAddress import dev.jdtech.jellyfin.models.UiText -import dev.jdtech.jellyfin.AppPreferences import java.util.UUID import javax.inject.Inject import kotlinx.coroutines.CancellationException diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/LibraryViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/LibraryViewModel.kt index ce52bd90..4df82114 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/LibraryViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/LibraryViewModel.kt @@ -5,8 +5,8 @@ import androidx.lifecycle.viewModelScope import androidx.paging.PagingData import androidx.paging.cachedIn import dagger.hilt.android.lifecycle.HiltViewModel -import dev.jdtech.jellyfin.repository.JellyfinRepository import dev.jdtech.jellyfin.models.SortBy +import dev.jdtech.jellyfin.repository.JellyfinRepository import java.util.UUID import javax.inject.Inject import kotlinx.coroutines.flow.Flow diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/LoginViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/LoginViewModel.kt index d56085d5..38db817a 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/LoginViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/LoginViewModel.kt @@ -3,12 +3,12 @@ package dev.jdtech.jellyfin.viewmodels import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import dev.jdtech.jellyfin.core.R +import dev.jdtech.jellyfin.AppPreferences import dev.jdtech.jellyfin.api.JellyfinApi +import dev.jdtech.jellyfin.core.R import dev.jdtech.jellyfin.database.ServerDatabaseDao import dev.jdtech.jellyfin.models.UiText import dev.jdtech.jellyfin.models.User -import dev.jdtech.jellyfin.AppPreferences import javax.inject.Inject import kotlin.Exception import kotlinx.coroutines.Dispatchers diff --git a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/ServerSelectViewModel.kt b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/ServerSelectViewModel.kt index ce049a9b..f56146ec 100644 --- a/core/src/main/java/dev/jdtech/jellyfin/viewmodels/ServerSelectViewModel.kt +++ b/core/src/main/java/dev/jdtech/jellyfin/viewmodels/ServerSelectViewModel.kt @@ -3,10 +3,10 @@ package dev.jdtech.jellyfin.viewmodels import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import dev.jdtech.jellyfin.AppPreferences import dev.jdtech.jellyfin.api.JellyfinApi import dev.jdtech.jellyfin.database.ServerDatabaseDao import dev.jdtech.jellyfin.models.Server -import dev.jdtech.jellyfin.AppPreferences import javax.inject.Inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableSharedFlow diff --git a/data/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt b/data/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt index 8300ad8b..ee528986 100644 --- a/data/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt +++ b/data/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt @@ -1,8 +1,8 @@ package dev.jdtech.jellyfin.api import android.content.Context -import dev.jdtech.jellyfin.data.BuildConfig import dev.jdtech.jellyfin.Constants +import dev.jdtech.jellyfin.data.BuildConfig import java.util.UUID import org.jellyfin.sdk.api.client.HttpClientOptions import org.jellyfin.sdk.api.client.extensions.devicesApi diff --git a/gradle.properties b/gradle.properties index 2d785350..d2c2294c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects diff --git a/player/video/src/main/java/dev/jdtech/jellyfin/dialogs/TrackSelectionDialogFragment.kt b/player/video/src/main/java/dev/jdtech/jellyfin/dialogs/TrackSelectionDialogFragment.kt index bde2c38c..03ba36a9 100644 --- a/player/video/src/main/java/dev/jdtech/jellyfin/dialogs/TrackSelectionDialogFragment.kt +++ b/player/video/src/main/java/dev/jdtech/jellyfin/dialogs/TrackSelectionDialogFragment.kt @@ -4,9 +4,9 @@ import android.app.Dialog import android.os.Bundle import androidx.fragment.app.DialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder -import dev.jdtech.jellyfin.player.video.R import dev.jdtech.jellyfin.mpv.MPVPlayer import dev.jdtech.jellyfin.mpv.TrackType +import dev.jdtech.jellyfin.player.video.R import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel import java.lang.IllegalStateException diff --git a/player/video/src/main/java/dev/jdtech/jellyfin/mpv/TrackType.kt b/player/video/src/main/java/dev/jdtech/jellyfin/mpv/TrackType.kt index acf0c65f..4d14c72c 100644 --- a/player/video/src/main/java/dev/jdtech/jellyfin/mpv/TrackType.kt +++ b/player/video/src/main/java/dev/jdtech/jellyfin/mpv/TrackType.kt @@ -4,4 +4,4 @@ enum class TrackType(val type: String) { VIDEO("video"), AUDIO("audio"), SUBTITLE("sub") -} \ No newline at end of file +} diff --git a/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerViewModel.kt b/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerViewModel.kt index d0cfab01..22b251b1 100644 --- a/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerViewModel.kt +++ b/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerViewModel.kt @@ -7,10 +7,10 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.media3.common.MimeTypes import dagger.hilt.android.lifecycle.HiltViewModel -import dev.jdtech.jellyfin.player.video.R import dev.jdtech.jellyfin.database.DownloadDatabaseDao import dev.jdtech.jellyfin.models.ExternalSubtitle import dev.jdtech.jellyfin.models.PlayerItem +import dev.jdtech.jellyfin.player.video.R import dev.jdtech.jellyfin.repository.JellyfinRepository import dev.jdtech.jellyfin.utils.getDownloadPlayerItem import dev.jdtech.jellyfin.utils.isItemAvailable