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 <jarnedemeulemeester@gmail.com>
This commit is contained in:
parent
a2e581bc91
commit
5f7b7eaf63
23 changed files with 70 additions and 27 deletions
29
.github/workflows/build.yaml
vendored
Normal file
29
.github/workflows/build.yaml
vendored
Normal file
|
@ -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
|
|
@ -2,6 +2,7 @@
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
|
||||||
<uses-feature android:name="android.hardware.wifi" android:required="false" />
|
<uses-feature android:name="android.hardware.wifi" android:required="false" />
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,8 @@ import android.app.Application
|
||||||
import androidx.appcompat.app.AppCompatDelegate
|
import androidx.appcompat.app.AppCompatDelegate
|
||||||
import com.google.android.material.color.DynamicColors
|
import com.google.android.material.color.DynamicColors
|
||||||
import dagger.hilt.android.HiltAndroidApp
|
import dagger.hilt.android.HiltAndroidApp
|
||||||
import timber.log.Timber
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
import timber.log.Timber
|
||||||
|
|
||||||
@HiltAndroidApp
|
@HiltAndroidApp
|
||||||
class BaseApplication : Application() {
|
class BaseApplication : Application() {
|
||||||
|
|
|
@ -113,4 +113,4 @@ class DownloadEpisodeListAdapter(
|
||||||
class OnClickListener(val clickListener: (item: PlayerItem) -> Unit) {
|
class OnClickListener(val clickListener: (item: PlayerItem) -> Unit) {
|
||||||
fun onClick(item: PlayerItem) = clickListener(item)
|
fun onClick(item: PlayerItem) = clickListener(item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,11 +15,11 @@ import androidx.lifecycle.repeatOnLifecycle
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
import androidx.navigation.fragment.navArgs
|
import androidx.navigation.fragment.navArgs
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
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.adapters.UserLoginListAdapter
|
||||||
import dev.jdtech.jellyfin.database.ServerDatabaseDao
|
import dev.jdtech.jellyfin.database.ServerDatabaseDao
|
||||||
import dev.jdtech.jellyfin.databinding.FragmentLoginBinding
|
import dev.jdtech.jellyfin.databinding.FragmentLoginBinding
|
||||||
import dev.jdtech.jellyfin.AppPreferences
|
|
||||||
import dev.jdtech.jellyfin.R
|
|
||||||
import dev.jdtech.jellyfin.viewmodels.LoginViewModel
|
import dev.jdtech.jellyfin.viewmodels.LoginViewModel
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
|
@ -7,8 +7,8 @@ import androidx.navigation.fragment.findNavController
|
||||||
import androidx.preference.Preference
|
import androidx.preference.Preference
|
||||||
import androidx.preference.PreferenceFragmentCompat
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import dev.jdtech.jellyfin.R
|
|
||||||
import dev.jdtech.jellyfin.AppPreferences
|
import dev.jdtech.jellyfin.AppPreferences
|
||||||
|
import dev.jdtech.jellyfin.R
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
|
|
|
@ -12,4 +12,4 @@ fun Fragment.checkIfLoginRequired(error: String?) {
|
||||||
findNavController().navigate(AppNavigationDirections.actionGlobalLoginFragment(reLogin = true))
|
findNavController().navigate(AppNavigationDirections.actionGlobalLoginFragment(reLogin = true))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
@Suppress("DSL_SCOPE_VIOLATION") // False positive
|
@Suppress("DSL_SCOPE_VIOLATION") // False positive
|
||||||
plugins {
|
plugins {
|
||||||
|
@ -18,6 +20,17 @@ allprojects {
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val configureAndroid = { _: AppliedPlugin ->
|
||||||
|
extensions.configure<CommonExtension<*, *, *, *>>("android") {
|
||||||
|
lint {
|
||||||
|
informational += "MissingTranslation"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pluginManager.withPlugin("com.android.library", configureAndroid)
|
||||||
|
pluginManager.withPlugin("com.android.application", configureAndroid)
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.create<Delete>("clean") {
|
tasks.create<Delete>("clean") {
|
||||||
|
|
|
@ -6,9 +6,9 @@ import dagger.Provides
|
||||||
import dagger.hilt.InstallIn
|
import dagger.hilt.InstallIn
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||||
import dagger.hilt.components.SingletonComponent
|
import dagger.hilt.components.SingletonComponent
|
||||||
|
import dev.jdtech.jellyfin.AppPreferences
|
||||||
import dev.jdtech.jellyfin.api.JellyfinApi
|
import dev.jdtech.jellyfin.api.JellyfinApi
|
||||||
import dev.jdtech.jellyfin.database.ServerDatabaseDao
|
import dev.jdtech.jellyfin.database.ServerDatabaseDao
|
||||||
import dev.jdtech.jellyfin.AppPreferences
|
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Module
|
@Module
|
||||||
|
|
|
@ -11,8 +11,8 @@ import dev.jdtech.jellyfin.models.SortBy
|
||||||
import dev.jdtech.jellyfin.viewmodels.LibraryViewModel
|
import dev.jdtech.jellyfin.viewmodels.LibraryViewModel
|
||||||
import java.lang.IllegalStateException
|
import java.lang.IllegalStateException
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
import org.jellyfin.sdk.model.api.SortOrder
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
import org.jellyfin.sdk.model.api.SortOrder
|
||||||
|
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
class SortDialogFragment(
|
class SortDialogFragment(
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package dev.jdtech.jellyfin.models
|
package dev.jdtech.jellyfin.models
|
||||||
|
|
||||||
import org.jellyfin.sdk.model.api.BaseItemDto
|
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
|
import org.jellyfin.sdk.model.api.BaseItemDto
|
||||||
|
|
||||||
sealed class EpisodeItem {
|
sealed class EpisodeItem {
|
||||||
abstract val id: UUID
|
abstract val id: UUID
|
||||||
|
@ -13,4 +13,4 @@ sealed class EpisodeItem {
|
||||||
data class Episode(val episode: BaseItemDto) : EpisodeItem() {
|
data class Episode(val episode: BaseItemDto) : EpisodeItem() {
|
||||||
override val id = episode.id
|
override val id = episode.id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,8 +2,8 @@ package dev.jdtech.jellyfin.models
|
||||||
|
|
||||||
data class ExceptionUiText(
|
data class ExceptionUiText(
|
||||||
val uiText: UiText
|
val uiText: UiText
|
||||||
): Exception()
|
) : Exception()
|
||||||
|
|
||||||
data class ExceptionUiTexts(
|
data class ExceptionUiTexts(
|
||||||
val uiTexts: Collection<UiText>
|
val uiTexts: Collection<UiText>
|
||||||
): Exception()
|
) : Exception()
|
||||||
|
|
|
@ -16,4 +16,4 @@ sealed class HomeItem {
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract val id: UUID
|
abstract val id: UUID
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,14 +4,14 @@ import android.content.res.Resources
|
||||||
import androidx.annotation.StringRes
|
import androidx.annotation.StringRes
|
||||||
|
|
||||||
sealed class UiText {
|
sealed class UiText {
|
||||||
data class DynamicString(val value: String): UiText()
|
data class DynamicString(val value: String) : UiText()
|
||||||
class StringResource(
|
class StringResource(
|
||||||
@StringRes val resId: Int,
|
@StringRes val resId: Int,
|
||||||
vararg val args: Any?
|
vararg val args: Any?
|
||||||
): UiText()
|
) : UiText()
|
||||||
|
|
||||||
fun asString(resources: Resources): String {
|
fun asString(resources: Resources): String {
|
||||||
return when(this) {
|
return when (this) {
|
||||||
is DynamicString -> return value
|
is DynamicString -> return value
|
||||||
is StringResource -> resources.getString(resId, args)
|
is StringResource -> resources.getString(resId, args)
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,8 +3,9 @@ package dev.jdtech.jellyfin.viewmodels
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
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.api.JellyfinApi
|
||||||
|
import dev.jdtech.jellyfin.core.R
|
||||||
import dev.jdtech.jellyfin.database.ServerDatabaseDao
|
import dev.jdtech.jellyfin.database.ServerDatabaseDao
|
||||||
import dev.jdtech.jellyfin.models.DiscoveredServer
|
import dev.jdtech.jellyfin.models.DiscoveredServer
|
||||||
import dev.jdtech.jellyfin.models.ExceptionUiText
|
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.Server
|
||||||
import dev.jdtech.jellyfin.models.ServerAddress
|
import dev.jdtech.jellyfin.models.ServerAddress
|
||||||
import dev.jdtech.jellyfin.models.UiText
|
import dev.jdtech.jellyfin.models.UiText
|
||||||
import dev.jdtech.jellyfin.AppPreferences
|
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlinx.coroutines.CancellationException
|
import kotlinx.coroutines.CancellationException
|
||||||
|
|
|
@ -5,8 +5,8 @@ import androidx.lifecycle.viewModelScope
|
||||||
import androidx.paging.PagingData
|
import androidx.paging.PagingData
|
||||||
import androidx.paging.cachedIn
|
import androidx.paging.cachedIn
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import dev.jdtech.jellyfin.repository.JellyfinRepository
|
|
||||||
import dev.jdtech.jellyfin.models.SortBy
|
import dev.jdtech.jellyfin.models.SortBy
|
||||||
|
import dev.jdtech.jellyfin.repository.JellyfinRepository
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
|
|
@ -3,12 +3,12 @@ package dev.jdtech.jellyfin.viewmodels
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
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.api.JellyfinApi
|
||||||
|
import dev.jdtech.jellyfin.core.R
|
||||||
import dev.jdtech.jellyfin.database.ServerDatabaseDao
|
import dev.jdtech.jellyfin.database.ServerDatabaseDao
|
||||||
import dev.jdtech.jellyfin.models.UiText
|
import dev.jdtech.jellyfin.models.UiText
|
||||||
import dev.jdtech.jellyfin.models.User
|
import dev.jdtech.jellyfin.models.User
|
||||||
import dev.jdtech.jellyfin.AppPreferences
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlin.Exception
|
import kotlin.Exception
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
|
|
@ -3,10 +3,10 @@ package dev.jdtech.jellyfin.viewmodels
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
|
import dev.jdtech.jellyfin.AppPreferences
|
||||||
import dev.jdtech.jellyfin.api.JellyfinApi
|
import dev.jdtech.jellyfin.api.JellyfinApi
|
||||||
import dev.jdtech.jellyfin.database.ServerDatabaseDao
|
import dev.jdtech.jellyfin.database.ServerDatabaseDao
|
||||||
import dev.jdtech.jellyfin.models.Server
|
import dev.jdtech.jellyfin.models.Server
|
||||||
import dev.jdtech.jellyfin.AppPreferences
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
package dev.jdtech.jellyfin.api
|
package dev.jdtech.jellyfin.api
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import dev.jdtech.jellyfin.data.BuildConfig
|
|
||||||
import dev.jdtech.jellyfin.Constants
|
import dev.jdtech.jellyfin.Constants
|
||||||
|
import dev.jdtech.jellyfin.data.BuildConfig
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
import org.jellyfin.sdk.api.client.HttpClientOptions
|
import org.jellyfin.sdk.api.client.HttpClientOptions
|
||||||
import org.jellyfin.sdk.api.client.extensions.devicesApi
|
import org.jellyfin.sdk.api.client.extensions.devicesApi
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
# http://www.gradle.org/docs/current/userguide/build_environment.html
|
# http://www.gradle.org/docs/current/userguide/build_environment.html
|
||||||
# Specifies the JVM arguments used for the daemon process.
|
# Specifies the JVM arguments used for the daemon process.
|
||||||
# The setting is particularly useful for tweaking memory settings.
|
# 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.
|
# When configured, Gradle will run in incubating parallel mode.
|
||||||
# This option should only be used with decoupled projects. More details, visit
|
# 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
|
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
|
||||||
|
|
|
@ -4,9 +4,9 @@ import android.app.Dialog
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.fragment.app.DialogFragment
|
import androidx.fragment.app.DialogFragment
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
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.MPVPlayer
|
||||||
import dev.jdtech.jellyfin.mpv.TrackType
|
import dev.jdtech.jellyfin.mpv.TrackType
|
||||||
|
import dev.jdtech.jellyfin.player.video.R
|
||||||
import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel
|
import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel
|
||||||
import java.lang.IllegalStateException
|
import java.lang.IllegalStateException
|
||||||
|
|
||||||
|
|
|
@ -4,4 +4,4 @@ enum class TrackType(val type: String) {
|
||||||
VIDEO("video"),
|
VIDEO("video"),
|
||||||
AUDIO("audio"),
|
AUDIO("audio"),
|
||||||
SUBTITLE("sub")
|
SUBTITLE("sub")
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,10 +7,10 @@ import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import androidx.media3.common.MimeTypes
|
import androidx.media3.common.MimeTypes
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import dev.jdtech.jellyfin.player.video.R
|
|
||||||
import dev.jdtech.jellyfin.database.DownloadDatabaseDao
|
import dev.jdtech.jellyfin.database.DownloadDatabaseDao
|
||||||
import dev.jdtech.jellyfin.models.ExternalSubtitle
|
import dev.jdtech.jellyfin.models.ExternalSubtitle
|
||||||
import dev.jdtech.jellyfin.models.PlayerItem
|
import dev.jdtech.jellyfin.models.PlayerItem
|
||||||
|
import dev.jdtech.jellyfin.player.video.R
|
||||||
import dev.jdtech.jellyfin.repository.JellyfinRepository
|
import dev.jdtech.jellyfin.repository.JellyfinRepository
|
||||||
import dev.jdtech.jellyfin.utils.getDownloadPlayerItem
|
import dev.jdtech.jellyfin.utils.getDownloadPlayerItem
|
||||||
import dev.jdtech.jellyfin.utils.isItemAvailable
|
import dev.jdtech.jellyfin.utils.isItemAvailable
|
||||||
|
|
Loading…
Reference in a new issue