fix #9 & replace my list checkbox with layout for easier gui building

This commit is contained in:
2020-10-16 18:24:34 +02:00
parent d912ed34a3
commit 5458b43354
8 changed files with 81 additions and 67 deletions

View File

@ -11,7 +11,6 @@ import org.mosad.teapod.util.Episode
import org.mosad.teapod.util.Media
import java.io.IOException
import java.util.*
import kotlin.collections.ArrayList
/**
* maybe AoDParser as object would be useful
@ -43,8 +42,8 @@ class AoDParser {
val authenticityToken = resAuth.parse().select("meta[name=csrf-token]").attr("content")
val authCookies = resAuth.cookies()
Log.i(javaClass.name, "Received authenticity token: $authenticityToken")
Log.i(javaClass.name, "Received authenticity cookies: $authCookies")
//Log.d(javaClass.name, "Received authenticity token: $authenticityToken")
//Log.d(javaClass.name, "Received authenticity cookies: $authCookies")
val data = mapOf(
Pair("user[login]", EncryptedPreferences.login),
@ -62,6 +61,7 @@ class AoDParser {
.execute()
//println(resLogin.body())
sessionCookies = resLogin.cookies()
loginSuccess = resLogin.body().contains("Hallo, du bist jetzt angemeldet.")
Log.i(javaClass.name, "Status: ${resLogin.statusCode()} (${resLogin.statusMessage()}), login successful: $loginSuccess")
@ -167,14 +167,12 @@ class AoDParser {
if (csrfToken.isEmpty()) {
csrfToken = res.select("meta[name=csrf-token]").attr("content")
//Log.i(javaClass.name, "New csrf token is $csrfToken")
}
// has attr data-lag (ger or jap)
// TODO has attr data-lag (ger or jap)
val playlists = res.select("input.streamstarter_html5").eachAttr("data-playlist")
//println("first entry: ${playlists.first()}")
//println("csrf token is: $csrfToken")
return@withContext if (playlists.size > 0) {
loadStreamInfo(playlists.first(), csrfToken, media.type, episodes)
} else {
@ -197,7 +195,7 @@ class AoDParser {
Pair("X-Requested-With", "XMLHttpRequest"),
)
println("loading streaminfo with cstf: $csrfToken")
//println("loading streaminfo with cstf: $csrfToken")
val res = Jsoup.connect(baseUrl + playlistPath)
.ignoreContentType(true)
@ -262,13 +260,15 @@ class AoDParser {
)
try {
Jsoup.connect(baseUrl + callbackPath)
.ignoreContentType(true)
.cookies(sessionCookies)
.headers(headers)
.execute()
withContext(Dispatchers.IO) {
Jsoup.connect(baseUrl + callbackPath)
.ignoreContentType(true)
.cookies(sessionCookies)
.headers(headers)
.execute()
}
} catch (ex: IOException) {
Log.e(javaClass.name, "Callback for $callbackPath failed.")
Log.e(javaClass.name, "Callback for $callbackPath failed.", ex)
}
}

View File

@ -4,10 +4,10 @@ import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
@ -17,11 +17,11 @@ 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.StorageController
import org.mosad.teapod.util.DataTypes.MediaType
import org.mosad.teapod.util.adapter.EpisodeItemAdapter
import org.mosad.teapod.util.Media
import org.mosad.teapod.util.StorageController
import org.mosad.teapod.util.TMDBResponse
import org.mosad.teapod.util.adapter.EpisodeItemAdapter
class MediaFragment(private val media: Media, private val tmdb: TMDBResponse) : Fragment() {
@ -60,11 +60,15 @@ 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 = StorageController.myList.contains(media.link)
if (StorageController.myList.contains(media.link)) {
Glide.with(requireContext()).load(R.drawable.ic_baseline_check_24).into(image_my_list_action)
} else {
Glide.with(requireContext()).load(R.drawable.ic_baseline_add_24).into(image_my_list_action)
}
// specific gui
if (media.type == MediaType.TVSHOW) {
adapterRecEpisodes = EpisodeItemAdapter(media.episodes, requireContext())
adapterRecEpisodes = EpisodeItemAdapter(media.episodes)
viewManager = LinearLayoutManager(context)
recycler_episodes.layoutManager = viewManager
recycler_episodes.adapter = adapterRecEpisodes
@ -91,15 +95,16 @@ class MediaFragment(private val media: Media, private val tmdb: TMDBResponse) :
}
// add or remove media from myList
check_my_list.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
StorageController.myList.add(media.link)
} else {
linear_my_list_action.setOnClickListener {
if (StorageController.myList.contains(media.link)) {
StorageController.myList.remove(media.link)
Glide.with(requireContext()).load(R.drawable.ic_baseline_add_24).into(image_my_list_action)
} else {
StorageController.myList.add(media.link)
Glide.with(requireContext()).load(R.drawable.ic_baseline_check_24).into(image_my_list_action)
}
StorageController.saveMyList(requireContext())
// TODO notify home fragment on change
// notify home fragment on change
parentFragmentManager.findFragmentByTag("HomeFragment")?.let {
(it as HomeFragment).updateMyListMedia()
}
@ -119,11 +124,8 @@ class MediaFragment(private val media: Media, private val tmdb: TMDBResponse) :
}
private fun playStream(url: String) {
val mainActivity = activity as MainActivity
println("url is: $url")
mainActivity.startPlayer(url)
Log.d(javaClass.name, "Playing stream: $url")
(activity as MainActivity).startPlayer(url)
}
}

View File

@ -1,9 +1,9 @@
package org.mosad.teapod.util.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions
@ -12,7 +12,7 @@ import kotlinx.android.synthetic.main.item_episode.view.*
import org.mosad.teapod.R
import org.mosad.teapod.util.Episode
class EpisodeItemAdapter(private val episodes: List<Episode>, private val context: Context) : RecyclerView.Adapter<EpisodeItemAdapter.MyViewHolder>() {
class EpisodeItemAdapter(private val episodes: List<Episode>) : RecyclerView.Adapter<EpisodeItemAdapter.MyViewHolder>() {
var onItemClick: ((String, Int) -> Unit)? = null
var onImageClick: ((String, Int) -> Unit)? = null
@ -24,6 +24,8 @@ class EpisodeItemAdapter(private val episodes: List<Episode>, private val contex
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
val context = holder.view.context
holder.view.text_episode_title.text = context.getString(
R.string.component_episode_title,
episodes[position].number,
@ -37,7 +39,11 @@ class EpisodeItemAdapter(private val episodes: List<Episode>, private val contex
.into(holder.view.image_episode)
}
if (!episodes[position].watched) {
if (episodes[position].watched) {
holder.view.image_watched.setImageDrawable(
ContextCompat.getDrawable(context, R.drawable.ic_baseline_check_circle_24)
)
} else {
holder.view.image_watched.setImageDrawable(null)
}
}