diff --git a/.idea/misc.xml b/.idea/misc.xml index 18962c8..1b6dac9 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/app/build.gradle b/app/build.gradle index cb016dc..75ca3be 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -78,7 +78,6 @@ dependencies { implementation 'com.github.siyamed:android-shape-imageview:0.9.3' implementation 'androidx.browser:browser:1.0.0' implementation 'com.zhy:base-adapter:3.0.3' - implementation 'com.xiaofeng.android:flowlayoutmanager:1.2.3.2' implementation 'com.nshmura:recyclertablayout:1.5.0' implementation 'com.github.chrisbanes:PhotoView:2.1.4' implementation 'am.util:viewpager:25.3.0' diff --git a/app/src/main/java/soko/ekibun/bangumi/api/github/GithubRaw.kt b/app/src/main/java/soko/ekibun/bangumi/api/github/GithubRaw.kt index 810a85e..16fce0f 100644 --- a/app/src/main/java/soko/ekibun/bangumi/api/github/GithubRaw.kt +++ b/app/src/main/java/soko/ekibun/bangumi/api/github/GithubRaw.kt @@ -16,7 +16,7 @@ interface GithubRaw{ /** * 时间表 */ - @GET("/ekibun/bangumi_calendar/master/calendar.json") + @GET("/ekibun/bangumi_onair/master/calendar.json") fun bangumiCalendar(): Call> /** diff --git a/app/src/main/java/soko/ekibun/bangumi/api/github/bean/OnAirInfo.kt b/app/src/main/java/soko/ekibun/bangumi/api/github/bean/OnAirInfo.kt index d022180..b6a89f3 100644 --- a/app/src/main/java/soko/ekibun/bangumi/api/github/bean/OnAirInfo.kt +++ b/app/src/main/java/soko/ekibun/bangumi/api/github/bean/OnAirInfo.kt @@ -6,6 +6,7 @@ package soko.ekibun.bangumi.api.github.bean data class OnAirInfo ( val id: Int, val name: String, + val sites: List, val eps: List ){ /** @@ -21,11 +22,13 @@ data class OnAirInfo ( /** * 站点信息 */ - data class Site( + open class Site( val site: String, - val title: String, - val url: String + private val title: String = "", + private val url: String = "" ) { + open fun title() = title + open fun url() = url val color get() = (0xff000000 + when (site) { "offical" -> 0x888888 @@ -53,4 +56,39 @@ data class OnAirInfo ( else -> 0 }).toInt() } + + /** + * 站点信息 + */ + class SubjectSite( + site: String, + val id: String, + val week: Int = 0, + val time: String? = null + ) : Site(site) { + override fun title() = if (week > 0) "每周${"一二三四五六日"[week - 1]} ${time?.replace(Regex("""(\d{2})(\d{2})"""), "$1:$2")}更新" else id + override fun url() = when (site) { + "bangumi" -> "http://bangumi.tv/subject/$id" + "saraba1st" -> "https://bbs.saraba1st.com/2b/thread-$id-1-1.html" + + "acfun" -> "https://www.acfun.cn/bangumi/aa$id" + "bilibili" -> "https://www.bilibili.com/bangumi/media/md$id" + "tucao" -> "http://www.tucao.tv/index.php?m=search&c=index&a=init2&q=$id" + "sohu" -> "https://tv.sohu.com/$id" + "youku" -> "https://list.youku.com/show/id_z$id.html" + "tudou" -> "https://www.tudou.com/albumcover/$id.html" + "qq" -> "https://v.qq.com/detail/$id.html" + "iqiyi" -> "http://www.iqiyi.com/$id.html" + "letv" -> "https://www.le.com/comic/$id.html" + "pptv" -> "http://v.pptv.com/page/$id.html" + "kankan" -> "http://movie.kankan.com/movie/$id" + "mgtv" -> "https://www.mgtv.com/h/$id.html" + "nicovideo" -> "http://ch.nicovideo.jp/$id" + "netflix" -> "https://www.netflix.com/title/$id" + + "dmhy" -> "https://share.dmhy.org/topics/list?keyword=$id" + "nyaa" -> "https://www.nyaa.se/?page=search&term=$id" + else -> id + } + } } \ No newline at end of file diff --git a/app/src/main/java/soko/ekibun/bangumi/ui/subject/EpisodeDialog.kt b/app/src/main/java/soko/ekibun/bangumi/ui/subject/EpisodeDialog.kt index 62e8d1f..b786176 100644 --- a/app/src/main/java/soko/ekibun/bangumi/ui/subject/EpisodeDialog.kt +++ b/app/src/main/java/soko/ekibun/bangumi/ui/subject/EpisodeDialog.kt @@ -32,7 +32,7 @@ class EpisodeDialog(context: Context) : Dialog(context, R.style.AppTheme_Dialog) val dialog = EpisodeDialog(context) dialog.eps = eps dialog.episode = episode - dialog.onAirInfo = onAirInfo + dialog.onAirInfoChange(onAirInfo) dialog.callback = callback dialog.show() return dialog @@ -63,8 +63,11 @@ class EpisodeDialog(context: Context) : Dialog(context, R.style.AppTheme_Dialog) var eps: List = ArrayList() var episode: Episode? = null - var onAirInfo: OnAirInfo? = null var callback: ((eps: List, status: String) -> Unit)? = null + val adapter = SitesAdapter() + var onAirInfoChange = { info: OnAirInfo? -> + adapter.setNewData(info?.eps?.find { it.id == episode?.id }?.sites) + } @SuppressLint("SetTextI18n", "InflateParams") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -79,14 +82,13 @@ class EpisodeDialog(context: Context) : Dialog(context, R.style.AppTheme_Dialog) view.item_episode_title.setOnClickListener { WebActivity.launchUrl(context, "${Bangumi.SERVER}/m/topic/ep/${episode.id}", "") } - val adapter = SitesAdapter(onAirInfo?.eps?.firstOrNull { it.id == episode.id }?.sites?.toMutableList()) val emptyTextView = TextView(context) val dp4 = (context.resources.displayMetrics.density * 4 + 0.5f).toInt() emptyTextView.setPadding(dp4, dp4, dp4, dp4) emptyTextView.setText(R.string.hint_no_play_source) adapter.emptyView = emptyTextView adapter.setOnItemClickListener { _, _, position -> - WebActivity.launchUrl(context, adapter.data[position].url, "") + WebActivity.launchUrl(context, adapter.data[position].url(), "") } view.item_site_list.adapter = adapter val linearLayoutManager = androidx.recyclerview.widget.LinearLayoutManager(context) diff --git a/app/src/main/java/soko/ekibun/bangumi/ui/subject/SitesAdapter.kt b/app/src/main/java/soko/ekibun/bangumi/ui/subject/SitesAdapter.kt index 3b26528..fe5090b 100644 --- a/app/src/main/java/soko/ekibun/bangumi/ui/subject/SitesAdapter.kt +++ b/app/src/main/java/soko/ekibun/bangumi/ui/subject/SitesAdapter.kt @@ -15,7 +15,7 @@ class SitesAdapter(data: MutableList? = null) : override fun convert(helper: BaseViewHolder, item: OnAirInfo.Site) { helper.itemView.item_site.text = item.site - helper.itemView.item_site_id.text = item.title + helper.itemView.item_site_id.text = item.title() helper.itemView.item_site.backgroundTintList = ColorStateList.valueOf(item.color) } } \ No newline at end of file diff --git a/app/src/main/java/soko/ekibun/bangumi/ui/subject/SubjectPresenter.kt b/app/src/main/java/soko/ekibun/bangumi/ui/subject/SubjectPresenter.kt index 6bdccf5..151f66b 100644 --- a/app/src/main/java/soko/ekibun/bangumi/ui/subject/SubjectPresenter.kt +++ b/app/src/main/java/soko/ekibun/bangumi/ui/subject/SubjectPresenter.kt @@ -49,7 +49,9 @@ class SubjectPresenter(private val context: SubjectActivity) { subjectView.detail.item_detail.setOnClickListener { InfoboxDialog.showDialog(context, subject) } - + subjectView.sitesAdapter.setOnItemClickListener { _, _, position -> + WebActivity.launchUrl(context, subjectView.sitesAdapter.data[position].url(), "") + } subjectView.commentAdapter.setEnableLoadMore(true) subjectView.commentAdapter.setLoadMoreView(BrvahLoadMoreView()) @@ -203,9 +205,9 @@ class SubjectPresenter(private val context: SubjectActivity) { } } - @SuppressLint("SetTextI18n") + private var episodeDialog: EpisodeDialog? = null private fun openEpisode(episode: Episode, eps: List) { - EpisodeDialog.showDialog(context, episode, eps, onAirInfo) { mEps, status -> + episodeDialog = EpisodeDialog.showDialog(context, episode, eps, onAirInfo) { mEps, status -> updateProgress(mEps, status) } } @@ -247,6 +249,8 @@ class SubjectPresenter(private val context: SubjectActivity) { } is OnAirInfo -> { onAirInfo = it + subjectView.sitesAdapter.setNewData(it.sites) + episodeDialog?.onAirInfoChange?.invoke(it) } is IpView -> { val ret = BgmIpViewer.getSeason(it, subject) diff --git a/app/src/main/java/soko/ekibun/bangumi/ui/subject/SubjectView.kt b/app/src/main/java/soko/ekibun/bangumi/ui/subject/SubjectView.kt index 28e36c8..d4d8ad3 100644 --- a/app/src/main/java/soko/ekibun/bangumi/ui/subject/SubjectView.kt +++ b/app/src/main/java/soko/ekibun/bangumi/ui/subject/SubjectView.kt @@ -44,9 +44,10 @@ class SubjectView(private val context: SubjectActivity) { val tagAdapter = TagAdapter() val topicAdapter = TopicAdapter() val blogAdapter = BlogAdapter() + val sitesAdapter = SitesAdapter() val commentAdapter = CommentAdapter() val seasonAdapter = SeasonAdapter() - val seasonLayoutManager = LinearLayoutManager(context) + val seasonLayoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false) val detail = context.subject_detail as LinearLayout @@ -87,8 +88,7 @@ class SubjectView(private val context: SubjectActivity) { }) context.season_list.adapter = seasonAdapter - seasonLayoutManager.orientation = RecyclerView.HORIZONTAL - context.season_list.layoutManager = seasonLayoutManager + context.season_list.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false) context.season_list.isNestedScrollingEnabled = false context.episode_list.adapter = episodeAdapter @@ -107,6 +107,7 @@ class SubjectView(private val context: SubjectActivity) { context.linked_list.setOnTouchListener(swipeTouchListener) context.character_list.setOnTouchListener(swipeTouchListener) context.tag_list.setOnTouchListener(swipeTouchListener) + context.site_list.setOnTouchListener(swipeTouchListener) val touchListener = episodeDetailAdapter.setUpWithRecyclerView(context.episode_detail_list) touchListener.nestScrollDistance = { @@ -128,22 +129,15 @@ class SubjectView(private val context: SubjectActivity) { } context.linked_list.adapter = linkedSubjectsAdapter - val subjectLayoutManager = LinearLayoutManager(context) - subjectLayoutManager.orientation = RecyclerView.HORIZONTAL - context.linked_list.layoutManager = subjectLayoutManager + context.linked_list.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false) context.linked_list.isNestedScrollingEnabled = false - context.commend_list.adapter = recommendSubjectsAdapter - val subjectLayoutManager2 = LinearLayoutManager(context) - subjectLayoutManager2.orientation = RecyclerView.HORIZONTAL - context.commend_list.layoutManager = subjectLayoutManager2 + context.commend_list.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false) context.commend_list.isNestedScrollingEnabled = false context.character_list.adapter = characterAdapter - val characterLayoutManager = LinearLayoutManager(context) - characterLayoutManager.orientation = RecyclerView.HORIZONTAL - context.character_list.layoutManager = characterLayoutManager + context.character_list.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false) context.character_list.isNestedScrollingEnabled = false context.topic_list.adapter = topicAdapter @@ -155,11 +149,13 @@ class SubjectView(private val context: SubjectActivity) { context.blog_list.isNestedScrollingEnabled = false context.tag_list.adapter = tagAdapter - val tagLayoutManager = LinearLayoutManager(context) - tagLayoutManager.orientation = RecyclerView.HORIZONTAL - context.tag_list.layoutManager = tagLayoutManager + context.tag_list.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false) context.tag_list.isNestedScrollingEnabled = false + context.site_list.adapter = sitesAdapter + context.site_list.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false) + context.site_list.isNestedScrollingEnabled = false + context.comment_list.adapter = commentAdapter context.comment_list.layoutManager = LinearLayoutManager(context) diff --git a/app/src/main/java/soko/ekibun/bangumi/util/WebViewCookieHandler.java b/app/src/main/java/soko/ekibun/bangumi/util/WebViewCookieHandler.java index 8c4fa14..f9fffbb 100644 --- a/app/src/main/java/soko/ekibun/bangumi/util/WebViewCookieHandler.java +++ b/app/src/main/java/soko/ekibun/bangumi/util/WebViewCookieHandler.java @@ -1,9 +1,6 @@ package soko.ekibun.bangumi.util; -import android.content.Context; -import androidx.annotation.Keep; import android.webkit.CookieManager; -import android.webkit.WebView; import okhttp3.Cookie; import okhttp3.CookieJar; import okhttp3.HttpUrl; @@ -16,7 +13,9 @@ public class WebViewCookieHandler implements CookieJar { private CookieManager mCookieManager = CookieManager.getInstance(); @Override - public void saveFromResponse(HttpUrl url, List cookies) { } + public void saveFromResponse(HttpUrl url, List cookies) { + /* no-op */ + } @Override public List loadForRequest(HttpUrl url) { diff --git a/app/src/main/res/layout/item_calendar_tab.xml b/app/src/main/res/layout/item_calendar_tab.xml index a756aac..dfa29dd 100644 --- a/app/src/main/res/layout/item_calendar_tab.xml +++ b/app/src/main/res/layout/item_calendar_tab.xml @@ -22,7 +22,7 @@ app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintBottom_toTopOf="@+id/item_week" - android:textSize="12sp" + android:textSize="@dimen/textSizeSmall" android:textColor="@color/color_selectable" android:layout_marginBottom="2dp" tools:text="4-19" @@ -35,6 +35,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" + android:layout_marginBottom="3dp" android:background="@drawable/bg_calendar_selector" android:textColor="@color/color_calendar_selector" android:backgroundTintMode="src_in" diff --git a/app/src/main/res/layout/subject_detail.xml b/app/src/main/res/layout/subject_detail.xml index 898b2f7..1d1558a 100644 --- a/app/src/main/res/layout/subject_detail.xml +++ b/app/src/main/res/layout/subject_detail.xml @@ -39,6 +39,17 @@ tools:orientation="horizontal" tools:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" tools:listitem="@layout/item_tag"/> +