diff --git a/app/build.gradle b/app/build.gradle index f45ae4f..622cd48 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { minSdkVersion 23 targetSdkVersion 30 versionCode 1000 //00.01.000 - versionName "0.2.0-beta1" + versionName "0.2.0-beta2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "build_time", buildTime() diff --git a/app/src/main/java/org/mosad/teapod/MainActivity.kt b/app/src/main/java/org/mosad/teapod/MainActivity.kt index b4dd703..c464ae5 100644 --- a/app/src/main/java/org/mosad/teapod/MainActivity.kt +++ b/app/src/main/java/org/mosad/teapod/MainActivity.kt @@ -38,6 +38,7 @@ import org.mosad.teapod.preferences.EncryptedPreferences import org.mosad.teapod.preferences.Preferences import org.mosad.teapod.ui.components.LoginDialog import org.mosad.teapod.ui.fragments.* +import org.mosad.teapod.util.DataTypes import org.mosad.teapod.util.StorageController import org.mosad.teapod.util.TMDBApiController import kotlin.system.measureTimeMillis @@ -46,13 +47,22 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS private var activeBaseFragment: Fragment = HomeFragment() // the currently active fragment, home at the start + companion object { + var wasInitialized = false + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + + if (!wasInitialized) { + load() + } + + theme.applyStyle(getThemeResource(), true) + setContentView(R.layout.activity_main) nav_view.setOnNavigationItemSelectedListener(this) - load() - supportFragmentManager.commit { replace(R.id.nav_host_fragment, activeBaseFragment, activeBaseFragment.javaClass.simpleName) } @@ -102,6 +112,13 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS return ret } + private fun getThemeResource(): Int { + return when (Preferences.theme) { + DataTypes.Theme.DARK -> R.style.AppTheme_Dark + else -> R.style.AppTheme_Light + } + } + private fun load() { // running login and list in parallel does not bring any speed improvements val time = measureTimeMillis { @@ -118,10 +135,26 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS StorageController.load(this) AoDParser.initialLoading() + + wasInitialized = true } Log.i(javaClass.name, "login and list in $time ms") } + private fun showLoginDialog(firstTry: Boolean) { + LoginDialog(this, firstTry).positiveButton { + EncryptedPreferences.saveCredentials(login, password, context) + + if (!AoDParser.login()) { + showLoginDialog(false) + Log.w(javaClass.name, "Login failed, please try again.") + } + }.negativeButton { + Log.i(javaClass.name, "Login canceled, exiting.") + finish() + }.show() + } + /** * Show the media fragment for the selected media. * While loading show the loading fragment. @@ -159,17 +192,15 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS startActivity(intent) } - private fun showLoginDialog(firstTry: Boolean) { - LoginDialog(this, firstTry).positiveButton { - EncryptedPreferences.saveCredentials(login, password, context) - - if (!AoDParser.login()) { - showLoginDialog(false) - Log.w(javaClass.name, "Login failed, please try again.") - } - }.negativeButton { - Log.i(javaClass.name, "Login canceled, exiting.") - finish() - }.show() + /** + * use custom restart instead of recreate(), since it has animations + */ + fun restart() { + val restartIntent = intent + restartIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION) + finish() + startActivity(restartIntent) } + + } \ No newline at end of file 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 727cf99..172fb92 100644 --- a/app/src/main/java/org/mosad/teapod/preferences/Preferences.kt +++ b/app/src/main/java/org/mosad/teapod/preferences/Preferences.kt @@ -1,7 +1,9 @@ package org.mosad.teapod.preferences import android.content.Context +import android.content.SharedPreferences import org.mosad.teapod.R +import org.mosad.teapod.util.DataTypes object Preferences { @@ -9,14 +11,18 @@ object Preferences { internal set var autoplay = true internal set + var theme = DataTypes.Theme.LIGHT + internal set - fun savePreferSecondary(context: Context, preferSecondary: Boolean) { - val sharedPref = context.getSharedPreferences( + private fun getSharedPref(context: Context): SharedPreferences { + return context.getSharedPreferences( context.getString(R.string.preference_file_key), Context.MODE_PRIVATE ) + } - with(sharedPref.edit()) { + fun savePreferSecondary(context: Context, preferSecondary: Boolean) { + with(getSharedPref(context).edit()) { putBoolean(context.getString(R.string.save_key_prefer_secondary), preferSecondary) apply() } @@ -25,12 +31,7 @@ object Preferences { } fun saveAutoplay(context: Context, autoplay: Boolean) { - val sharedPref = context.getSharedPreferences( - context.getString(R.string.preference_file_key), - Context.MODE_PRIVATE - ) - - with(sharedPref.edit()) { + with(getSharedPref(context).edit()) { putBoolean(context.getString(R.string.save_key_autoplay), autoplay) apply() } @@ -38,14 +39,20 @@ object Preferences { this.autoplay = autoplay } + fun saveTheme(context: Context, theme: DataTypes.Theme) { + with(getSharedPref(context).edit()) { + putString(context.getString(R.string.save_key_theme), theme.toString()) + apply() + } + + this.theme = theme + } + /** * initially load the stored values */ fun load(context: Context) { - val sharedPref = context.getSharedPreferences( - context.getString(R.string.preference_file_key), - Context.MODE_PRIVATE - ) + val sharedPref = getSharedPref(context) preferSecondary = sharedPref.getBoolean( context.getString(R.string.save_key_prefer_secondary), false @@ -53,6 +60,11 @@ object Preferences { autoplay = sharedPref.getBoolean( context.getString(R.string.save_key_autoplay), true ) + theme = DataTypes.Theme.valueOf( + sharedPref.getString( + context.getString(R.string.save_key_theme), DataTypes.Theme.LIGHT.toString() + ) ?: DataTypes.Theme.LIGHT.toString() + ) } 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 54450fe..986dc48 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 @@ -7,17 +7,21 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import com.afollestad.materialdialogs.MaterialDialog +import com.afollestad.materialdialogs.list.listItemsSingleChoice import de.psdev.licensesdialog.LicensesDialog import kotlinx.android.synthetic.main.fragment_account.* import org.mosad.teapod.BuildConfig +import org.mosad.teapod.MainActivity import org.mosad.teapod.R import org.mosad.teapod.parser.AoDParser import org.mosad.teapod.preferences.EncryptedPreferences import org.mosad.teapod.preferences.Preferences import org.mosad.teapod.ui.components.LoginDialog +import org.mosad.teapod.util.DataTypes.Theme class AccountFragment : Fragment() { + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_account, container, false) } @@ -27,6 +31,11 @@ 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)) + text_theme_selected.text = when (Preferences.theme) { + Theme.DARK -> getString(R.string.theme_dark) + else -> getString(R.string.theme_light) + } + switch_secondary.isChecked = Preferences.preferSecondary switch_autoplay.isChecked = Preferences.autoplay @@ -38,6 +47,10 @@ class AccountFragment : Fragment() { showLoginDialog(true) } + linear_theme.setOnClickListener { + showThemeDialog() + } + linear_about.setOnClickListener { MaterialDialog(requireContext()) .title(R.string.info_about) @@ -46,15 +59,14 @@ class AccountFragment : Fragment() { } text_licenses.setOnClickListener { - val selectedTheme = requireContext().applicationInfo.theme - val dialogCss = when (selectedTheme) { - R.style.AppTheme_Dark -> R.string.license_dialog_style_dark + val dialogCss = when (Preferences.theme) { + Theme.DARK -> R.string.license_dialog_style_dark else -> R.string.license_dialog_style_light } - val themeId = when (selectedTheme) { - R.style.AppTheme_Dark -> R.style.LicensesDialogTheme_Dark + val themeId = when (Preferences.theme) { + Theme.DARK -> R.style.LicensesDialogTheme_Dark else -> R.style.AppTheme_Light } @@ -90,4 +102,24 @@ class AccountFragment : Fragment() { password = "" } } + + private fun showThemeDialog() { + val themes = listOf( + resources.getString(R.string.theme_light), + resources.getString(R.string.theme_dark) + ) + + MaterialDialog(requireContext()).show { + title(R.string.theme) + listItemsSingleChoice(items = themes, initialSelection = Preferences.theme.ordinal) { _, index, _ -> + when(index) { + 0 -> Preferences.saveTheme(context, Theme.LIGHT) + 1 -> Preferences.saveTheme(context, Theme.DARK) + else -> Preferences.saveTheme(context, Theme.LIGHT) + } + + (activity as MainActivity).restart() + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/org/mosad/teapod/util/DataTypes.kt b/app/src/main/java/org/mosad/teapod/util/DataTypes.kt index c109561..aae4fb8 100644 --- a/app/src/main/java/org/mosad/teapod/util/DataTypes.kt +++ b/app/src/main/java/org/mosad/teapod/util/DataTypes.kt @@ -6,6 +6,11 @@ class DataTypes { MOVIE, TVSHOW } + + enum class Theme(val str: String) { + LIGHT("Light"), + DARK("Dark") + } } /** diff --git a/app/src/main/res/drawable/ic_baseline_style_24.xml b/app/src/main/res/drawable/ic_baseline_style_24.xml new file mode 100644 index 0000000..18adef3 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_style_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/fragment_account.xml b/app/src/main/res/layout/fragment_account.xml index c6c9c80..08042dc 100644 --- a/app/src/main/res/layout/fragment_account.xml +++ b/app/src/main/res/layout/fragment_account.xml @@ -222,6 +222,50 @@ + + + + + + + + + + + + + Untertitle-Stream verwenden, sofern vorhanden Autoplay Nächste Episode automatisch abspielen + Design + Hell + Dunkel Player schließen diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 571b8c2..4a47abd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -40,6 +40,10 @@ Use the subtitles stream if present Autoplay Play next episode automatically + Theme + Light + Dark + close player @@ -69,6 +73,7 @@ org.mosad.teapod.user_password org.mosad.teapod.prefer_secondary org.mosad.teapod.autoplay + org.mosad.teapod.theme intent_media_id diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index df294ab..2114893 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -18,7 +18,6 @@ @color/iconNoActionLight @color/buttonBackgroundLight @color/themeSecondaryLight - @color/textPrimaryLight @color/textSecondaryLight @@ -34,8 +33,10 @@ @color/iconNoActionDark @color/buttonBackgroundDark @color/themeSecondaryDark - @color/textPrimaryDark @color/textSecondaryDark + + + @color/textSecondaryDark