diff --git a/app/src/main/java/org/mosad/teapod/MainActivity.kt b/app/src/main/java/org/mosad/teapod/MainActivity.kt
index 94a7943..7f69f8a 100644
--- a/app/src/main/java/org/mosad/teapod/MainActivity.kt
+++ b/app/src/main/java/org/mosad/teapod/MainActivity.kt
@@ -42,29 +42,32 @@ import org.mosad.teapod.ui.fragments.HomeFragment
import org.mosad.teapod.ui.fragments.LibraryFragment
import org.mosad.teapod.ui.fragments.SearchFragment
import org.mosad.teapod.ui.fragments.LoadingFragment
-import org.mosad.teapod.util.CacheHelper
+import org.mosad.teapod.util.StorageController
import org.mosad.teapod.util.Media
import org.mosad.teapod.util.TMDBApiController
import kotlin.system.measureTimeMillis
class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener {
- private var activeFragment: Fragment = HomeFragment() // the currently active fragment, home at the start
+ private var activeBaseFragment: Fragment = HomeFragment() // the currently active fragment, home at the start
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
- val navView: BottomNavigationView = findViewById(R.id.nav_view)
- navView.setOnNavigationItemSelectedListener(this)
+ nav_view.setOnNavigationItemSelectedListener(this)
load()
+
+ supportFragmentManager.commit {
+ replace(R.id.nav_host_fragment, activeBaseFragment, activeBaseFragment.javaClass.simpleName)
+ }
}
override fun onBackPressed() {
if (supportFragmentManager.backStackEntryCount > 0) {
supportFragmentManager.popBackStack()
} else {
- if (activeFragment !is HomeFragment) {
+ if (activeBaseFragment !is HomeFragment) {
nav_view.selectedItemId = R.id.navigation_home
} else {
super.onBackPressed()
@@ -79,52 +82,56 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS
val ret = when (item.itemId) {
R.id.navigation_home -> {
- activeFragment = HomeFragment()
+ activeBaseFragment = HomeFragment()
true
}
R.id.navigation_library -> {
- activeFragment = LibraryFragment()
+ activeBaseFragment = LibraryFragment()
true
}
R.id.navigation_search -> {
- activeFragment = SearchFragment()
+ activeBaseFragment = SearchFragment()
true
}
R.id.navigation_account -> {
- activeFragment = AccountFragment()
+ activeBaseFragment = AccountFragment()
true
}
else -> false
}
supportFragmentManager.commit {
- replace(R.id.nav_host_fragment, activeFragment)
+ replace(R.id.nav_host_fragment, activeBaseFragment, activeBaseFragment.javaClass.simpleName)
}
return ret
}
private fun load() {
- EncryptedPreferences.readCredentials(this)
-
// make sure credentials are set
- if (EncryptedPreferences.password.isEmpty()) {
- showLoginDialog(true)
- }
+ EncryptedPreferences.readCredentials(this)
+ if (EncryptedPreferences.password.isEmpty()) showLoginDialog(true)
- CacheHelper.load(this)
+ StorageController.load(this)
- // TODO save last loginSuccess, if false show login dialog even if credentials are present
// running login and list in parallel does not bring any speed improvements
val time = measureTimeMillis {
+ // try to login in, as most sites can only bee loaded once loged in
+ if (!AoDParser().login()) showLoginDialog(false)
+
+ // initially load all media
AoDParser().listAnimes()
+
+ // TODO load home screen, can be parallel to listAnimes
}
Log.i(javaClass.name, "login and list in $time ms")
}
/**
- * show the media fragment for the selected media
- * while loading show the loading fragment
+ * Show the media fragment for the selected media.
+ * While loading show the loading fragment.
+ * The loading and media fragment are not stored in activeBaseFragment,
+ * as the don't replace a fragment but are added on top of one.
*/
fun showMediaFragment(media: Media) = GlobalScope.launch {
val loadingFragment = LoadingFragment()
diff --git a/app/src/main/java/org/mosad/teapod/ui/fragments/HomeFragment.kt b/app/src/main/java/org/mosad/teapod/ui/fragments/HomeFragment.kt
index b1b80dc..fe2050a 100644
--- a/app/src/main/java/org/mosad/teapod/ui/fragments/HomeFragment.kt
+++ b/app/src/main/java/org/mosad/teapod/ui/fragments/HomeFragment.kt
@@ -14,7 +14,7 @@ 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.CacheHelper
+import org.mosad.teapod.util.StorageController
import org.mosad.teapod.util.adapter.MediaItemAdapter
import org.mosad.teapod.util.decoration.MediaItemDecoration
@@ -35,23 +35,32 @@ class HomeFragment : Fragment() {
AoDParser().listAnimes()
}
- val myListMedia = AoDParser.mediaList.filter { CacheHelper.myList.contains(it.link) }
-
withContext(Dispatchers.Main) {
context?.let {
layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
- adapter = MediaItemAdapter(myListMedia)
- adapter.onItemClick = { media, _ ->
- (activity as MainActivity).showMediaFragment(media)
- }
-
recycler_my_list.layoutManager = layoutManager
- recycler_my_list.adapter = adapter
recycler_my_list.addItemDecoration(MediaItemDecoration(9))
+
+ updateMyListMedia()
}
}
}
+ }
+ // TODO recreating the adapter on list change is not a good solution
+ fun updateMyListMedia() {
+ val myListMedia = StorageController.myList.map { listElement ->
+ AoDParser.mediaList.first {
+ listElement == it.link
+ }
+ }
+
+ adapter = MediaItemAdapter(myListMedia)
+ adapter.onItemClick = { media, _ ->
+ (activity as MainActivity).showMediaFragment(media)
+ }
+
+ recycler_my_list.adapter = adapter
}
}
\ No newline at end of file
diff --git a/app/src/main/java/org/mosad/teapod/ui/fragments/MediaFragment.kt b/app/src/main/java/org/mosad/teapod/ui/fragments/MediaFragment.kt
index ec88020..8cd66b4 100644
--- a/app/src/main/java/org/mosad/teapod/ui/fragments/MediaFragment.kt
+++ b/app/src/main/java/org/mosad/teapod/ui/fragments/MediaFragment.kt
@@ -17,7 +17,7 @@ import kotlinx.android.synthetic.main.fragment_media.*
import org.mosad.teapod.MainActivity
import org.mosad.teapod.R
import org.mosad.teapod.parser.AoDParser
-import org.mosad.teapod.util.CacheHelper
+import org.mosad.teapod.util.StorageController
import org.mosad.teapod.util.DataTypes.MediaType
import org.mosad.teapod.util.adapter.EpisodeItemAdapter
import org.mosad.teapod.util.Media
@@ -60,7 +60,7 @@ class MediaFragment(private val media: Media, private val tmdb: TMDBResponse) :
text_year.text = media.info.year.toString()
text_age.text = media.info.age.toString()
text_overview.text = media.info.shortDesc
- check_my_list.isChecked = CacheHelper.myList.contains(media.link)
+ check_my_list.isChecked = StorageController.myList.contains(media.link)
// specific gui
if (media.type == MediaType.TVSHOW) {
@@ -91,14 +91,18 @@ class MediaFragment(private val media: Media, private val tmdb: TMDBResponse) :
}
// add or remove media from myList
- check_my_list.setOnCheckedChangeListener { buttonView, isChecked ->
+ check_my_list.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
- CacheHelper.myList.add(media.link)
+ StorageController.myList.add(media.link)
} else {
- CacheHelper.myList.remove(media.link)
+ StorageController.myList.remove(media.link)
}
- CacheHelper.saveMyList(requireContext())
+ StorageController.saveMyList(requireContext())
+
// TODO notify home fragment on change
+ parentFragmentManager.findFragmentByTag("HomeFragment")?.let {
+ (it as HomeFragment).updateMyListMedia()
+ }
}
// set onItemClick only in adapter is initialized
diff --git a/app/src/main/java/org/mosad/teapod/util/CacheHelper.kt b/app/src/main/java/org/mosad/teapod/util/StorageController.kt
similarity index 72%
rename from app/src/main/java/org/mosad/teapod/util/CacheHelper.kt
rename to app/src/main/java/org/mosad/teapod/util/StorageController.kt
index b40bbce..f11592d 100644
--- a/app/src/main/java/org/mosad/teapod/util/CacheHelper.kt
+++ b/app/src/main/java/org/mosad/teapod/util/StorageController.kt
@@ -1,16 +1,16 @@
package org.mosad.teapod.util
import android.content.Context
-import android.util.Log
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import kotlinx.coroutines.*
import java.io.File
/**
- * myList should be saved in a db
+ * This controller contains the logic for permanently saved data.
+ * On load, it loads the saved files into the variables
*/
-object CacheHelper {
+object StorageController {
private const val fileNameMyList = "my_list.json"
@@ -27,7 +27,6 @@ object CacheHelper {
)
}
-
fun saveMyList(context: Context): Job {
val file = File(context.filesDir, fileNameMyList)
@@ -36,12 +35,4 @@ object CacheHelper {
}
}
- private fun save(file: File, text: String) {
- try {
- file.writeText(text)
- } catch (ex: Exception) {
- Log.e(javaClass.name, "failed to write file \"${file.absoluteFile}\"", ex)
- }
- }
-
}
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
index fd30f17..4ef6a7b 100644
--- a/app/src/main/res/layout/fragment_home.xml
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -25,8 +25,11 @@
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:padding="5dp"
- android:text="My List"
+ android:paddingStart="10dp"
+ android:paddingTop="15dp"
+ android:paddingEnd="5dp"
+ android:paddingBottom="5dp"
+ android:text="@string/my_list"
android:textSize="16sp"
android:textStyle="bold" />
diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml
index f41c068..f69a35b 100644
--- a/app/src/main/res/values-de-rDE/strings.xml
+++ b/app/src/main/res/values-de-rDE/strings.xml
@@ -5,6 +5,9 @@
Suche
Account
+
+ Meine Liste
+
Suche nach Filmen und Serien
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e592849..ad70b45 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -5,6 +5,9 @@
Search
Account
+
+ My list
+
Search for movies and series
poster