diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png index ee66d8a..d64bca6 100644 Binary files a/app/src/main/ic_launcher-playstore.png and b/app/src/main/ic_launcher-playstore.png differ diff --git a/app/src/main/java/com/lizongying/mytv/MainActivity.kt b/app/src/main/java/com/lizongying/mytv/MainActivity.kt index 3761952..bef2255 100644 --- a/app/src/main/java/com/lizongying/mytv/MainActivity.kt +++ b/app/src/main/java/com/lizongying/mytv/MainActivity.kt @@ -85,7 +85,6 @@ class MainActivity : FragmentActivity() { val transaction = supportFragmentManager.beginTransaction() if (mainFragment.isHidden) { -// focusMainFragment() transaction.show(mainFragment) } else { transaction.hide(mainFragment) @@ -94,10 +93,6 @@ class MainActivity : FragmentActivity() { transaction.commit() } - private fun focusMainFragment() { - mainFragment.focus() - } - private fun mainFragmentIsHidden(): Boolean { return mainFragment.isHidden } diff --git a/app/src/main/java/com/lizongying/mytv/MainFragment.kt b/app/src/main/java/com/lizongying/mytv/MainFragment.kt index c60480d..7316108 100644 --- a/app/src/main/java/com/lizongying/mytv/MainFragment.kt +++ b/app/src/main/java/com/lizongying/mytv/MainFragment.kt @@ -6,7 +6,6 @@ import android.os.Bundle import android.os.Handler import android.os.Looper import android.util.Log -import android.view.View import androidx.leanback.app.BrowseSupportFragment import androidx.leanback.widget.ArrayObjectAdapter import androidx.leanback.widget.HeaderItem @@ -29,7 +28,7 @@ import kotlinx.coroutines.launch class MainFragment : BrowseSupportFragment() { var itemPosition: Int = 0 - private var request: Request? = null + private var request: Request = Request() private var rowsAdapter: ArrayObjectAdapter? = null @@ -52,9 +51,9 @@ class MainFragment : BrowseSupportFragment() { override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) + activity?.let { request.initYSP(it) } - request = activity?.let { Request(it) } + sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) loadRows() @@ -82,7 +81,7 @@ class MainFragment : BrowseSupportFragment() { if (tvViewModel.pid.value != null) { Log.i(TAG, "request $title") lifecycleScope.launch(Dispatchers.IO) { - tvViewModel.let { request?.fetchData(it) } + tvViewModel.let { request.fetchData(it) } } (activity as? MainActivity)?.showInfoFragment(tvViewModel) setSelectedPosition( @@ -107,13 +106,13 @@ class MainFragment : BrowseSupportFragment() { fragmentReady() } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - } - override fun onDestroy() { super.onDestroy() handler.removeCallbacks(mUpdateProgramRunnable) + with(sharedPref!!.edit()) { + putInt("position", itemPosition) + apply() + } } fun updateProgram(tvViewModel: TVViewModel) { @@ -121,11 +120,11 @@ class MainFragment : BrowseSupportFragment() { if (timestamp - tvViewModel.programUpdateTime > 60) { if (tvViewModel.program.value!!.isEmpty()) { tvViewModel.programUpdateTime = timestamp - request?.fetchProgram(tvViewModel) + request.fetchProgram(tvViewModel) } else { if (timestamp - tvViewModel.program.value!!.last().et < 600) { tvViewModel.programUpdateTime = timestamp - request?.fetchProgram(tvViewModel) + request.fetchProgram(tvViewModel) } } } @@ -202,13 +201,7 @@ class MainFragment : BrowseSupportFragment() { itemPosition = sharedPref?.getInt("position", 0)!! if (itemPosition >= tvListViewModel.size()) { itemPosition = 0 - savePosition(0) - } - } - - fun focus() { - if (!view?.isFocused!!) { - view?.requestFocus() + tvListViewModel.setItemPosition(itemPosition) } } @@ -216,10 +209,6 @@ class MainFragment : BrowseSupportFragment() { ready++ Log.i(TAG, "ready $ready") if (ready == 3) { - -// request?.fetchPage() -// tvListViewModel.getTVViewModel(0)?.let { request?.fetchProgram(it) } - val tvViewModel = tvListViewModel.getTVViewModel(itemPosition) tvViewModel?.changed() @@ -227,21 +216,13 @@ class MainFragment : BrowseSupportFragment() { } } - fun savePosition(position: Int) { - tvListViewModel.setItemPosition(position) - with(sharedPref!!.edit()) { - putInt("position", position) - apply() - } - } - fun prev() { view?.post { itemPosition-- if (itemPosition == -1) { itemPosition = tvListViewModel.size() - 1 } - savePosition(itemPosition) + tvListViewModel.setItemPosition(itemPosition) val tvViewModel = tvListViewModel.getTVViewModel(itemPosition) tvViewModel?.changed() @@ -254,7 +235,7 @@ class MainFragment : BrowseSupportFragment() { if (itemPosition == tvListViewModel.size()) { itemPosition = 0 } - savePosition(itemPosition) + tvListViewModel.setItemPosition(itemPosition) val tvViewModel = tvListViewModel.getTVViewModel(itemPosition) tvViewModel?.changed() @@ -291,10 +272,6 @@ class MainFragment : BrowseSupportFragment() { } } - fun tvViewModel(): TVViewModel? { - return tvListViewModel.getTVViewModel(itemPosition) - } - private fun setupEventListeners() { onItemViewClickedListener = ItemViewClickedListener() onItemViewSelectedListener = ItemViewSelectedListener() @@ -310,7 +287,7 @@ class MainFragment : BrowseSupportFragment() { if (item is TVViewModel) { if (itemPosition != item.id.value!!) { itemPosition = item.id.value!! - savePosition(itemPosition) + tvListViewModel.setItemPosition(itemPosition) val tvViewModel = tvListViewModel.getTVViewModel(itemPosition) tvViewModel?.changed() diff --git a/app/src/main/java/com/lizongying/mytv/PlayerFragment.kt b/app/src/main/java/com/lizongying/mytv/PlayerFragment.kt index 2f14de2..5fdfeb3 100644 --- a/app/src/main/java/com/lizongying/mytv/PlayerFragment.kt +++ b/app/src/main/java/com/lizongying/mytv/PlayerFragment.kt @@ -1,6 +1,7 @@ package com.lizongying.mytv import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -8,6 +9,7 @@ import android.view.ViewTreeObserver import androidx.annotation.OptIn import androidx.fragment.app.Fragment import androidx.media3.common.MediaItem +import androidx.media3.common.PlaybackException import androidx.media3.common.Player import androidx.media3.common.VideoSize import androidx.media3.common.util.UnstableApi @@ -43,14 +45,25 @@ class PlayerFragment : Fragment() { override fun onVideoSizeChanged(videoSize: VideoSize) { val aspectRatio = 16f / 9f val layoutParams = playerView?.layoutParams - layoutParams?.width = - (playerView?.measuredHeight?.times(aspectRatio))?.toInt() - playerView?.layoutParams = layoutParams + val ratio = playerView?.measuredWidth?.div(playerView?.measuredHeight!!) + if (ratio != null) { + if (ratio < aspectRatio) { + layoutParams?.height = + (playerView?.measuredWidth?.div(aspectRatio))?.toInt() + playerView?.layoutParams = layoutParams + } else if (ratio > aspectRatio) { + layoutParams?.width = + (playerView?.measuredHeight?.times(aspectRatio))?.toInt() + playerView?.layoutParams = layoutParams + } + } + } + + override fun onPlayerError(error: PlaybackException) { + super.onPlayerError(error) + + Log.e(TAG, "PlaybackException $error") } -// -// override fun onPlayerError(error: PlaybackException) { -// super.onPlayerError(error) -// } }) } }) @@ -64,10 +77,7 @@ class PlayerFragment : Fragment() { val videoUrlCurrent = tvViewModel.videoIndex.value?.let { tvViewModel.videoUrl.value?.get(it) } playerView?.player?.run { - val mediaItem = MediaItem.Builder() - tvViewModel.id.value?.let { mediaItem.setMediaId(it.toString()) } - videoUrlCurrent?.let { mediaItem.setUri(it) } - setMediaItem(mediaItem.build()) + videoUrlCurrent?.let { setMediaItem(MediaItem.fromUri(it)) } prepare() } } diff --git a/app/src/main/java/com/lizongying/mytv/Request.kt b/app/src/main/java/com/lizongying/mytv/Request.kt index c4c625d..dc21ff9 100644 --- a/app/src/main/java/com/lizongying/mytv/Request.kt +++ b/app/src/main/java/com/lizongying/mytv/Request.kt @@ -8,6 +8,7 @@ import android.util.Log import com.lizongying.mytv.Utils.getDateFormat import com.lizongying.mytv.api.ApiClient import com.lizongying.mytv.api.BtraceClient +import com.lizongying.mytv.api.Info import com.lizongying.mytv.api.LiveInfo import com.lizongying.mytv.api.LiveInfoRequest import com.lizongying.mytv.api.ProtoClient @@ -15,6 +16,7 @@ import com.lizongying.mytv.api.YSP import com.lizongying.mytv.api.YSPApiService import com.lizongying.mytv.api.YSPBtraceService import com.lizongying.mytv.api.YSPProtoService +import com.lizongying.mytv.api.YSPTokenService import com.lizongying.mytv.models.TVViewModel import com.lizongying.mytv.proto.Ysp.cn.yangshipin.oms.common.proto.pageModel import com.lizongying.mytv.proto.Ysp.cn.yangshipin.omstv.common.proto.epgProgramModel @@ -24,13 +26,15 @@ import retrofit2.Response import javax.crypto.Cipher import javax.crypto.spec.IvParameterSpec import javax.crypto.spec.SecretKeySpec +import kotlin.reflect.KFunction0 -class Request(var context: Context) { +class Request { + private var yspTokenService: YSPTokenService = ApiClient().yspTokenService + private var yspApiService: YSPApiService = ApiClient().yspApiService + private var yspBtraceService: YSPBtraceService = BtraceClient().yspBtraceService + private var yspProtoService: YSPProtoService = ProtoClient().yspProtoService private var ysp: YSP? = null - private var yspApiService: YSPApiService? = null - private var yspBtraceService: YSPBtraceService? = null - private var yspProtoService: YSPProtoService? = null // TODO onDestroy private val handler = Handler(Looper.getMainLooper()) @@ -83,26 +87,45 @@ class Request(var context: Context) { "海南卫视" to "海南卫视", ) - init { - if (context is MainActivity) { - ysp = YSP(context) - } - yspApiService = ApiClient().yspApiService - yspBtraceService = BtraceClient().yspBtraceService - yspProtoService = ProtoClient().yspProtoService + private var token: String? = null + + fun initYSP(context: Context) { + ysp = YSP(context) } - fun fetchData(tvModel: TVViewModel) { + fun fetchToken(fragmentReady: KFunction0) { + yspTokenService.getInfo() + .enqueue(object : Callback { + override fun onResponse(call: Call, response: Response) { + if (response.isSuccessful) { + val info = response.body() + token = info?.data?.token + Log.i(TAG, "info success $token") + } else { + Log.e(TAG, "info status error") + } + fragmentReady() + } + + override fun onFailure(call: Call, t: Throwable) { + Log.e(TAG, "info request error $t") + fragmentReady() + } + }) + } + + fun fetchVideo(tvModel: TVViewModel, cookie: String) { if (::myRunnable.isInitialized) { handler.removeCallbacks(myRunnable) } - tvModel.seq = 0 - val data = ysp?.switch(tvModel) val title = tvModel.title.value + tvModel.seq = 0 + val data = ysp?.switch(tvModel) val request = data?.let { LiveInfoRequest(it) } - request?.let { yspApiService?.getLiveInfo(it) } + + request?.let { yspApiService.getLiveInfo(cookie, it) } ?.enqueue(object : Callback { override fun onResponse(call: Call, response: Response) { if (response.isSuccessful) { @@ -151,6 +174,51 @@ class Request(var context: Context) { }) } + fun fetchData(tvModel: TVViewModel) { + var cookie = "guid=1; vplatform=109" + val channels = arrayOf( + "CCTV3 综艺", + "CCTV6 电影", + "CCTV8 电视剧", + "风云剧场", + "第一剧场", + "怀旧剧场", + "世界地理", + "风云音乐", + "兵器科技", + "风云足球", + "高尔夫网球", + "女性时尚", + "央视文化精品", + "央视台球", + "电视指南", + "卫生健康", + ) + if (tvModel.title.value in channels) { + yspTokenService.getInfo() + .enqueue(object : Callback { + override fun onResponse(call: Call, response: Response) { + if (response.isSuccessful) { + val info = response.body() + token = info?.data?.token + Log.i(TAG, "info success $token") + cookie = + "guid=1; vplatform=109; yspopenid=vu0-8lgGV2LW9QjDeuBFsX8yMnzs37Q3_HZF6XyVDpGR_I; vusession=$token" + fetchVideo(tvModel, cookie) + } else { + Log.e(TAG, "info status error") + } + } + + override fun onFailure(call: Call, t: Throwable) { + Log.e(TAG, "info request error $t") + } + }) + } else { + fetchVideo(tvModel, cookie) + } + } + inner class MyRunnable(private val tvModel: TVViewModel) : Runnable { override fun run() { fetchBtrace(tvModel) @@ -164,7 +232,7 @@ class Request(var context: Context) { val guid = ysp?.getGuid()!! val pid = tvModel.pid.value!! val sid = tvModel.sid.value!! - yspBtraceService?.kvcollect( + yspBtraceService.kvcollect( c_timestamp = ysp?.generateGuid()!!, guid = guid, c_guid = guid, @@ -177,10 +245,10 @@ class Request(var context: Context) { ftime = getDateFormat("yyyy-MM-dd HH:mm:ss"), seq = tvModel.seq.toString(), ) - ?.enqueue(object : Callback { + .enqueue(object : Callback { override fun onResponse(call: Call, response: Response) { if (response.isSuccessful) { -// Log.d(TAG, "$title kvcollect success") + // Log.d(TAG, "$title kvcollect success") } else { Log.e(TAG, "$title kvcollect status error") tvModel.firstSource() @@ -195,7 +263,7 @@ class Request(var context: Context) { } fun fetchPage() { - yspProtoService?.getPage()?.enqueue(object : Callback { + yspProtoService.getPage().enqueue(object : Callback { override fun onResponse( call: Call, response: Response @@ -239,8 +307,8 @@ class Request(var context: Context) { fun fetchProgram(tvViewModel: TVViewModel) { val title = tvViewModel.title.value - yspProtoService?.getProgram(tvViewModel.programId.value!!, getDateFormat("yyyyMMdd")) - ?.enqueue(object : Callback { + yspProtoService.getProgram(tvViewModel.programId.value!!, getDateFormat("yyyyMMdd")) + .enqueue(object : Callback { override fun onResponse( call: Call, response: Response diff --git a/app/src/main/java/com/lizongying/mytv/TV.kt b/app/src/main/java/com/lizongying/mytv/TV.kt index ebb1dfe..e9f130f 100644 --- a/app/src/main/java/com/lizongying/mytv/TV.kt +++ b/app/src/main/java/com/lizongying/mytv/TV.kt @@ -25,8 +25,4 @@ data class TV( ", programId='" + programId + '\'' + '}' } - - companion object { - internal const val serialVersionUID = 727566175075960653L - } } \ No newline at end of file diff --git a/app/src/main/java/com/lizongying/mytv/TVList.kt b/app/src/main/java/com/lizongying/mytv/TVList.kt index 03d9e9c..735e46b 100644 --- a/app/src/main/java/com/lizongying/mytv/TVList.kt +++ b/app/src/main/java/com/lizongying/mytv/TVList.kt @@ -6,43 +6,24 @@ object TVList { } private var mappingLogo = mapOf( - "CCTV4K" to "https://resources.yangshipin.cn/assets/oms/image/202306/3e9d06fd7244d950df5838750f1c6ac3456e172b51caca2c16d2282125b111e8.png?imageMogr2/format/webp", "CCTV4K 超高清" to "https://resources.yangshipin.cn/assets/oms/image/202306/3e9d06fd7244d950df5838750f1c6ac3456e172b51caca2c16d2282125b111e8.png?imageMogr2/format/webp", - "CCTV1" to "https://resources.yangshipin.cn/assets/oms/image/202306/d57905b93540bd15f0c48230dbbbff7ee0d645ff539e38866e2d15c8b9f7dfcd.png?imageMogr2/format/webp", "CCTV1 综合" to "https://resources.yangshipin.cn/assets/oms/image/202306/d57905b93540bd15f0c48230dbbbff7ee0d645ff539e38866e2d15c8b9f7dfcd.png?imageMogr2/format/webp", - "CCTV2" to "https://resources.yangshipin.cn/assets/oms/image/202306/20115388de0207131af17eac86c33049b95d69eaff064e55653a1b941810a006.png?imageMogr2/format/webp", "CCTV2 财经" to "https://resources.yangshipin.cn/assets/oms/image/202306/20115388de0207131af17eac86c33049b95d69eaff064e55653a1b941810a006.png?imageMogr2/format/webp", - "CCTV3" to "https://resources.yangshipin.cn/assets/oms/image/202306/7b7a65c712450da3deb6ca66fbacf4f9aee00d3f20bd80eafb5ada01ec63eb3a.png?imageMogr2/format/webp", "CCTV3 综艺" to "https://resources.yangshipin.cn/assets/oms/image/202306/7b7a65c712450da3deb6ca66fbacf4f9aee00d3f20bd80eafb5ada01ec63eb3a.png?imageMogr2/format/webp", - "CCTV4" to "https://resources.yangshipin.cn/assets/oms/image/202306/f357e58fdbcc076a3d65e1f958c942b2e14f14342c60736ceed98b092d35356a.png?imageMogr2/format/webp", "CCTV4 中文国际" to "https://resources.yangshipin.cn/assets/oms/image/202306/f357e58fdbcc076a3d65e1f958c942b2e14f14342c60736ceed98b092d35356a.png?imageMogr2/format/webp", - "CCTV5" to "https://resources.yangshipin.cn/assets/oms/image/202306/0a6a7138952675983a3d854df7688557b286d59aa06166edae51506f9204d655.png?imageMogr2/format/webp", "CCTV5 体育" to "https://resources.yangshipin.cn/assets/oms/image/202306/0a6a7138952675983a3d854df7688557b286d59aa06166edae51506f9204d655.png?imageMogr2/format/webp", - "CCTV5+" to "https://resources.yangshipin.cn/assets/oms/image/202306/649ad76a90bfef55b05db9fe52e006487280f619089099d5dc971e387fc6eff0.png?imageMogr2/format/webp", "CCTV5+ 体育赛事" to "https://resources.yangshipin.cn/assets/oms/image/202306/649ad76a90bfef55b05db9fe52e006487280f619089099d5dc971e387fc6eff0.png?imageMogr2/format/webp", - "CCTV6" to "https://resources.yangshipin.cn/assets/oms/image/202306/741515efda91f03f455df8a7da4ee11fa9329139c276435cf0a9e2af398d5bf2.png?imageMogr2/format/webp", "CCTV6 电影" to "https://resources.yangshipin.cn/assets/oms/image/202306/741515efda91f03f455df8a7da4ee11fa9329139c276435cf0a9e2af398d5bf2.png?imageMogr2/format/webp", - "CCTV7" to "https://resources.yangshipin.cn/assets/oms/image/202306/b29af94e295ebdf646cefb68122c429b9cd921f498ca20d2d8070252536f9ff9.png?imageMogr2/format/webp", "CCTV7 国防军事" to "https://resources.yangshipin.cn/assets/oms/image/202306/b29af94e295ebdf646cefb68122c429b9cd921f498ca20d2d8070252536f9ff9.png?imageMogr2/format/webp", - "CCTV8" to "https://resources.yangshipin.cn/assets/oms/image/202306/ad51de94426a0ba039e6dd6a8534ea98ecc813a6176bde87b4f18cc34d6d7590.png?imageMogr2/format/webp", "CCTV8 电视剧" to "https://resources.yangshipin.cn/assets/oms/image/202306/ad51de94426a0ba039e6dd6a8534ea98ecc813a6176bde87b4f18cc34d6d7590.png?imageMogr2/format/webp", - "CCTV9" to "https://resources.yangshipin.cn/assets/oms/image/202306/2ed1b4deeca179d5db806bb941790f82eb92a1b7299c1c38fe027f95a5caee5e.png?imageMogr2/format/webp", "CCTV9 记录" to "https://resources.yangshipin.cn/assets/oms/image/202306/2ed1b4deeca179d5db806bb941790f82eb92a1b7299c1c38fe027f95a5caee5e.png?imageMogr2/format/webp", - "CCTV10" to "https://resources.yangshipin.cn/assets/oms/image/202306/aa6157ec65188cd41826e5a2f088c3d6d153205f5f6428258d12c59999e221aa.png?imageMogr2/format/webp", "CCTV10 科教" to "https://resources.yangshipin.cn/assets/oms/image/202306/aa6157ec65188cd41826e5a2f088c3d6d153205f5f6428258d12c59999e221aa.png?imageMogr2/format/webp", - "CCTV11" to "https://resources.yangshipin.cn/assets/oms/image/202306/ed12ed7c7a1034dae4350011fe039284c5d5a836506b28c9e32e3c75299625c0.png?imageMogr2/format/webp", "CCTV11 戏曲" to "https://resources.yangshipin.cn/assets/oms/image/202306/ed12ed7c7a1034dae4350011fe039284c5d5a836506b28c9e32e3c75299625c0.png?imageMogr2/format/webp", - "CCTV12" to "https://resources.yangshipin.cn/assets/oms/image/202306/484083cffaa40df7e659565e8cb4d1cc740158a185512114167aa21fa0c59240.png?imageMogr2/format/webp", "CCTV12 社会与法" to "https://resources.yangshipin.cn/assets/oms/image/202306/484083cffaa40df7e659565e8cb4d1cc740158a185512114167aa21fa0c59240.png?imageMogr2/format/webp", - "CCTV13" to "https://resources.yangshipin.cn/assets/oms/image/202306/266da7b43c03e2312186b4a999e0f060e8f15b10d2cc2c9aa32171819254cf1a.png?imageMogr2/format/webp", "CCTV13 新闻" to "https://resources.yangshipin.cn/assets/oms/image/202306/266da7b43c03e2312186b4a999e0f060e8f15b10d2cc2c9aa32171819254cf1a.png?imageMogr2/format/webp", - "CCTV14" to "https://resources.yangshipin.cn/assets/oms/image/202306/af6b603896938dc346fbb16abfc63c12cba54b0ec9d18770a15d347d115f12d5.png?imageMogr2/format/webp", "CCTV14 少儿" to "https://resources.yangshipin.cn/assets/oms/image/202306/af6b603896938dc346fbb16abfc63c12cba54b0ec9d18770a15d347d115f12d5.png?imageMogr2/format/webp", - "CCTV15" to "https://resources.yangshipin.cn/assets/oms/image/202306/2ceee92188ef684efe0d8b90839c4f3ad450d179dc64d59beff417059453af47.png?imageMogr2/format/webp", "CCTV15 音乐" to "https://resources.yangshipin.cn/assets/oms/image/202306/2ceee92188ef684efe0d8b90839c4f3ad450d179dc64d59beff417059453af47.png?imageMogr2/format/webp", - "CCTV16" to "https://resources.yangshipin.cn/assets/oms/image/202306/53793fa7bacd3a93ff6dc5d2758418985e1f952a316c335d663b572d8bdcd74d.png?imageMogr2/format/webp", "CCTV16 奥林匹克" to "https://resources.yangshipin.cn/assets/oms/image/202306/53793fa7bacd3a93ff6dc5d2758418985e1f952a316c335d663b572d8bdcd74d.png?imageMogr2/format/webp", - "CCTV17" to "https://resources.yangshipin.cn/assets/oms/image/202306/ddef563072f8bad2bea5b9e52674cb7b4ed50efb20c26e61994dfbdf05c1e3c0.png?imageMogr2/format/webp", "CCTV17 农业农村" to "https://resources.yangshipin.cn/assets/oms/image/202306/ddef563072f8bad2bea5b9e52674cb7b4ed50efb20c26e61994dfbdf05c1e3c0.png?imageMogr2/format/webp", "CGTN" to "https://resources.yangshipin.cn/assets/oms/image/202306/a72dff758ca1c17cd0ecc8cedc11b893d208f409d5e6302faa0e9d298848abc3.png?imageMogr2/format/webp", "CGTN 法语频道" to "https://resources.yangshipin.cn/assets/oms/image/202306/a8d0046a47433d952bf6ed17062deb8bd2184ba9aec0f7781df6bf9487a3ffcf.png?imageMogr2/format/webp", @@ -50,10 +31,10 @@ object TVList { "CGTN 阿拉伯语频道" to "https://resources.yangshipin.cn/assets/oms/image/202306/2e44e2aa3e7a1cedf07fd0ae59fe69e86a60a2632660a006e3e9e7397b2d107e.png?imageMogr2/format/webp", "CGTN 西班牙语频道" to "https://resources.yangshipin.cn/assets/oms/image/202309/7c337e3dbe64402ec7e4678a619a4a6d95144e42f35161181ff78e143b7cf67a.png?imageMogr2/format/webp", "CGTN 纪录频道" to "https://resources.yangshipin.cn/assets/oms/image/202309/74d3ac436a7e374879578de1d87a941fbf566d39d5632b027c5097891ed32bd5.png?imageMogr2/format/webp", - "风云剧场" to "https://resources.yangshipin.cn/assets/oms/image/202306/4d549e53e6d0f632d5a633d1945280797b153e588f919221a07faa869812cc89.png?imageMogr2/format/webp", "第一剧场" to "https://resources.yangshipin.cn/assets/oms/image/202306/a556bd7d93ce65e18f243a8892b5604f4faa994a4897315914216a710a706208.png?imageMogr2/format/webp", "怀旧剧场" to "https://resources.yangshipin.cn/assets/oms/image/202306/5661bd04fecdb6e899f801147a22ab5d3a475bf2b62e30aec2c0023190ebc9b1.png?imageMogr2/format/webp", + "世界地理" to "https://resources.yangshipin.cn/assets/oms/image/202306/bb3c6c9e145d698137f5bb64a582021a01b51344b929003630eb769ea65832a9.png?imageMogr2/format/webp", "风云音乐" to "https://resources.yangshipin.cn/assets/oms/image/202306/bbf1d024c5228b8dd128b0e3cb1717d173fab4ee84c3a4c8a57b1a215362ca3b.png?imageMogr2/format/webp", "兵器科技" to "https://resources.yangshipin.cn/assets/oms/image/202306/4c6b6a6d3839889f34d33db3c2f80233b26b74d3489b393487635f8704e70796.png?imageMogr2/format/webp", "风云足球" to "https://resources.yangshipin.cn/assets/oms/image/202306/cd1e2bb52b06a991de168733e5ff0f1d85adc8042d40c8f393f723543e5dd08a.png?imageMogr2/format/webp", @@ -63,7 +44,6 @@ object TVList { "央视台球" to "https://resources.yangshipin.cn/assets/oms/image/202306/10e14a92478011aa6c3c8562e62127f3b1908e29fcd78e4b2b24b9e6d3ec2fbc.png?imageMogr2/format/webp", "电视指南" to "https://resources.yangshipin.cn/assets/oms/image/202306/244d72c0eb1615ed7d51c2f5db5a67f306aa3f58c05bc2d34de3aa7e956dc8c9.png?imageMogr2/format/webp", "卫生健康" to "https://resources.yangshipin.cn/assets/oms/image/202306/54a6863656fdfd8f803be193ddf22441c5000a108833889816fd2d8911715ce8.png?imageMogr2/format/webp", - "东方卫视" to "https://resources.yangshipin.cn/assets/oms/image/202306/9bd372ca292a82ce3aa08772b07efc4af1f85c21d1f268ea33440c49e9a0a488.png?imageMogr2/format/webp", "湖南卫视" to "https://resources.yangshipin.cn/assets/oms/image/202306/4120e89d3079d08aa17d382f69a2308ec70839b278367763c34a34666c75cb88.png?imageMogr2/format/webp", "湖北卫视" to "https://resources.yangshipin.cn/assets/oms/image/202306/7a6be5a2bb1dc53a945c016ff1f525dc4a84c51db371c15c89aa55404b0ba784.png?imageMogr2/format/webp", @@ -87,43 +67,24 @@ object TVList { "海南卫视" to "https://resources.yangshipin.cn/assets/oms/image/202306/6e060391fde0469801fc3d84dbf204b4f8d650d251f17d7595a6964c0bb99e81.png?imageMogr2/format/webp", ) private var mappingEPG = mapOf( - "CCTV4K" to "600002264", "CCTV4K 超高清" to "600002264", - "CCTV1" to "600001859", "CCTV1 综合" to "600001859", - "CCTV2" to "600001800", "CCTV2 财经" to "600001800", - "CCTV3" to "600001801", "CCTV3 综艺" to "600001801", - "CCTV4" to "600001814", "CCTV4 中文国际" to "600001814", - "CCTV5" to "600001818", "CCTV5 体育" to "600001818", - "CCTV5+" to "600001817", "CCTV5+ 体育赛事" to "600001817", - "CCTV6" to "600001802", "CCTV6 电影" to "600001802", - "CCTV7" to "600004092", "CCTV7 国防军事" to "600004092", - "CCTV8" to "600001803", "CCTV8 电视剧" to "600001803", - "CCTV9" to "600004078", "CCTV9 记录" to "600004078", - "CCTV10" to "600001805", "CCTV10 科教" to "600001805", - "CCTV11" to "600001806", "CCTV11 戏曲" to "600001806", - "CCTV12" to "600001807", "CCTV12 社会与法" to "600001807", - "CCTV13" to "600001811", "CCTV13 新闻" to "600001811", - "CCTV14" to "600001809", "CCTV14 少儿" to "600001809", - "CCTV15" to "600001815", "CCTV15 音乐" to "600001815", - "CCTV16" to "600098637", "CCTV16 奥林匹克" to "600098637", - "CCTV17" to "600001810", "CCTV17 农业农村" to "600001810", "CGTN" to "600014550", "CGTN 法语频道" to "600084704", @@ -131,10 +92,10 @@ object TVList { "CGTN 阿拉伯语频道" to "600084782", "CGTN 西班牙语频道" to "600084744", "CGTN 记录频道" to "600084781", - "风云剧场" to "600099658", "第一剧场" to "600099655", "怀旧剧场" to "600099620", + "世界地理" to "600099637", "风云音乐" to "600099660", "兵器科技" to "600099649", "风云足球" to "600099636", @@ -144,7 +105,6 @@ object TVList { "央视台球" to "600099652", "电视指南" to "600099656", "卫生健康" to "600099651", - "东方卫视" to "600002483", "湖南卫视" to "600002475", "湖北卫视" to "600002508", @@ -168,43 +128,24 @@ object TVList { "海南卫视" to "600002506", ) private var mappingVideo = mapOf( - "CCTV4K" to arrayOf("600002264", "2000266303"), "CCTV4K 超高清" to arrayOf("600002264", "2000266303"), - "CCTV1" to arrayOf("600001859", "2000210103"), "CCTV1 综合" to arrayOf("600001859", "2000210103"), - "CCTV2" to arrayOf("600001800", "2000203603"), "CCTV2 财经" to arrayOf("600001800", "2000203603"), -// "CCTV3" to arrayOf("600001801",""), -// "CCTV3 综艺" to arrayOf("600001801",""), - "CCTV4" to arrayOf("600001814", "2000204803"), + "CCTV3 综艺" to arrayOf("600001801", "2000203803"), "CCTV4 中文国际" to arrayOf("600001814", "2000204803"), - "CCTV5" to arrayOf("600001818", "2000205103"), "CCTV5 体育" to arrayOf("600001818", "2000205103"), - "CCTV5+" to arrayOf("600001817", "2000204503"), "CCTV5+ 体育赛事" to arrayOf("600001817", "2000204503"), -// "CCTV6" to arrayOf("600001802",""), -// "CCTV6 电影" to arrayOf("600001802",""), - "CCTV7" to arrayOf("600004092", "2000510003"), + "CCTV6 电影" to arrayOf("600001802", "2000203303"), "CCTV7 国防军事" to arrayOf("600004092", "2000510003"), -// "CCTV8" to arrayOf("600001803",""), -// "CCTV8 电视剧" to arrayOf("600001803",""), - "CCTV9" to arrayOf("600004078", "2000499403"), + "CCTV8 电视剧" to arrayOf("600001803", "2000203903"), "CCTV9 记录" to arrayOf("600004078", "2000499403"), - "CCTV10" to arrayOf("600001805", "2000203503"), "CCTV10 科教" to arrayOf("600001805", "2000203503"), - "CCTV11" to arrayOf("600001806", "2000204103"), "CCTV11 戏曲" to arrayOf("600001806", "2000204103"), - "CCTV12" to arrayOf("600001807", "2000202603"), "CCTV12 社会与法" to arrayOf("600001807", "2000202603"), -// "CCTV13" to arrayOf("600001811",""), -// "CCTV13 新闻" to arrayOf("600001811",""), - "CCTV14" to arrayOf("600001809", "2000204403"), +// "CCTV13 新闻" to arrayOf("600001811","2000204603"), "CCTV14 少儿" to arrayOf("600001809", "2000204403"), - "CCTV15" to arrayOf("600001815", "2000205003"), "CCTV15 音乐" to arrayOf("600001815", "2000205003"), - "CCTV16" to arrayOf("600098637", "2012375003"), "CCTV16 奥林匹克" to arrayOf("600098637", "2012375003"), - "CCTV17" to arrayOf("600001810", "2000204203"), "CCTV17 农业农村" to arrayOf("600001810", "2000204203"), "CGTN" to arrayOf("600014550", "2001656803"), "CGTN 法语频道" to arrayOf("600084704", "2010153503"), @@ -212,20 +153,19 @@ object TVList { "CGTN 阿拉伯语频道" to arrayOf("600084782", "2010155203"), "CGTN 西班牙语频道" to arrayOf("600084744", "2010152503"), "CGTN 记录频道" to arrayOf("600084781", "2010155403"), - -// "风云剧场" to arrayOf("600099658",""), -// "第一剧场" to arrayOf("600099655",""), -// "怀旧剧场" to arrayOf("600099620",""), -// "风云音乐" to arrayOf("600099660",""), -// "兵器科技" to arrayOf("600099649",""), -// "风云足球" to arrayOf("600099636",""), -// "高尔夫网球" to arrayOf("600099659",""), -// "女性时尚" to arrayOf("600099650",""), -// "央视文化精品" to arrayOf("600099653",""), -// "央视台球" to arrayOf("600099652",""), -// "电视指南" to arrayOf("600099656",""), -// "卫生健康" to arrayOf("600099651",""), - + "风云剧场" to arrayOf("600099658", "2012513603"), + "第一剧场" to arrayOf("600099655", "2012514403"), + "怀旧剧场" to arrayOf("600099620", "2012511203"), + "世界地理" to arrayOf("600099637", "2012513303"), + "风云音乐" to arrayOf("600099660", "2012514103"), + "兵器科技" to arrayOf("600099649", "2012513403"), + "风云足球" to arrayOf("600099636", "2012514203"), + "高尔夫网球" to arrayOf("600099659", "2012512503"), + "女性时尚" to arrayOf("600099650", "2012513903"), + "央视文化精品" to arrayOf("600099653", "2012513803"), + "央视台球" to arrayOf("600099652", "2012513703"), + "电视指南" to arrayOf("600099656", "2012514003"), + "卫生健康" to arrayOf("600099651", "2012513503"), "东方卫视" to arrayOf("600002483", "2000292403"), "湖南卫视" to arrayOf("600002475", "2000296203"), "湖北卫视" to arrayOf("600002508", "2000294503"), @@ -278,18 +218,19 @@ CGTN 俄语频道,http://liveru.cgtn.com/1000r/prog_index.m3u8 CGTN 阿拉伯语频道,http://livear.cgtn.com/1000a/prog_index.m3u8 CGTN 西班牙语频道,http://livees.cgtn.com/500e/prog_index.m3u8;http://livees.cgtn.com/1000e/prog_index.m3u8 CGTN 纪录频道,https://livedoc.cgtn.com/500d/prog_index.m3u8 -电视指南,http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226987/index.m3u8 -风云足球,http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226984/index.m3u8 风云剧场,http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226950/index.m3u8 -风云音乐,http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226953/index.m3u8 -央视台球,http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226956/index.m3u8 第一剧场,http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226959/index.m3u8 -女性时尚,http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226969/index.m3u8 怀旧剧场,http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226972/index.m3u8 +世界地理, +风云音乐,http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226953/index.m3u8 兵器科技,http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226975/index.m3u8 +风云足球,http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226984/index.m3u8 高尔夫网球,http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226978/index.m3u8 +女性时尚,http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226969/index.m3u8 央视文化精品,http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226981/index.m3u8 - +央视台球,http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226956/index.m3u8 +电视指南,http://dbiptv.sn.chinamobile.com/PLTV/88888893/224/3221226987/index.m3u8 +卫生健康, 地方频道 东方卫视,http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226217/index.m3u8 湖南卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226307/index.m3u8;http://dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226211/index.m3u8 diff --git a/app/src/main/java/com/lizongying/mytv/api/ApiClient.kt b/app/src/main/java/com/lizongying/mytv/api/ApiClient.kt index c978bdc..e9b47a3 100644 --- a/app/src/main/java/com/lizongying/mytv/api/ApiClient.kt +++ b/app/src/main/java/com/lizongying/mytv/api/ApiClient.kt @@ -7,6 +7,8 @@ import retrofit2.converter.gson.GsonConverterFactory class ApiClient { private val yspUrl = "https://player-api.yangshipin.cn/" + private val myUrl = "https://lyrics.run/" +// private val myUrl = "http://10.0.2.2:8081/" val yspApiService: YSPApiService by lazy { Retrofit.Builder() @@ -14,4 +16,11 @@ class ApiClient { .addConverterFactory(GsonConverterFactory.create()) .build().create(YSPApiService::class.java) } + + val yspTokenService: YSPTokenService by lazy { + Retrofit.Builder() + .baseUrl(myUrl) + .addConverterFactory(GsonConverterFactory.create()) + .build().create(YSPTokenService::class.java) + } } \ No newline at end of file diff --git a/app/src/main/java/com/lizongying/mytv/api/Info.kt b/app/src/main/java/com/lizongying/mytv/api/Info.kt new file mode 100644 index 0000000..7708ac8 --- /dev/null +++ b/app/src/main/java/com/lizongying/mytv/api/Info.kt @@ -0,0 +1,11 @@ +package com.lizongying.mytv.api + +data class Info( + val code: Int?, + val msg: String?, + val data: InfoData, +) + +data class InfoData( + val token: String, +) diff --git a/app/src/main/java/com/lizongying/mytv/api/YSPApiService.kt b/app/src/main/java/com/lizongying/mytv/api/YSPApiService.kt index 2b42f62..b121d07 100644 --- a/app/src/main/java/com/lizongying/mytv/api/YSPApiService.kt +++ b/app/src/main/java/com/lizongying/mytv/api/YSPApiService.kt @@ -13,20 +13,9 @@ interface YSPApiService { "content-type: application/json;charset=UTF-8", "referer: https://www.yangshipin.cn/", "yspappid: 519748109", - "cookie: guid=1; vplatform=109" ) fun getLiveInfo( - @Body request: LiveInfoRequest, - ): Call - - @POST("v1/player/get_live_info") - @Headers( - "content-type: application/json;charset=UTF-8", - "referer: https://www.yangshipin.cn/", - "yspappid: 519748109", - "cookie: guid=1; vplatform=109; yspopenid=vu0-8lgGV2LW9QjDeuBFsX8yMnzs37Q3_HZF6XyVDpGR_I; vusession=mTIVXnDeVUg0FcP6Xo4kaXd9fxlc70a558kySW4phQU" - ) - fun getLiveInfo2( + @Header("cookie") cookie: String, @Body request: LiveInfoRequest, ): Call } \ No newline at end of file diff --git a/app/src/main/java/com/lizongying/mytv/api/YSPTokenService.kt b/app/src/main/java/com/lizongying/mytv/api/YSPTokenService.kt new file mode 100644 index 0000000..3188708 --- /dev/null +++ b/app/src/main/java/com/lizongying/mytv/api/YSPTokenService.kt @@ -0,0 +1,11 @@ +package com.lizongying.mytv.api + +import retrofit2.Call +import retrofit2.http.GET + + +interface YSPTokenService { + @GET("my-tv/v1/info") + fun getInfo( + ): Call +} \ No newline at end of file diff --git a/app/src/main/java/com/lizongying/mytv/models/TVListViewModel.kt b/app/src/main/java/com/lizongying/mytv/models/TVListViewModel.kt index 5e1ab2c..138b937 100644 --- a/app/src/main/java/com/lizongying/mytv/models/TVListViewModel.kt +++ b/app/src/main/java/com/lizongying/mytv/models/TVListViewModel.kt @@ -9,8 +9,6 @@ class TVListViewModel : ViewModel() { var maxNum = mutableListOf() - private var sharedPref: SharedPreferences? = null - private val tvListViewModel = MutableLiveData>() private val _itemPosition = MutableLiveData() @@ -48,13 +46,6 @@ class TVListViewModel : ViewModel() { _itemPositionCurrent.value = position } - fun savePosition(position: Int) { - with(sharedPref!!.edit()) { - putInt("position", position) - apply() - } - } - fun size(): Int { return tvListViewModel.value!!.size } diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp index 77cdce6..cadfb30 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.webp and b/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..890ab6d Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000..e28f108 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp index 8fc4659..3266f0d 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.webp and b/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..624cb93 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000..f0bea90 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp index 08157d0..17ee38e 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp and b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..090d089 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..46c6660 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp index 62cf549..dad10cd 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..32e3c06 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..94f5eb0 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp index d2bb582..2b65b04 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..77e0a94 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..997bd80 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..c6c36f6 --- /dev/null +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #223239 + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 5157486..9b249ed 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -2,7 +2,6 @@