From 4bff2f92bb3671a8efed35dc4b4c91e573c9c8e8 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Wed, 22 Mar 2023 18:31:47 +0100 Subject: [PATCH 01/18] Add a sleep timer --- app/build.gradle | 1 + .../code/zapp/app/main/MainActivity.kt | 6 ++++++ .../app/settings/repository/SettingsRepository.kt | 7 +++++++ app/src/main/res/values-en/strings.xml | 2 ++ app/src/main/res/values/arrays.xml | 12 ++++++++++++ app/src/main/res/values/donottranslate.xml | 1 + app/src/main/res/values/strings.xml | 2 ++ app/src/main/res/xml/preferences.xml | 12 ++++++++++-- 8 files changed, 41 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 20c0c6f9..e1aa594f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -46,6 +46,7 @@ android { buildTypes { debug { shrinkResources false + applicationIdSuffix '.debug' } release { shrinkResources true diff --git a/app/src/main/java/de/christinecoenen/code/zapp/app/main/MainActivity.kt b/app/src/main/java/de/christinecoenen/code/zapp/app/main/MainActivity.kt index 9436a572..2945bb30 100644 --- a/app/src/main/java/de/christinecoenen/code/zapp/app/main/MainActivity.kt +++ b/app/src/main/java/de/christinecoenen/code/zapp/app/main/MainActivity.kt @@ -14,6 +14,7 @@ import androidx.core.view.MenuProvider import androidx.core.view.isVisible import androidx.navigation.NavController import androidx.navigation.NavDestination +import androidx.navigation.NavGraph import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.* import androidx.preference.PreferenceManager @@ -43,7 +44,10 @@ class MainActivity : AppCompatActivity(), MenuProvider { setContentView(binding.root) + val startFragmentId = SettingsRepository(this).startFragment + navController = binding.navHostFragment.getFragment().navController + navController.graph.setStartDestination(startFragmentId) appBarConfiguration = AppBarConfiguration( setOf( @@ -65,6 +69,8 @@ class MainActivity : AppCompatActivity(), MenuProvider { PreferenceManager.setDefaultValues(application, R.xml.preferences, false) + navController.navigate(startFragmentId) + requestPermissions() if (!settingsRepository.dynamicColors) { diff --git a/app/src/main/java/de/christinecoenen/code/zapp/app/settings/repository/SettingsRepository.kt b/app/src/main/java/de/christinecoenen/code/zapp/app/settings/repository/SettingsRepository.kt index bb655720..a05294bc 100644 --- a/app/src/main/java/de/christinecoenen/code/zapp/app/settings/repository/SettingsRepository.kt +++ b/app/src/main/java/de/christinecoenen/code/zapp/app/settings/repository/SettingsRepository.kt @@ -61,6 +61,13 @@ class SettingsRepository(context: Context) { return prefValueToUiMode(uiMode) } + val startFragment: Int + get() = when (preferences.getString(context.getString(R.string.pref_key_start_tab), "live")) { + "mediathek" -> R.id.mediathekListFragment + "personal" -> R.id.personalFragment + else -> R.id.channelListFragment + } + fun prefValueToUiMode(prefSetting: String?): Int { val defaultMode = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM else AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index e9df5420..e2ba9be1 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -141,6 +141,8 @@ Always light Always dark + Start page + Don\'t play back Lowest quality Medium quality diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 5561e47e..7da61ca9 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -29,6 +29,18 @@ @string/stream_quality_cellular_highest + + @string/activity_main_tab_live + @string/activity_main_tab_mediathek + @string/activity_main_tab_personal + + + + live + mediathek + personal + + @fraction/mediathek_filter_min_duration @fraction/mediathek_filter_max_duration diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 18413841..94b1e438 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -12,5 +12,6 @@ pref_shortcuts pref_key_player_zoomed pref_key_download_to_sd_card + pref_key_start_tab diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a4bde1c2..ea73477a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -141,6 +141,8 @@ Immer hell Immer dunkel + Startseite + Videos nicht abspielen Niedrigste Qualität Mittlere Qualität diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 3587a448..2f66eb73 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -16,9 +16,17 @@ + android:title="@string/pref_dynamic_colors" /> + + Date: Thu, 23 Mar 2023 14:26:54 +0100 Subject: [PATCH 02/18] Remove unneeded duplicated settings repo --- app/build.gradle | 1 - .../java/de/christinecoenen/code/zapp/app/main/MainActivity.kt | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e1aa594f..20c0c6f9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -46,7 +46,6 @@ android { buildTypes { debug { shrinkResources false - applicationIdSuffix '.debug' } release { shrinkResources true diff --git a/app/src/main/java/de/christinecoenen/code/zapp/app/main/MainActivity.kt b/app/src/main/java/de/christinecoenen/code/zapp/app/main/MainActivity.kt index 2945bb30..b07ae605 100644 --- a/app/src/main/java/de/christinecoenen/code/zapp/app/main/MainActivity.kt +++ b/app/src/main/java/de/christinecoenen/code/zapp/app/main/MainActivity.kt @@ -44,7 +44,7 @@ class MainActivity : AppCompatActivity(), MenuProvider { setContentView(binding.root) - val startFragmentId = SettingsRepository(this).startFragment + val startFragmentId = settingsRepository.startFragment navController = binding.navHostFragment.getFragment().navController navController.graph.setStartDestination(startFragmentId) From 0818ad56e1ece4e753a9bd7400a591d1abe3175d Mon Sep 17 00:00:00 2001 From: Christine Coenen Date: Sat, 25 Mar 2023 19:08:44 +0100 Subject: [PATCH 03/18] Add start tab setting to changelog --- app/src/main/res/raw/changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/raw/changelog.md b/app/src/main/res/raw/changelog.md index d5fefbaf..dd14454d 100644 --- a/app/src/main/res/raw/changelog.md +++ b/app/src/main/res/raw/changelog.md @@ -2,6 +2,7 @@ * Einstellungen im Material-Design (danke an Bnyro) * Schlummerfunktion (danke an Bnyro) * Exo-Player-Update - sollte Playback-Probleme auf einigen Geräten beheben +* Möglichkeit, Start-Tab in den Einstellungen zu setzen (danke an Bnyro) # 8.2.0 * Unterstützung für dynamische Gerätefarben From d255876e437706e0954f1157c4a7e976bc017394 Mon Sep 17 00:00:00 2001 From: Christine Coenen Date: Wed, 5 Apr 2023 14:27:15 +0200 Subject: [PATCH 04/18] Show sleep timer fully --- .../code/zapp/app/player/SleepTimerBottomSheet.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/de/christinecoenen/code/zapp/app/player/SleepTimerBottomSheet.kt b/app/src/main/java/de/christinecoenen/code/zapp/app/player/SleepTimerBottomSheet.kt index ae1c149e..b9a82706 100644 --- a/app/src/main/java/de/christinecoenen/code/zapp/app/player/SleepTimerBottomSheet.kt +++ b/app/src/main/java/de/christinecoenen/code/zapp/app/player/SleepTimerBottomSheet.kt @@ -82,6 +82,7 @@ class SleepTimerBottomSheet : BottomSheetDialogFragment(), SleepTimer.Listener { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) BackgroundPlayerService.bind(requireContext(), backgroundPlayerServiceConnection) + expand() } override fun onDestroyView() { From d9d639bf713cd93e5597755842a9f35b38685b34 Mon Sep 17 00:00:00 2001 From: Christine Coenen Date: Wed, 5 Apr 2023 14:40:50 +0200 Subject: [PATCH 05/18] Hopefully fix null pointers when device goes to sleep --- .../zapp/app/mediathek/ui/list/MediathekListFragment.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/de/christinecoenen/code/zapp/app/mediathek/ui/list/MediathekListFragment.kt b/app/src/main/java/de/christinecoenen/code/zapp/app/mediathek/ui/list/MediathekListFragment.kt index d86c840d..a2960218 100644 --- a/app/src/main/java/de/christinecoenen/code/zapp/app/mediathek/ui/list/MediathekListFragment.kt +++ b/app/src/main/java/de/christinecoenen/code/zapp/app/mediathek/ui/list/MediathekListFragment.kt @@ -26,6 +26,7 @@ import de.christinecoenen.code.zapp.app.mediathek.ui.list.adapter.PagedMediathek import de.christinecoenen.code.zapp.databinding.MediathekListFragmentBinding import de.christinecoenen.code.zapp.databinding.ViewNoShowsBinding import de.christinecoenen.code.zapp.models.shows.MediathekShow +import de.christinecoenen.code.zapp.utils.system.LifecycleOwnerHelper.launchOnCreated import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.drop @@ -120,13 +121,13 @@ class MediathekListFragment : Fragment(), binding.list.adapter = adapter.withLoadStateFooter(FooterLoadStateAdapter(adapter::retry)) - viewLifecycleOwner.lifecycleScope.launch { + viewLifecycleOwner.launchOnCreated { viewmodel.pageFlow.collectLatest { pagingData -> adapter.submitData(pagingData) } } - viewLifecycleOwner.lifecycleScope.launch { + viewLifecycleOwner.launchOnCreated { viewmodel .pageFlow .drop(1) @@ -138,7 +139,7 @@ class MediathekListFragment : Fragment(), } } - viewLifecycleOwner.lifecycleScope.launch { + viewLifecycleOwner.launchOnCreated { adapter.loadStateFlow .map { it.refresh } .distinctUntilChanged() From 6b3589d411c6b90a5e42b2c681a00d9b294a0d4a Mon Sep 17 00:00:00 2001 From: Christine Coenen Date: Wed, 5 Apr 2023 14:51:52 +0200 Subject: [PATCH 06/18] Use different app identifier for debug version --- app/build.gradle | 1 + app/src/debug/res/values/ic_launcher_background.xml | 4 ++++ app/src/debug/res/values/strings.xml | 3 +++ 3 files changed, 8 insertions(+) create mode 100644 app/src/debug/res/values/ic_launcher_background.xml create mode 100644 app/src/debug/res/values/strings.xml diff --git a/app/build.gradle b/app/build.gradle index a85183c8..5367e6b7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -46,6 +46,7 @@ android { buildTypes { debug { shrinkResources false + applicationIdSuffix '.debug' } release { shrinkResources true diff --git a/app/src/debug/res/values/ic_launcher_background.xml b/app/src/debug/res/values/ic_launcher_background.xml new file mode 100644 index 00000000..e8e14748 --- /dev/null +++ b/app/src/debug/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #850048 + diff --git a/app/src/debug/res/values/strings.xml b/app/src/debug/res/values/strings.xml new file mode 100644 index 00000000..2ec0a56b --- /dev/null +++ b/app/src/debug/res/values/strings.xml @@ -0,0 +1,3 @@ + + Zapp (Debug) + From 22607a0dc21f54ce344ef8889cd57a69bae3c9ff Mon Sep 17 00:00:00 2001 From: Christine Coenen Date: Thu, 11 May 2023 15:08:59 +0200 Subject: [PATCH 07/18] Update gradle to 8.0 --- app/build.gradle | 12 +++++------- app/proguard-rules.pro | 11 ++++++++++- .../ui/list/adapter/MediathekItemViewHolder.kt | 4 ++-- build.gradle | 2 +- gradle.properties | 3 +++ gradle/wrapper/gradle-wrapper.properties | 2 +- 6 files changed, 22 insertions(+), 12 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 5367e6b7..88c109bb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,16 +16,16 @@ android { versionCode 65 versionName "8.2.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - resConfigs 'de', 'en' + resourceConfigurations += ['de', 'en'] } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 } kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8.toString() + jvmTarget = JavaVersion.VERSION_17.toString() freeCompilerArgs += [ '-opt-in=kotlin.RequiresOptIn', ] @@ -38,9 +38,7 @@ android { } buildFeatures { - viewBinding { - enabled = true - } + viewBinding = true } buildTypes { diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 8b137891..bf79eae9 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1 +1,10 @@ - +# Please add these rules to your existing keep rules in order to suppress warnings. +# This is generated automatically by the Android Gradle plugin. +-dontwarn org.bouncycastle.jsse.BCSSLParameters +-dontwarn org.bouncycastle.jsse.BCSSLSocket +-dontwarn org.bouncycastle.jsse.provider.BouncyCastleJsseProvider +-dontwarn org.joda.convert.FromString +-dontwarn org.joda.convert.ToString +-dontwarn org.openjsse.javax.net.ssl.SSLParameters +-dontwarn org.openjsse.javax.net.ssl.SSLSocket +-dontwarn org.openjsse.net.ssl.OpenJSSE diff --git a/app/src/main/java/de/christinecoenen/code/zapp/app/mediathek/ui/list/adapter/MediathekItemViewHolder.kt b/app/src/main/java/de/christinecoenen/code/zapp/app/mediathek/ui/list/adapter/MediathekItemViewHolder.kt index 70971fc2..ce7b6b50 100644 --- a/app/src/main/java/de/christinecoenen/code/zapp/app/mediathek/ui/list/adapter/MediathekItemViewHolder.kt +++ b/app/src/main/java/de/christinecoenen/code/zapp/app/mediathek/ui/list/adapter/MediathekItemViewHolder.kt @@ -28,8 +28,8 @@ class MediathekItemViewHolder( private val mediathekRepository: MediathekRepository by inject() - private val bgColorDefault = binding.root.context.themeColor(R.attr.backgroundColor) - private val bgColorHighlight by lazy { binding.root.context.themeColor(R.attr.colorSurface) } + private val bgColorDefault = binding.root.context.themeColor(com.google.android.material.R.attr.backgroundColor) + private val bgColorHighlight by lazy { binding.root.context.themeColor(com.google.android.material.R.attr.colorSurface) } private var isRelevantForUserJob: Job? = null private var isBookmarkedJob: Job? = null diff --git a/build.gradle b/build.gradle index 0bd0deff..40e7d0d4 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.4.2' + classpath 'com.android.tools.build:gradle:8.0.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0" diff --git a/gradle.properties b/gradle.properties index 5f2b37d1..53762a94 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,3 +18,6 @@ org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryErro # org.gradle.parallel=true android.enableJetifier=false android.useAndroidX=true +android.defaults.buildfeatures.buildconfig=true +android.nonTransitiveRClass=true +android.nonFinalResIds=true diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c8dc6f3d..6fde288e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-all.zip From 7a81cb493eb7f40331bc2b23b949579d2a4f839a Mon Sep 17 00:00:00 2001 From: Christine Coenen Date: Thu, 11 May 2023 16:29:01 +0200 Subject: [PATCH 08/18] Update libraries --- app/build.gradle | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 88c109bb..519f6c33 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -77,17 +77,17 @@ android { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') - def fragment_version = '1.5.5' + def fragment_version = '1.5.7' // kotlin - implementation 'androidx.core:core-ktx:1.9.0' + implementation 'androidx.core:core-ktx:1.10.1' // tests def androix_test_version = '1.5.0' // device tests def espresso_version = '3.5.1' - debugImplementation "androidx.fragment:fragment-testing:1.6.0-alpha08" + debugImplementation "androidx.fragment:fragment-testing:$fragment_version" androidTestImplementation "androidx.test:core-ktx:$androix_test_version" androidTestImplementation 'androidx.test.ext:junit-ktx:1.1.5' androidTestImplementation 'androidx.test:runner:1.5.2' @@ -108,9 +108,9 @@ dependencies { // support implementation "androidx.fragment:fragment-ktx:$fragment_version" - implementation 'androidx.activity:activity-ktx:1.7.0' + implementation 'androidx.activity:activity-ktx:1.7.1' implementation 'androidx.appcompat:appcompat:1.6.1' - implementation 'com.google.android.material:material:1.8.0' + implementation 'com.google.android.material:material:1.9.0' implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.annotation:annotation:1.6.0' @@ -146,7 +146,7 @@ dependencies { implementation "androidx.work:work-runtime-ktx:$work_version" // exo player - def exoplayer_version = "2.18.5" + def exoplayer_version = "2.18.6" implementation "com.google.android.exoplayer:exoplayer-core:$exoplayer_version" implementation "com.google.android.exoplayer:exoplayer-hls:$exoplayer_version" implementation "com.google.android.exoplayer:exoplayer-ui:$exoplayer_version" From 2e4daae8bdced3c6cde394f0b383dbaf11b1a326 Mon Sep 17 00:00:00 2001 From: Christine Coenen Date: Thu, 11 May 2023 17:20:47 +0200 Subject: [PATCH 09/18] Fix player not respecting subtitle styles from system settings #367 --- .../code/zapp/utils/video/SwipeablePlayerView.kt | 13 ++++++++++++- app/src/main/res/raw/changelog.md | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/de/christinecoenen/code/zapp/utils/video/SwipeablePlayerView.kt b/app/src/main/java/de/christinecoenen/code/zapp/utils/video/SwipeablePlayerView.kt index 3c2d9329..e67112e2 100644 --- a/app/src/main/java/de/christinecoenen/code/zapp/utils/video/SwipeablePlayerView.kt +++ b/app/src/main/java/de/christinecoenen/code/zapp/utils/video/SwipeablePlayerView.kt @@ -5,10 +5,16 @@ import android.app.Activity import android.content.Context import android.media.AudioManager import android.util.AttributeSet -import android.view.* +import android.view.GestureDetector import android.view.GestureDetector.SimpleOnGestureListener +import android.view.Gravity +import android.view.MotionEvent +import android.view.ScaleGestureDetector import android.view.ScaleGestureDetector.SimpleOnScaleGestureListener +import android.view.View import android.view.View.OnTouchListener +import android.view.ViewGroup +import android.view.Window import android.widget.Toast import com.google.android.exoplayer2.ui.AspectRatioFrameLayout import com.google.android.exoplayer2.ui.AspectRatioFrameLayout.AspectRatioListener @@ -81,6 +87,9 @@ class SwipeablePlayerView @JvmOverloads constructor( } else { setZoomStateBoxed() } + + subtitleView?.setUserDefaultStyle() + subtitleView?.setUserDefaultTextSize() } fun toggleControls() { @@ -213,10 +222,12 @@ class SwipeablePlayerView @JvmOverloads constructor( adjustBrightness(yPercent) true } + e2.x > width - INDICATOR_WIDTH -> { adjustVolume(yPercent) true } + else -> { endScroll() super.onScroll(e1, e2, distanceX, distanceY) diff --git a/app/src/main/res/raw/changelog.md b/app/src/main/res/raw/changelog.md index dd14454d..558098fa 100644 --- a/app/src/main/res/raw/changelog.md +++ b/app/src/main/res/raw/changelog.md @@ -3,6 +3,7 @@ * Schlummerfunktion (danke an Bnyro) * Exo-Player-Update - sollte Playback-Probleme auf einigen Geräten beheben * Möglichkeit, Start-Tab in den Einstellungen zu setzen (danke an Bnyro) +* Videos nutzen Untertitel-Stil aus den Android-Systemeinstellungen # 8.2.0 * Unterstützung für dynamische Gerätefarben From 78dad040f167e35fa105f21364d73b0cde6acce9 Mon Sep 17 00:00:00 2001 From: Christine Coenen Date: Wed, 12 Jul 2023 18:08:43 +0200 Subject: [PATCH 10/18] Update java version to 17 for github actions --- .github/workflows/build.yml | 2 +- gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0ab3b397..43955c8e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,7 +16,7 @@ jobs: uses: actions/setup-java@v2 with: distribution: 'temurin' - java-version: 11 + java-version: 17 cache: 'gradle' - name: Build and test with Gradle diff --git a/gradle.properties b/gradle.properties index 53762a94..5da2985e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. # Default value: -Xmx10248m -XX:MaxPermSize=256m -org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx2048m -XX:+HeapDumpOnOutOfMemoryError -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 From 6f962cd248d3025582bf07562234fabd849f1be1 Mon Sep 17 00:00:00 2001 From: Christine Coenen Date: Wed, 12 Jul 2023 19:35:16 +0200 Subject: [PATCH 11/18] Update very outdated robolectric library --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 519f6c33..e125af52 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,7 +102,7 @@ dependencies { // unit tests testImplementation 'junit:junit:4.13.2' testImplementation "androidx.test:core-ktx:$androix_test_version" - testImplementation 'org.robolectric:robolectric:4.6.1' + testImplementation 'org.robolectric:robolectric:4.10.3' testImplementation 'org.mockito.kotlin:mockito-kotlin:3.2.0' testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4' From 7b3457ea3c511258e05a2e7c29581300c59e1469 Mon Sep 17 00:00:00 2001 From: Christine Coenen Date: Thu, 20 Jul 2023 09:49:49 +0200 Subject: [PATCH 12/18] Release version 8.3.0 --- app/build.gradle | 4 +- app/proguard-rules.pro | 7 ++ app/src/main/res/raw/changelog.md | 2 +- .../metadata/android/de/changelogs/66.txt | 5 ++ .../metadata/android/en-US/changelogs/66.txt | 5 ++ prototype.txt | 73 +++++++++++++++++++ 6 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 fastlane/metadata/android/de/changelogs/66.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/66.txt create mode 100644 prototype.txt diff --git a/app/build.gradle b/app/build.gradle index e125af52..e393a8ce 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "de.christinecoenen.code.zapp" minSdkVersion 26 targetSdkVersion 33 - versionCode 65 - versionName "8.2.0" + versionCode 66 + versionName "8.3.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resourceConfigurations += ['de', 'en'] } diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index bf79eae9..1eaca8ff 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -8,3 +8,10 @@ -dontwarn org.openjsse.javax.net.ssl.SSLParameters -dontwarn org.openjsse.javax.net.ssl.SSLSocket -dontwarn org.openjsse.net.ssl.OpenJSSE + +# https://github.com/square/retrofit/issues/3751#issuecomment-1564410089 +-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation +-keep,allowobfuscation,allowshrinking interface retrofit2.Call +-keep,allowobfuscation,allowshrinking class retrofit2.Response +-if interface * { @retrofit2.http.* public *** *(...); } +-keep,allowoptimization,allowshrinking,allowobfuscation class <3> diff --git a/app/src/main/res/raw/changelog.md b/app/src/main/res/raw/changelog.md index 558098fa..59d9bd62 100644 --- a/app/src/main/res/raw/changelog.md +++ b/app/src/main/res/raw/changelog.md @@ -1,4 +1,4 @@ -# v-next +# 8.3.0 * Einstellungen im Material-Design (danke an Bnyro) * Schlummerfunktion (danke an Bnyro) * Exo-Player-Update - sollte Playback-Probleme auf einigen Geräten beheben diff --git a/fastlane/metadata/android/de/changelogs/66.txt b/fastlane/metadata/android/de/changelogs/66.txt new file mode 100644 index 00000000..ca132fff --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/66.txt @@ -0,0 +1,5 @@ +* Einstellungen im Material-Design (danke an Bnyro) +* Schlummerfunktion (danke an Bnyro) +* Exo-Player-Update - sollte Playback-Probleme auf einigen Geräten beheben +* Möglichkeit, Start-Tab in den Einstellungen zu setzen (danke an Bnyro) +* Videos nutzen Untertitel-Stil aus den Android-Systemeinstellungen \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/66.txt b/fastlane/metadata/android/en-US/changelogs/66.txt new file mode 100644 index 00000000..a62509b2 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/66.txt @@ -0,0 +1,5 @@ +* Settings in material design (thanks to Bnyro) +* Sleep timer (thanks to Bnyro) +* Exo player update - should fix playback problems on some devices +* Possibility to set start tab in settings (thanks to Bnyro) +* Videos use subtitle style from Android system settings \ No newline at end of file diff --git a/prototype.txt b/prototype.txt new file mode 100644 index 00000000..898d46ed --- /dev/null +++ b/prototype.txt @@ -0,0 +1,73 @@ +## Vorname +Christine + +## Nachname +Coenen + +## E-Mail-Adresse +Aus technischen Gründen bitten wir Dich, für jede Einreichung eine separate E-Mail-Adresse anzugeben. +zapp.prototypefund@christine-coenen.de + +## GitHub/BitBucket/etc. Accounts +https://github.com/cemrich +https://gitlab.com/Miracula + +## An welchen Open-Source-Projekten hast Du/habt Ihr bisher gearbeitet? +Max. 3 Projektbeispiele angeben (mit Link) +- https://github.com/chocolatey/ChocolateyGUI +- https://github.com/nextcloud/news-android +- https://gitlab.com/Miracula/fdroidclient + +## Bewerbt Ihr Euch als Team um die Förderung?* +Nein + +## Namen der Teammitglieder +Max. 200 Zeichen + +## Projekttitel* +Max. 70 Zeichen +Zapp + +## Ordne das Projekt einem Bereich zu.* +[x] Civic Tech +[ ] Datensicherheit +[ ] Data Literacy +[ ] Infrastruktur + +## Beschreibe Dein Projekt kurz. +Max. 700 Zeichen + +Zapp ist eine Android-App für den schnellen Zugang zu fast allen deutschen öffentlich-rechtlichen Fernsehsendern. Zapp macht es einfach, schnell zwischen den Live-Streams von ARD, ZDF und anderen Sendern zu wechseln. Außerdem können die Mediatheken aller Sender gesammelt durchsucht und alte Sendungen direkt in der App nach geschaut werden. Zusätzlich zu aktuellen Programm- und Sendungsinformationen bietet Zapp einen Bild-in-Bild-Modus, Audiowiedergabe im Hintergrund und die Unterstützung von Untertiteln. +// Programminfos + +## Welches gesellschaftliche Problem willst Du mit Deinem Projekt lösen?* +Max. 700 Zeichen +Die öffentlich-rechtlichen Sender in Deutschland bieten umfangreiche Inhalte für beinahe alle Zielgruppen und sind unter anderem wichtiger Teil der Demokratiebildung. Leider gehen die Angebote der Sender noch immer oft vom linearen Fernsehen aus, sind senderzentriert und selten an die Lebenswirklichkeit einer jungen und technik-affinen Zielgruppe angepasst. Geschlossene, nicht zeitgemäße APIs (z.B. für Programminformationen) und mehrere unzusammenhängende, nicht öffentlich zugängliche Datensilos verhindern Innovation in Form von freien Programmen und Apps. Zapp möchte diese gebührenfinanzierten Daten in Form von Open-Source-Programmen bündeln und in übersichtlicher Form zugänglich machen. + +## Wie willst Du Dein Projekt technisch umsetzen?* +Max. 1300 Zeichen + +## Welche ähnlichen Lösungen gibt es schon, und was wird Dein Projekt anders bzw. besser machen?* +Max. 400 Zeichen +Zapp konkurriert direkt mit den Mediathek-Apps der öffentlich-rechtlichen Sendern, bündelt aber alle Inhalte übersichtlich und tracking-frei in einer App mit umfangreicheren und an Android angepassten Player-Features. Im Gegensatz zu kommerzielle Apps wie Joyn oder Zatoo fokusiert sich Zapp ausschließlich auf öffentlich finanzierte Inhalte ohne eine zusätzliche Gebühr, Werbung oder Account-Zwang. + +## Wer ist die Zielgruppe und wie soll Dein Tool sie erreichen?* +Max. 700 Zeichen +Zapp richtet sich an vor allem jüngere Android-Nutzer in Deutschland, die öffentlich-rechtliche Inhalte ohne lange Suche und zusätzliche Werbung auf ihrem Smartphone oder Smart-TV schauen möchten. Zapp erreicht seit 2016 im alternativen App-Store F-Droid ein technik-affines und datenschutz-bewusstes Publikum. Seit der Mitgliedschaft im MediathekView-Team 2019 ist eine noch breitere Nutzerschaft auf Zapp aufmerksam geworden. +Leider kann der Großteil der Zielgruppe momentan gar nicht erreicht werden, da Google die Listung von Zapp im Play-Store abgelehnt hat. Lediglich eine fehlerhafte, werbebehaftete Kopie einer chinesischen Firma ist mit zahlreichen Downloads im Play-Store gelistet. + +## Hast Du schon an der Idee gearbeitet? Wenn ja, beschreibe kurz den aktuellen Stand und erkläre die Neuerung.* +Max. 700 Zeichen + +## Link zum bestehenden Projekt (falls vorhanden) +https://github.com/mediathekview/zapp + +## Wie viele Stunden willst Du (bzw. will das Team) insgesamt in den 6 Monaten Förderzeitraum an der Umsetzung arbeiten?* +Bitte eine Zahl eintragen. + +## Skizziere kurz die wichtigsten Meilensteine, die Du (bzw. das Team) im Förderzeitraum umsetzen willst.* +Max. 700 Zeichen + +## Wenn meine Projektidee nicht gefördert wird, darf sie trotzdem auf prototypefund.de und in wissenschaftlichen Publikationen rund um das Programm veröffentlicht werden?* +[x] Ja +[ ] Nein \ No newline at end of file From 7b633dd6cfdf66f047f1472a6a01338b15caa83d Mon Sep 17 00:00:00 2001 From: Christine Coenen Date: Fri, 21 Jul 2023 18:24:20 +0200 Subject: [PATCH 13/18] Fix crash caused by code shrinker when channel order has been changed --- app/proguard-rules.pro | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 1eaca8ff..bd1010dc 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -9,6 +9,10 @@ -dontwarn org.openjsse.javax.net.ssl.SSLSocket -dontwarn org.openjsse.net.ssl.OpenJSSE +# https://r8.googlesource.com/r8/+/refs/heads/main/compatibility-faq.md#troubleshooting-gson-gson +-keep class com.google.gson.reflect.TypeToken { *; } +-keep class * extends com.google.gson.reflect.TypeToken + # https://github.com/square/retrofit/issues/3751#issuecomment-1564410089 -keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation -keep,allowobfuscation,allowshrinking interface retrofit2.Call From 7397c9426b9225cfd38dae93add75157d2e2dd66 Mon Sep 17 00:00:00 2001 From: Christine Coenen Date: Fri, 21 Jul 2023 18:29:21 +0200 Subject: [PATCH 14/18] Release version 8.3.1 --- app/build.gradle | 4 ++-- app/src/main/res/raw/changelog.md | 3 +++ fastlane/metadata/android/de/changelogs/67.txt | 1 + fastlane/metadata/android/en-US/changelogs/67.txt | 1 + 4 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 fastlane/metadata/android/de/changelogs/67.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/67.txt diff --git a/app/build.gradle b/app/build.gradle index e393a8ce..c4f2e253 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "de.christinecoenen.code.zapp" minSdkVersion 26 targetSdkVersion 33 - versionCode 66 - versionName "8.3.0" + versionCode 67 + versionName "8.3.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resourceConfigurations += ['de', 'en'] } diff --git a/app/src/main/res/raw/changelog.md b/app/src/main/res/raw/changelog.md index 59d9bd62..11cb7237 100644 --- a/app/src/main/res/raw/changelog.md +++ b/app/src/main/res/raw/changelog.md @@ -1,3 +1,6 @@ +# 8.3.1 +* Absturz bei geänderter Sender-Anordnung gefixt + # 8.3.0 * Einstellungen im Material-Design (danke an Bnyro) * Schlummerfunktion (danke an Bnyro) diff --git a/fastlane/metadata/android/de/changelogs/67.txt b/fastlane/metadata/android/de/changelogs/67.txt new file mode 100644 index 00000000..6ad63e1c --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/67.txt @@ -0,0 +1 @@ +* Absturz bei geänderter Sender-Anordnung gefixt \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/67.txt b/fastlane/metadata/android/en-US/changelogs/67.txt new file mode 100644 index 00000000..f8c120fc --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/67.txt @@ -0,0 +1 @@ +* Fixed crash caused by changed channel order \ No newline at end of file From beb52286871e1ce29551c13de39245f61537ad9b Mon Sep 17 00:00:00 2001 From: Christine Coenen Date: Fri, 21 Jul 2023 20:41:46 +0200 Subject: [PATCH 15/18] Target sdk 34 --- app/build.gradle | 6 +++--- app/src/main/AndroidManifest.xml | 1 + .../code/zapp/utils/video/SwipeablePlayerView.kt | 8 +++++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c4f2e253..e7e3fca9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,13 +6,13 @@ apply plugin: 'koin' apply plugin: 'androidx.navigation.safeargs.kotlin' android { - compileSdkVersion 33 - buildToolsVersion '33.0.2' + compileSdkVersion 34 + buildToolsVersion '34.0.0' defaultConfig { applicationId "de.christinecoenen.code.zapp" minSdkVersion 26 - targetSdkVersion 33 + targetSdkVersion 34 versionCode 67 versionName "8.3.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3da1499c..301d1207 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ + Date: Fri, 21 Jul 2023 21:16:20 +0200 Subject: [PATCH 16/18] Set foreground service type for download worker service --- app/src/main/AndroidManifest.xml | 6 +++++ .../controller/downloads/DownloadWorker.kt | 23 +++++++++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 301d1207..21281e75 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ + + + diff --git a/app/src/main/java/de/christinecoenen/code/zapp/app/mediathek/controller/downloads/DownloadWorker.kt b/app/src/main/java/de/christinecoenen/code/zapp/app/mediathek/controller/downloads/DownloadWorker.kt index 9d87b6aa..a24f7edf 100644 --- a/app/src/main/java/de/christinecoenen/code/zapp/app/mediathek/controller/downloads/DownloadWorker.kt +++ b/app/src/main/java/de/christinecoenen/code/zapp/app/mediathek/controller/downloads/DownloadWorker.kt @@ -3,6 +3,8 @@ package de.christinecoenen.code.zapp.app.mediathek.controller.downloads import android.annotation.SuppressLint import android.app.PendingIntent import android.content.Context +import android.content.pm.ServiceInfo +import android.os.Build import androidx.core.app.NotificationManagerCompat import androidx.work.* import de.christinecoenen.code.zapp.app.mediathek.controller.downloads.notifications.DownloadCompletedEventNotification @@ -237,10 +239,18 @@ class DownloadWorker(appContext: Context, workerParams: WorkerParameters) : } override suspend fun getForegroundInfo() = - ForegroundInfo( - id.hashCode(), - downloadProgressNotification.build(progress, downloadedBytes, totalBytes) - ) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + ForegroundInfo( + id.hashCode(), + downloadProgressNotification.build(progress, downloadedBytes, totalBytes), + ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC + ) + } else { + ForegroundInfo( + id.hashCode(), + downloadProgressNotification.build(progress, downloadedBytes, totalBytes) + ) + } private suspend fun reportProgress() { val update = workDataOf(ProgressKey to progress) @@ -256,16 +266,21 @@ class DownloadWorker(appContext: Context, workerParams: WorkerParameters) : HttpURLConnection.HTTP_NOT_FOUND, HttpURLConnection.HTTP_GONE -> ErrorType.FileNotFound + HttpURLConnection.HTTP_UNAUTHORIZED, HttpURLConnection.HTTP_FORBIDDEN, 451 -> ErrorType.FileForbidden + 429 -> ErrorType.TooManyRequests + in 400..499 -> ErrorType.ClientError + in 500..600 -> ErrorType.ServerError + else -> ErrorType.Unknown } From fc1c160cebeb954007104bd488f1116e9b410e34 Mon Sep 17 00:00:00 2001 From: Christine Coenen Date: Fri, 21 Jul 2023 21:18:46 +0200 Subject: [PATCH 17/18] Update gradle to 8.0.2 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 40e7d0d4..b2a5d278 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:8.0.1' + classpath 'com.android.tools.build:gradle:8.0.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0" From dddd3750f60e7dcdfb51c9fa586a7096eb7013ff Mon Sep 17 00:00:00 2001 From: Christine Coenen Date: Fri, 21 Jul 2023 21:45:14 +0200 Subject: [PATCH 18/18] Update dependencies --- app/build.gradle | 18 +++++++++--------- build.gradle | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e7e3fca9..8fb00198 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -77,7 +77,7 @@ android { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') - def fragment_version = '1.5.7' + def fragment_version = '1.6.0' // kotlin implementation 'androidx.core:core-ktx:1.10.1' @@ -103,12 +103,12 @@ dependencies { testImplementation 'junit:junit:4.13.2' testImplementation "androidx.test:core-ktx:$androix_test_version" testImplementation 'org.robolectric:robolectric:4.10.3' - testImplementation 'org.mockito.kotlin:mockito-kotlin:3.2.0' - testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4' + testImplementation 'org.mockito.kotlin:mockito-kotlin:5.0.0' + testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.2' // support implementation "androidx.fragment:fragment-ktx:$fragment_version" - implementation 'androidx.activity:activity-ktx:1.7.1' + implementation 'androidx.activity:activity-ktx:1.7.2' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.9.0' implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" @@ -126,7 +126,7 @@ dependencies { implementation "androidx.navigation:navigation-ui-ktx:$nav_version" // room database - def room_version = "2.5.1" + def room_version = "2.5.2" implementation "androidx.room:room-runtime:$room_version" implementation "androidx.room:room-paging:$room_version" kapt "androidx.room:room-compiler:$room_version" @@ -136,7 +136,7 @@ dependencies { implementation 'com.google.code.gson:gson:2.10.1' // sortable list - implementation 'com.github.woxthebox:draglistview:1.7.2' + implementation 'com.github.woxthebox:draglistview:1.7.3' // markdown implementation 'io.noties.markwon:core:4.6.2' @@ -146,7 +146,7 @@ dependencies { implementation "androidx.work:work-runtime-ktx:$work_version" // exo player - def exoplayer_version = "2.18.6" + def exoplayer_version = "2.19.0" implementation "com.google.android.exoplayer:exoplayer-core:$exoplayer_version" implementation "com.google.android.exoplayer:exoplayer-hls:$exoplayer_version" implementation "com.google.android.exoplayer:exoplayer-ui:$exoplayer_version" @@ -159,7 +159,7 @@ dependencies { implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // ACRA crash reporting - def acra_version = "5.9.7" + def acra_version = "5.11.0" implementation "ch.acra:acra-mail:$acra_version" implementation "ch.acra:acra-dialog:$acra_version" @@ -170,7 +170,7 @@ dependencies { implementation 'com.jakewharton:process-phoenix:2.1.2' // joda time - implementation 'joda-time:joda-time:2.12.2' + implementation 'joda-time:joda-time:2.12.5' // about libraries view implementation "com.mikepenz:aboutlibraries:$about_libraries_version" diff --git a/build.gradle b/build.gradle index b2a5d278..e6bf2c84 100644 --- a/build.gradle +++ b/build.gradle @@ -1,9 +1,9 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.koin_version = '3.3.3' - ext.about_libraries_version = '10.6.1' - ext.nav_version = '2.5.3' + ext.koin_version = '3.4.1' + ext.about_libraries_version = '10.8.3' + ext.nav_version = '2.6.0' repositories { google()