* 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:
js6pak 2023-02-11 12:01:02 +01:00 committed by GitHub
parent a2e581bc91
commit 5f7b7eaf63
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
23 changed files with 70 additions and 27 deletions

29
.github/workflows/build.yaml vendored Normal file
View 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

View file

@ -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" />

View file

@ -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() {

View file

@ -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)
} }
} }

View file

@ -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

View file

@ -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

View file

@ -12,4 +12,4 @@ fun Fragment.checkIfLoginRequired(error: String?) {
findNavController().navigate(AppNavigationDirections.actionGlobalLoginFragment(reLogin = true)) findNavController().navigate(AppNavigationDirections.actionGlobalLoginFragment(reLogin = true))
} }
} }
} }

View file

@ -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") {

View file

@ -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

View file

@ -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(

View file

@ -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
} }
} }

View file

@ -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()

View file

@ -16,4 +16,4 @@ sealed class HomeItem {
} }
abstract val id: UUID abstract val id: UUID
} }

View file

@ -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)
} }

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -4,4 +4,4 @@ enum class TrackType(val type: String) {
VIDEO("video"), VIDEO("video"),
AUDIO("audio"), AUDIO("audio"),
SUBTITLE("sub") SUBTITLE("sub")
} }

View file

@ -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