From d4fa726f9c076ef20ce5bd38a1d0f7a5fb9b9a5d Mon Sep 17 00:00:00 2001 From: Jannik Date: Sun, 15 Nov 2020 13:39:33 +0100 Subject: [PATCH] improve autoplay next episode * add animations to show/hide next episode button * add option to disable/enable autoplay --- .../java/org/mosad/teapod/PlayerActivity.kt | 47 +++++++++++-- .../mosad/teapod/preferences/Preferences.kt | 19 +++++ .../teapod/ui/fragments/AccountFragment.kt | 5 ++ .../teapod/ui/fragments/LibraryFragment.kt | 7 +- .../drawable/ic_baseline_arrow_back_24.xml | 13 ++-- .../res/drawable/ic_baseline_autorenew_24.xml | 10 +++ app/src/main/res/layout/fragment_account.xml | 69 +++++++++++++++++-- app/src/main/res/values-de-rDE/strings.xml | 2 + app/src/main/res/values/strings.xml | 3 + 9 files changed, 161 insertions(+), 14 deletions(-) create mode 100644 app/src/main/res/drawable/ic_baseline_autorenew_24.xml diff --git a/app/src/main/java/org/mosad/teapod/PlayerActivity.kt b/app/src/main/java/org/mosad/teapod/PlayerActivity.kt index 5dffb84..1f17bdb 100644 --- a/app/src/main/java/org/mosad/teapod/PlayerActivity.kt +++ b/app/src/main/java/org/mosad/teapod/PlayerActivity.kt @@ -1,5 +1,7 @@ package org.mosad.teapod +import android.animation.Animator +import android.animation.AnimatorListenerAdapter import android.annotation.SuppressLint import android.net.Uri import android.os.Build @@ -28,6 +30,7 @@ import org.mosad.teapod.util.Episode import org.mosad.teapod.util.Media import java.util.concurrent.TimeUnit + class PlayerActivity : AppCompatActivity() { private lateinit var player: SimpleExoPlayer @@ -157,7 +160,7 @@ class PlayerActivity : AppCompatActivity() { else -> View.VISIBLE } - if (state == ExoPlayer.STATE_ENDED && nextEpisode != null) { + if (state == ExoPlayer.STATE_ENDED && nextEpisode != null && Preferences.autoplay) { playNextEpisode() } @@ -219,8 +222,14 @@ class PlayerActivity : AppCompatActivity() { if (remainingTime in 0..20000) { withContext(Dispatchers.Main) { // if the next ep button is not visible, make it visible - if (!button_next_ep.isVisible && nextEpisode != null) { - button_next_ep.visibility = View.VISIBLE // TODO animation + if (!button_next_ep.isVisible && nextEpisode != null && Preferences.autoplay) { + showButtonNextEp() + } + } + } else { + withContext(Dispatchers.Main) { + if (button_next_ep.isVisible) { + hideButtonNextEp() } } } @@ -253,7 +262,7 @@ class PlayerActivity : AppCompatActivity() { // update the gui exo_text_title.text = nextEp.title - button_next_ep.visibility = View.GONE // TODO animation + hideButtonNextEp() player.clearMediaItems() //remove previous item val mediaSource = HlsMediaSource.Factory(dataSourceFactory) @@ -316,6 +325,36 @@ class PlayerActivity : AppCompatActivity() { } } + /** + * show the next episode button + * TODO improve the show animation + */ + private fun showButtonNextEp() { + button_next_ep.visibility = View.VISIBLE + button_next_ep.alpha = 0.0f + + button_next_ep.animate() + .alpha(1.0f) + .setListener(null) + } + + /** + * hide the next episode button + * TODO improve the hide animation + */ + private fun hideButtonNextEp() { + button_next_ep.animate() + .alpha(0.0f) + .setListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator?) { + super.onAnimationEnd(animation) + button_next_ep.visibility = View.GONE + } + }) + + } + + inner class PlayerGestureListener : GestureDetector.SimpleOnGestureListener() { /** diff --git a/app/src/main/java/org/mosad/teapod/preferences/Preferences.kt b/app/src/main/java/org/mosad/teapod/preferences/Preferences.kt index d05a3bf..727cf99 100644 --- a/app/src/main/java/org/mosad/teapod/preferences/Preferences.kt +++ b/app/src/main/java/org/mosad/teapod/preferences/Preferences.kt @@ -7,6 +7,8 @@ object Preferences { var preferSecondary = false internal set + var autoplay = true + internal set fun savePreferSecondary(context: Context, preferSecondary: Boolean) { val sharedPref = context.getSharedPreferences( @@ -22,6 +24,20 @@ object Preferences { this.preferSecondary = preferSecondary } + fun saveAutoplay(context: Context, autoplay: Boolean) { + val sharedPref = context.getSharedPreferences( + context.getString(R.string.preference_file_key), + Context.MODE_PRIVATE + ) + + with(sharedPref.edit()) { + putBoolean(context.getString(R.string.save_key_autoplay), autoplay) + apply() + } + + this.autoplay = autoplay + } + /** * initially load the stored values */ @@ -34,6 +50,9 @@ object Preferences { preferSecondary = sharedPref.getBoolean( context.getString(R.string.save_key_prefer_secondary), false ) + autoplay = sharedPref.getBoolean( + context.getString(R.string.save_key_autoplay), true + ) } diff --git a/app/src/main/java/org/mosad/teapod/ui/fragments/AccountFragment.kt b/app/src/main/java/org/mosad/teapod/ui/fragments/AccountFragment.kt index d5d87e1..b0cbc61 100644 --- a/app/src/main/java/org/mosad/teapod/ui/fragments/AccountFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/fragments/AccountFragment.kt @@ -28,6 +28,7 @@ class AccountFragment : Fragment() { text_account_login.text = EncryptedPreferences.login text_info_about_desc.text = getString(R.string.info_about_desc, BuildConfig.VERSION_NAME, getString(R.string.build_time)) switch_secondary.isChecked = Preferences.preferSecondary + switch_autoplay.isChecked = Preferences.autoplay initActions() } @@ -57,6 +58,10 @@ class AccountFragment : Fragment() { switch_secondary.setOnClickListener { Preferences.savePreferSecondary(requireContext(), switch_secondary.isChecked) } + + switch_autoplay.setOnClickListener { + Preferences.saveAutoplay(requireContext(), switch_autoplay.isChecked) + } } private fun showLoginDialog(firstTry: Boolean) { diff --git a/app/src/main/java/org/mosad/teapod/ui/fragments/LibraryFragment.kt b/app/src/main/java/org/mosad/teapod/ui/fragments/LibraryFragment.kt index 76a4438..be217c2 100644 --- a/app/src/main/java/org/mosad/teapod/ui/fragments/LibraryFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/fragments/LibraryFragment.kt @@ -6,12 +6,15 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import kotlinx.android.synthetic.main.fragment_library.* -import kotlinx.coroutines.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.mosad.teapod.MainActivity import org.mosad.teapod.R import org.mosad.teapod.parser.AoDParser -import org.mosad.teapod.util.decoration.MediaItemDecoration import org.mosad.teapod.util.adapter.MediaItemAdapter +import org.mosad.teapod.util.decoration.MediaItemDecoration class LibraryFragment : Fragment() { diff --git a/app/src/main/res/drawable/ic_baseline_arrow_back_24.xml b/app/src/main/res/drawable/ic_baseline_arrow_back_24.xml index fa122e1..5d09b98 100644 --- a/app/src/main/res/drawable/ic_baseline_arrow_back_24.xml +++ b/app/src/main/res/drawable/ic_baseline_arrow_back_24.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable/ic_baseline_autorenew_24.xml b/app/src/main/res/drawable/ic_baseline_autorenew_24.xml new file mode 100644 index 0000000..464493c --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_autorenew_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/fragment_account.xml b/app/src/main/res/layout/fragment_account.xml index e72fa30..c9b3dcd 100644 --- a/app/src/main/res/layout/fragment_account.xml +++ b/app/src/main/res/layout/fragment_account.xml @@ -50,7 +50,7 @@ android:contentDescription="@string/account" android:minWidth="48dp" android:minHeight="48dp" - android:padding="5dp" + android:padding="9dp" android:scaleType="fitXY" android:src="@drawable/ic_baseline_account_box_24" app:srcCompat="@drawable/ic_baseline_account_box_24" /> @@ -112,10 +112,10 @@ android:id="@+id/imageView3" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:contentDescription="@string/account" + android:contentDescription="@string/settings_secondary" android:minWidth="48dp" android:minHeight="48dp" - android:padding="5dp" + android:padding="9dp" android:scaleType="fitXY" android:src="@drawable/ic_baseline_subtitles_24" /> @@ -164,6 +164,67 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index c28e8e6..29221e4 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -29,6 +29,8 @@ Einstellungen Bevorzuge alternativen Stream Untertitle-Stream verwenden, sofern vorhanden + Autoplay + Nächste Episode automatisch abspielen Player schließen diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2ccc748..5c5aef0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -38,6 +38,8 @@ Settings Prefer secondary (sub) stream Use the subtitles stream if present + Autoplay + Play next episode automatically close player @@ -64,6 +66,7 @@ org.mosad.teapod.user_login org.mosad.teapod.user_password org.mosad.teapod.prefer_secondary + org.mosad.teapod.autoplay intent_media_id