From d3a94a3bada4c626aebf8b5599e584ec040ae365 Mon Sep 17 00:00:00 2001 From: yuyl <765782212@qq.com> Date: Tue, 13 May 2025 14:30:20 +0800 Subject: [PATCH] mireo 1.2.0 --- .../mireo/app/http/api/RevolutionsApi.kt | 11 ++ .../mireo/app/http/api/VideoDetailsApi.kt | 2 + .../mireo/app/http/bean/QualityBackClick.kt | 5 + .../mireo/app/http/bean/RevolutionBean.kt | 11 ++ .../mireo/app/http/bean/TranslatesBean.kt | 4 + .../localee/mireo/app/other/MsConstants.kt | 2 + .../app/other/MyFirebaseMessagingService.kt | 2 +- .../mireo/app/ui/activity/MyVipActivity.kt | 2 +- .../mireo/app/ui/activity/StoreActivity.kt | 4 +- .../app/ui/activity/VideoPlayActivity.kt | 158 ++++++++-------- .../mireo/app/ui/dialog/ActivateVipDialog.kt | 31 ++++ .../mireo/app/ui/dialog/DialogUtils.kt | 174 ++++++++++++++++++ .../mireo/app/ui/dialog/QualityDialog.kt | 30 +++ .../mireo/app/ui/fragment/ExploreFragment.kt | 1 + .../mireo/app/ui/fragment/MineFragment.kt | 15 +- .../videoPaly/ExampleRecommendPlayerView.kt | 24 +-- .../mireo/app/ui/videoPaly/VideoPlayerView.kt | 72 ++++---- app/src/main/res/layout/activity_my_vip.xml | 16 +- app/src/main/res/layout/activity_store.xml | 23 ++- .../main/res/layout/dialog_activate_vip.xml | 134 ++++++++++++++ app/src/main/res/layout/dialog_quality.xml | 126 +++++++++++++ app/src/main/res/layout/dialog_vip_splash.xml | 5 + .../main/res/layout/example_dialog_series.xml | 28 ++- .../main/res/layout/home_navigation_item.xml | 2 +- .../main/res/layout/item_home_critically.xml | 2 + app/src/main/res/layout/item_home_short.xml | 1 + app/src/main/res/layout/item_list_tab.xml | 1 + app/src/main/res/layout/item_search_girl.xml | 1 + app/src/main/res/layout/item_search_hot.xml | 2 + app/src/main/res/layout/mine_fragment.xml | 45 +++-- app/src/main/res/layout/tab_item_design.xml | 1 + app/src/main/res/layout/tips_dialog.xml | 1 + .../main/res/mipmap-xxhdpi/ic_login_tag.webp | Bin 0 -> 1384 bytes .../main/res/mipmap-xxhdpi/ic_vip_tag.webp | Bin 0 -> 1396 bytes .../res/mipmap-xxhdpi/iv_activate_vip.webp | Bin 0 -> 56532 bytes .../main/res/mipmap-xxhdpi/iv_me_order.webp | Bin 0 -> 2032 bytes common.gradle | 4 +- 37 files changed, 768 insertions(+), 172 deletions(-) create mode 100644 app/src/main/java/com/localee/mireo/app/http/api/RevolutionsApi.kt create mode 100644 app/src/main/java/com/localee/mireo/app/http/bean/QualityBackClick.kt create mode 100644 app/src/main/java/com/localee/mireo/app/http/bean/RevolutionBean.kt create mode 100644 app/src/main/java/com/localee/mireo/app/ui/dialog/ActivateVipDialog.kt create mode 100644 app/src/main/java/com/localee/mireo/app/ui/dialog/DialogUtils.kt create mode 100644 app/src/main/java/com/localee/mireo/app/ui/dialog/QualityDialog.kt create mode 100644 app/src/main/res/layout/dialog_activate_vip.xml create mode 100644 app/src/main/res/layout/dialog_quality.xml create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_login_tag.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_vip_tag.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/iv_activate_vip.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/iv_me_order.webp diff --git a/app/src/main/java/com/localee/mireo/app/http/api/RevolutionsApi.kt b/app/src/main/java/com/localee/mireo/app/http/api/RevolutionsApi.kt new file mode 100644 index 0000000..082db84 --- /dev/null +++ b/app/src/main/java/com/localee/mireo/app/http/api/RevolutionsApi.kt @@ -0,0 +1,11 @@ +package com.localee.mireo.app.http.api + +import com.hjq.http.config.IRequestApi + +class RevolutionsApi : IRequestApi { + + override fun getApi(): String { + return "getRevolutions" + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/localee/mireo/app/http/api/VideoDetailsApi.kt b/app/src/main/java/com/localee/mireo/app/http/api/VideoDetailsApi.kt index 9b23481..bfad92e 100644 --- a/app/src/main/java/com/localee/mireo/app/http/api/VideoDetailsApi.kt +++ b/app/src/main/java/com/localee/mireo/app/http/api/VideoDetailsApi.kt @@ -18,6 +18,8 @@ class VideoDetailsApi : IRequestApi { var activity_id: Int? = null + var revolution: String? = null + data class Bean( diff --git a/app/src/main/java/com/localee/mireo/app/http/bean/QualityBackClick.kt b/app/src/main/java/com/localee/mireo/app/http/bean/QualityBackClick.kt new file mode 100644 index 0000000..ac8984e --- /dev/null +++ b/app/src/main/java/com/localee/mireo/app/http/bean/QualityBackClick.kt @@ -0,0 +1,5 @@ +package com.localee.mireo.app.http.bean + +interface QualityBackClick { + fun qualityBackClick(quality: Int) +} \ No newline at end of file diff --git a/app/src/main/java/com/localee/mireo/app/http/bean/RevolutionBean.kt b/app/src/main/java/com/localee/mireo/app/http/bean/RevolutionBean.kt new file mode 100644 index 0000000..31e32d1 --- /dev/null +++ b/app/src/main/java/com/localee/mireo/app/http/bean/RevolutionBean.kt @@ -0,0 +1,11 @@ +package com.localee.mireo.app.http.bean + +class RevolutionBean( + val list: List +) { + data class RevolutionBeanItem( + val can_check: Boolean, + val condition: Int, + val value: Int + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/localee/mireo/app/http/bean/TranslatesBean.kt b/app/src/main/java/com/localee/mireo/app/http/bean/TranslatesBean.kt index 03a6f8e..29d4840 100644 --- a/app/src/main/java/com/localee/mireo/app/http/bean/TranslatesBean.kt +++ b/app/src/main/java/com/localee/mireo/app/http/bean/TranslatesBean.kt @@ -16,6 +16,10 @@ class TranslatesBean( ) data class Translates( + val mireo_order_record: String, + val mireo_activate_vip_content: String, + val mireo_activate_vip_title: String, + val mireo_quality: String, val mireo_unlock_vip: String, val mireo_vip_splash_tip: String, val mireo_vip_splash_title: String, diff --git a/app/src/main/java/com/localee/mireo/app/other/MsConstants.kt b/app/src/main/java/com/localee/mireo/app/other/MsConstants.kt index 2532a07..fb331cc 100644 --- a/app/src/main/java/com/localee/mireo/app/other/MsConstants.kt +++ b/app/src/main/java/com/localee/mireo/app/other/MsConstants.kt @@ -51,6 +51,8 @@ object MsConstants { const val CONSTANTS_short_play_id = "CONSTANTS_short_play_id" const val CONSTANTS_activity_id = "CONSTANTS_activity_id" const val CONSTANTS_stop_play = "CONSTANTS_stop_play" + const val CONSTANTS_pause_play = "CONSTANTS_pause_play" + const val CONSTANTS_start_play = "CONSTANTS_start_play" const val Constants_requestPermissions_photo = "Constants_requestPermissions_photo" const val CONSTANTS_auth_refresh = "CONSTANTS_auth_refresh" diff --git a/app/src/main/java/com/localee/mireo/app/other/MyFirebaseMessagingService.kt b/app/src/main/java/com/localee/mireo/app/other/MyFirebaseMessagingService.kt index d2f2060..7b59638 100644 --- a/app/src/main/java/com/localee/mireo/app/other/MyFirebaseMessagingService.kt +++ b/app/src/main/java/com/localee/mireo/app/other/MyFirebaseMessagingService.kt @@ -152,7 +152,7 @@ class MyFirebaseMessagingService : FirebaseMessagingService() { override fun onLoadFailed(errorDrawable: Drawable?) { super.onLoadFailed(errorDrawable) - + setNotification(intent, title, messageBody, null) } override fun onLoadCleared(placeholder: Drawable?) { diff --git a/app/src/main/java/com/localee/mireo/app/ui/activity/MyVipActivity.kt b/app/src/main/java/com/localee/mireo/app/ui/activity/MyVipActivity.kt index 991c600..8431f03 100644 --- a/app/src/main/java/com/localee/mireo/app/ui/activity/MyVipActivity.kt +++ b/app/src/main/java/com/localee/mireo/app/ui/activity/MyVipActivity.kt @@ -487,7 +487,6 @@ class MyVipActivity : AppActivity() { }) } - private fun getCustomerUser() { EasyHttp.get(this) .api(UserInfoApi()) @@ -496,6 +495,7 @@ class MyVipActivity : AppActivity() { result.getData()?.let { MsMMKVUtils.saveUserInfo(it) setUI() + finish() } } }) diff --git a/app/src/main/java/com/localee/mireo/app/ui/activity/StoreActivity.kt b/app/src/main/java/com/localee/mireo/app/ui/activity/StoreActivity.kt index b7d2a14..1a942b4 100644 --- a/app/src/main/java/com/localee/mireo/app/ui/activity/StoreActivity.kt +++ b/app/src/main/java/com/localee/mireo/app/ui/activity/StoreActivity.kt @@ -62,6 +62,7 @@ class StoreActivity : AppActivity() { private val tvBuy: TextView? by lazy { findViewById(R.id.tv_buy) } private val tvVipExpires: TextView? by lazy { findViewById(R.id.tv_vip_expires) } private val tvName: TextView? by lazy { findViewById(R.id.tv_name) } + private val tvCoinRecharge: TextView? by lazy { findViewById(R.id.tv_coin_recharge) } private val tvCoinsText: TextView? by lazy { findViewById(R.id.tv_coins_text) } private val tvMemberTitle: TextView? by lazy { findViewById(R.id.tv_member_title) } private val tvMembership: TextView? by lazy { findViewById(R.id.tv_membership) } @@ -97,6 +98,7 @@ class StoreActivity : AppActivity() { title?.setRightTitle(TranslatesUtils.translates()?.mireo_restore) tvName?.text = TranslatesUtils.translates()?.mireo_store_recharge_discount tvVipExpires?.text = TranslatesUtils.translates()?.mireo_store_limited + tvCoinRecharge?.text = TranslatesUtils.translates()?.mireo_coin_recharege tvCoinsText?.text = TranslatesUtils.translates()?.mireo_store_coins tvMemberTitle?.text = TranslatesUtils.translates()?.mireo_store_benefits tvMembership?.text = TranslatesUtils.translates()?.mireo_store_recharge @@ -110,7 +112,7 @@ class StoreActivity : AppActivity() { TranslatesUtils.translates()?.mireo_pay_hint ?: getString(R.string.store_tips), Html.FROM_HTML_MODE_COMPACT ) - }else{ + } else { tvHint?.text = Html.fromHtml( TranslatesUtils.translates()?.mireo_pay_hint ?: getString(R.string.store_tips) ) diff --git a/app/src/main/java/com/localee/mireo/app/ui/activity/VideoPlayActivity.kt b/app/src/main/java/com/localee/mireo/app/ui/activity/VideoPlayActivity.kt index 67c98a1..df8aa54 100644 --- a/app/src/main/java/com/localee/mireo/app/ui/activity/VideoPlayActivity.kt +++ b/app/src/main/java/com/localee/mireo/app/ui/activity/VideoPlayActivity.kt @@ -42,12 +42,15 @@ import com.localee.mireo.app.http.api.CreateHistoryApi import com.localee.mireo.app.http.api.DetailsRecommandApi import com.localee.mireo.app.http.api.DoBuyVideoApi import com.localee.mireo.app.http.api.ExampleRecommendDataRes +import com.localee.mireo.app.http.api.RevolutionsApi import com.localee.mireo.app.http.api.UploadHistorySecondsApi import com.localee.mireo.app.http.api.UserInfoApi import com.localee.mireo.app.http.api.UserInfoRes import com.localee.mireo.app.http.api.VideoDetailsApi import com.localee.mireo.app.http.bean.HomeDataHistoryBean import com.localee.mireo.app.http.bean.PaySettingsBean +import com.localee.mireo.app.http.bean.QualityBackClick +import com.localee.mireo.app.http.bean.RevolutionBean import com.localee.mireo.app.http.bean.UploadHistoryBean import com.localee.mireo.app.http.model.HttpData import com.localee.mireo.app.other.MsConstants @@ -58,6 +61,7 @@ import com.localee.mireo.app.other.MsConstants.CONSTANTS_short_play_id import com.localee.mireo.app.other.MsConstants.Constants_Episodes_Series_Data_currentPositionExample import com.localee.mireo.app.other.MsConstants.ExampleDetailCanPlay import com.localee.mireo.app.ui.adapter.RecommendBannerAdapter +import com.localee.mireo.app.ui.dialog.DialogUtils import com.localee.mireo.app.ui.fragment.RechargeDialogFragment import com.localee.mireo.app.ui.videoPaly.ExampleSeriesDialogFragment import com.localee.mireo.app.ui.videoPaly.ExampleUnFavoriteDialog @@ -100,8 +104,7 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle private var recommendAdapter: VideoPlayAdapter? = null private var data: ExampleRecommendDataRes.Data? = null private var revolution = - MsMMKVUtils.getMMKV().getInt(MsConstants.CONSTANTS_quality, 0).toString() - + MsMMKVUtils.getMMKV().getInt(MsConstants.CONSTANTS_quality, 540).toString() private val srRecommend: SmartRefreshLayout? by lazy { findViewById(R.id.sr_recommend) } private val viewPagerExampleRecommend: ViewPager2? by lazy { findViewById(R.id.viewPager_example_recommend) } @@ -218,7 +221,7 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle fun initialization() { if (NetworkUtils.isConnected()) { - getVideoDetails(shortPlayId, 0, activityId) + getVideoDetails(shortPlayId, 0, activityId, revolution) } else { if (TranslatesUtils.translates() != null) { @@ -235,7 +238,7 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle detailPlayerView()?.stop() detailPlayerView()?.release() } - getVideoDetails(shortPlayId, 0, activityId) + getVideoDetails(shortPlayId, 0, activityId, revolution) } else { if (TranslatesUtils.translates() != null) { ToastUtils.show(TranslatesUtils.translates()?.mireo_no_network.toString()) @@ -357,7 +360,7 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle ) ) { if (!first) { - getVideoDetails(shortPlayId, 0, activityId) + getVideoDetails(shortPlayId, 0, activityId, revolution) } else { first = false } @@ -385,7 +388,7 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle return@singleClick } currentPage = 1 - getVideoDetails(shortPlayId, 0, activityId) + getVideoDetails(shortPlayId, 0, activityId, revolution) } } tvExampleRetry?.setOnClickListener { @@ -399,7 +402,7 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle return@singleClick } currentPage = 1 - getVideoDetails(shortPlayId, 0, activityId) + getVideoDetails(shortPlayId, 0, activityId, revolution) } } } @@ -420,7 +423,7 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle detailPlayerView()?.stop() detailPlayerView()?.release() } - getVideoDetails(shortPlayId, 0, activityId) + getVideoDetails(shortPlayId, 0, activityId, revolution) qualityRefresh = false } else { detailPlayerView()?.play() @@ -436,19 +439,25 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle fun getVideoDetails( shortPlayId: Int?, videoId: Int?, - activityId: Int? + activityId: Int?, + mRevolution: String? ) { EasyHttp.get(this) .api(VideoDetailsApi().apply { - activity_id = activityId; - video_id = videoId; - short_play_id = shortPlayId; + activity_id = activityId + video_id = videoId + short_play_id = shortPlayId + revolution = mRevolution }) .request(object : HttpCallbackProxy>(this) { override fun onHttpSuccess(result: HttpData) { result.getData()?.let { if (it.episodeList.isNotEmpty()) { + it.revolution?.let { it1 -> + MsMMKVUtils.getMMKV() + .putInt(CONSTANTS_quality, it1) + } shortVideo = it.shortPlayInfo cover?.visibility = View.INVISIBLE viewPagerExampleRecommend?.visibility = View.VISIBLE @@ -461,7 +470,7 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle createHistory( it.episodeList[0].short_play_id, it.episodeList[0].short_play_video_id - ); + ) exampleNetwork?.visibility = View.INVISIBLE exampleEmpty?.visibility = View.INVISIBLE cover?.let { it1 -> @@ -493,10 +502,6 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle } }) -// ExampleRecommendRequest.getVideoDetails(current_page, page_size, revolution) -// .observeForever { result -> -// recommendLiveData.value = result.getOrNull() -// } } fun createHistory(videoId: Int, shortPlayId: Int) { @@ -705,7 +710,7 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle if (CONSTANTS_quality_refresh == event) { revolution = - MsMMKVUtils.getMMKV().getInt(MsConstants.CONSTANTS_quality, 0) + MsMMKVUtils.getMMKV().getInt(MsConstants.CONSTANTS_quality, 540) .toString() qualityRefresh = true } @@ -714,75 +719,35 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle handleCustomLogic() } if (CONSTANTS_quality == event) { - startActivity(SearchActivity::class.java) + if (episode?.is_lock == false) { + getRevolutions() + } } if (MsConstants.CONSTANTS_pay_refresh == event) { needRefresh = true getCustomerUser() } + if (MsConstants.CONSTANTS_user_refresh == event) { + revolution = "720" + MsMMKVUtils.getMMKV() + .putInt(CONSTANTS_quality, 720) + detailRefresh() + EventBus.getDefault().post(CONSTANTS_quality_refresh) + } + if (MsConstants.CONSTANTS_stop_play == event) { + recommendAdapter?.items?.get(currentPosition)?.let { + rechargeDialog(it) + } + viewLock?.postDelayed({ detailPlayerView()?.pause() }, 500) + } + if (MsConstants.CONSTANTS_pause_play == event) { + viewLock?.postDelayed({ detailPlayerView()?.pause() }, 500) + } + if (MsConstants.CONSTANTS_start_play == event) { + viewLock?.postDelayed({ detailPlayerView()?.play() }, 500) + } } - @Subscribe(threadMode = ThreadMode.MAIN) - fun onEvent(event: BaseEventBus) { -// if (MsConstants.Constants_Episodes_Series_DataExample == event.code) { -// if (recommendAdapter?.items?.get(currentPosition)?.name == event.data.name) { -// val imageView = -// detailPlayerView()?.findViewById(R.id.example_iv_collection_controller) -// val textview = -// detailPlayerView()?.findViewById(R.id.example_tv_collection_num_controller) -// imageView?.setImageResource(if (event.data.is_collect) R.mipmap.iv_example_collection_h else R.mipmap.iv_example_collection_n) -// recommendAdapter?.items?.get(currentPosition)?.collect_total = -// event.data.collect_total -// recommendAdapter?.items?.get(currentPosition)?.is_collect = -// event.data.is_collect -// textview?.text = formatNumber(event.data.collect_total) -// } -// } - } - -// override fun collection(dataRes: ExampleRecommendDataRes.Data) { -// singleClick { -// data = dataRes -// if (dataRes.is_collect) { -// val exampleUnFavoriteDialog = ExampleUnFavoriteDialog(this) -// val tvThinkAgain = -// exampleUnFavoriteDialog.findViewById(R.id.example_tv_think_again) -// val tvUnfavorite = -// exampleUnFavoriteDialog.findViewById(R.id.example_tv_unfavorite) -// val tvTitle = -// exampleUnFavoriteDialog.findViewById(R.id.example_tv_title) -// val tvContent = -// exampleUnFavoriteDialog.findViewById(R.id.example_tv_content) -// if (TranslatesUtils.translates() != null) { -// tvThinkAgain.text = TranslatesUtils.translates()?.mireo_try_again -// tvUnfavorite.text = TranslatesUtils.translates()?.mireo_unfavorite -// tvTitle.text = TranslatesUtils.translates()?.mireo_unfavorite -// tvContent.text = TranslatesUtils.translates()?.mireo_not_collect_warning -// } -// tvThinkAgain.setOnClickListener { exampleUnFavoriteDialog.dismiss() } -// tvUnfavorite.setOnClickListener { -// dataRes.video_info?.short_play_id?.let { -// dataRes.video_info.short_play_video_id.let { it1 -> -// doCancelCollect( -// it, it1 -// ) -// } -// } -// exampleUnFavoriteDialog.dismiss() -// } -// exampleUnFavoriteDialog.show() -// } else { -// dataRes.video_info?.short_play_id?.let { -// dataRes.video_info.short_play_video_id.let { it1 -> -// doCollect( -// it, it1 -// ) -// } -// } -// } -// } -// } - override fun collection(episode: VideoDetailsApi.Bean.Episode) { singleClick { if (shortVideo?.is_collect == true) { @@ -946,6 +911,36 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle }) } + fun getRevolutions() { + EasyHttp.get(this) + .api(RevolutionsApi()) + .request(object : HttpCallbackProxy>(this) { + override fun onHttpSuccess(result: HttpData) { + result.getData()?.let { + setQuality(it) + } ?: kotlin.run { + if (TranslatesUtils.translates() != null) { + toast(TranslatesUtils.translates()?.mireo_network_error.toString()) + } else { + toast(getString(R.string.example_service_exception_please_try_again)) + } + } + } + }) + } + + private fun setQuality(revolutionRes: RevolutionBean) { + DialogUtils.showQuality(this, object : QualityBackClick { + override fun qualityBackClick(quality: Int) { + MsMMKVUtils.getMMKV() + .putInt(CONSTANTS_quality, quality) + EventBus.getDefault().post(CONSTANTS_quality_refresh) + revolution = quality.toString() + detailRefresh() + } + }, revolutionRes) + } + private fun detailRefresh() { detailPlayerView()?.pause() detailPlayerView()?.stop() @@ -955,6 +950,7 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle it1.short_play_id, it1.short_play_video_id, activityId, + revolution ) } } @@ -1123,7 +1119,7 @@ open class VideoPlayActivity : AppActivity(), VideoPlayAdapter.PlayerDetailColle if (short_play_id != null) { shortPlayId = short_play_id } - getVideoDetails(shortPlayId, 0, activityId) + getVideoDetails(shortPlayId, 0, activityId, revolution) } }, 300) viewVideoRecommend?.visibility = View.INVISIBLE diff --git a/app/src/main/java/com/localee/mireo/app/ui/dialog/ActivateVipDialog.kt b/app/src/main/java/com/localee/mireo/app/ui/dialog/ActivateVipDialog.kt new file mode 100644 index 0000000..82c5a29 --- /dev/null +++ b/app/src/main/java/com/localee/mireo/app/ui/dialog/ActivateVipDialog.kt @@ -0,0 +1,31 @@ +package com.localee.mireo.app.ui.dialog + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.view.Gravity +import android.view.Window +import android.view.WindowManager +import com.localee.mireo.shortapp.R + +class ActivateVipDialog (context: Context) : Dialog(context) { + + init { + init() + } + + private fun init() { + requestWindowFeature(Window.FEATURE_NO_TITLE) + setContentView(R.layout.dialog_activate_vip) + + window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window?.setLayout( + WindowManager.LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.WRAP_CONTENT + ) + window?.setGravity(Gravity.CENTER) + setCancelable(true) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/localee/mireo/app/ui/dialog/DialogUtils.kt b/app/src/main/java/com/localee/mireo/app/ui/dialog/DialogUtils.kt new file mode 100644 index 0000000..30862db --- /dev/null +++ b/app/src/main/java/com/localee/mireo/app/ui/dialog/DialogUtils.kt @@ -0,0 +1,174 @@ +package com.localee.mireo.app.ui.dialog + +import android.content.Context +import android.content.Intent +import android.graphics.Color +import androidx.appcompat.widget.AppCompatImageView +import androidx.appcompat.widget.AppCompatTextView +import com.hjq.shape.view.ShapeTextView +import com.localee.mireo.app.http.bean.QualityBackClick +import com.localee.mireo.app.http.bean.RevolutionBean +import com.localee.mireo.app.other.MsConstants +import com.localee.mireo.app.ui.activity.HomeActivity +import com.localee.mireo.app.utils.MsMMKVUtils +import com.localee.mireo.app.utils.TranslatesUtils +import com.localee.mireo.shortapp.R +import org.greenrobot.eventbus.EventBus + +object DialogUtils { + + fun showQuality( + context: Context, + qualityBack: QualityBackClick?, + revolutionRes: RevolutionBean? + ) { + val size = revolutionRes?.list?.size ?: 0 + val exampleQualityDialog = QualityDialog(context) + val tv_quality = + exampleQualityDialog.findViewById(R.id.tv_quality) + val tv_quality_info_480 = + exampleQualityDialog.findViewById(R.id.tv_quality_480) + val tv_quality_info_720 = + exampleQualityDialog.findViewById(R.id.tv_quality_720) + val tv_quality_info_1080 = + exampleQualityDialog.findViewById(R.id.tv_quality_1080) + val iv_login_tag = exampleQualityDialog.findViewById(R.id.iv_login_tag) + val iv_vip_tag = exampleQualityDialog.findViewById(R.id.iv_vip_tag) + val int = MsMMKVUtils.getMMKV().getInt(MsConstants.CONSTANTS_quality, 0) + if (size > 0 && null != revolutionRes?.list?.get(0)) { + val revolution = revolutionRes.list[0] + tv_quality_info_480.text = revolution.value.toString().plus("p") + if (revolution.can_check) { + if (int == revolution.value) { + tv_quality_info_480.shapeDrawableBuilder?.setStrokeSize(1) + ?.intoBackground() + tv_quality_info_480.setTextColor(Color.parseColor("#F56490")) + } else { + tv_quality_info_480.shapeDrawableBuilder?.setStrokeSize(0) + ?.intoBackground() + tv_quality_info_480.setTextColor(Color.parseColor("#FFFFFF")) + } + tv_quality_info_480.setOnClickListener { + if (int != revolution.value) { + qualityBack?.qualityBackClick(revolution.value) + exampleQualityDialog.dismiss() + } + } + } else { + tv_quality_info_480.shapeDrawableBuilder?.setStrokeSize(0) + ?.intoBackground() + tv_quality_info_480.setTextColor(Color.parseColor("#8B8B8B")) + } + } + if (size > 1 && null != revolutionRes?.list?.get(1)) { + val revolution = revolutionRes.list[1] + tv_quality_info_720.text = revolution.value.toString().plus("p") + if (revolution.can_check) { + if (int == revolution.value) { + tv_quality_info_720.shapeDrawableBuilder?.setStrokeSize(1) + ?.intoBackground() + tv_quality_info_720.setTextColor(Color.parseColor("#F56490")) + } else { + tv_quality_info_720.shapeDrawableBuilder?.setStrokeSize(0) + ?.intoBackground() + tv_quality_info_720.setTextColor(Color.parseColor("#FFFFFF")) + } + iv_login_tag.setImageResource(R.mipmap.ic_login_tag) + tv_quality_info_720.setOnClickListener { + if (int != revolution.value) { + qualityBack?.qualityBackClick(revolution.value) + exampleQualityDialog.dismiss() + } + } + } else { + tv_quality_info_720.shapeDrawableBuilder?.setStrokeSize(0) + ?.intoBackground() + tv_quality_info_720.setTextColor(Color.parseColor("#8B8B8B")) + iv_login_tag.setImageResource(R.mipmap.ic_login_tag) + tv_quality_info_720.setOnClickListener { + context.startActivity( + Intent( + context, + HomeActivity::class.java + ) + ) + EventBus.getDefault().post(MsConstants.CONSTANTS_Login) + exampleQualityDialog.dismiss() + } + } + } + + if (size > 2 && null != revolutionRes?.list?.get(2)) { + val revolution = revolutionRes.list[2] + tv_quality_info_1080.text = revolution.value.toString().plus("p") + if (revolution.can_check) { + if (int == revolution.value) { + tv_quality_info_1080.shapeDrawableBuilder?.setStrokeSize(1) + ?.intoBackground() + tv_quality_info_1080.setTextColor(Color.parseColor("#F56490")) + } else { + tv_quality_info_1080.shapeDrawableBuilder?.setStrokeSize(0) + ?.intoBackground() + tv_quality_info_1080.setTextColor(Color.parseColor("#FFFFFF")) + } + tv_quality_info_1080.setOnClickListener { + if (int != revolution.value) { + qualityBack?.qualityBackClick(revolution.value) + exampleQualityDialog.dismiss() + } + } + iv_vip_tag.setImageResource(R.mipmap.ic_vip_tag) + } else { + tv_quality_info_1080.shapeDrawableBuilder?.setStrokeSize(0) + ?.intoBackground() + iv_vip_tag.setImageResource(R.mipmap.ic_vip_tag) + tv_quality_info_1080.setTextColor(Color.parseColor("#8B8B8B")) + tv_quality_info_1080.setOnClickListener { + EventBus.getDefault() + .post(MsConstants.CONSTANTS_pause_play) + showActivate(context) + exampleQualityDialog.dismiss() + } + } + } + tv_quality?.text = + TranslatesUtils.translates()?.mireo_quality + ?: "Playback Quality" + exampleQualityDialog.show() + } + + private fun showActivate(context: Context) { + val activateVIPDialog = ActivateVipDialog(context) + val tv_title = + activateVIPDialog.findViewById(R.id.tv_title) + val tv_content = + activateVIPDialog.findViewById(R.id.tv_content) + val iv_close_vip = + activateVIPDialog.findViewById(R.id.iv_close_vip) + val tv_later = + activateVIPDialog.findViewById(R.id.tv_later) + val tv_open = + activateVIPDialog.findViewById(R.id.tv_open) + tv_title?.text = + TranslatesUtils.translates()?.mireo_activate_vip_title + ?: "Unlock HD VIP Access!" + tv_content?.text = + TranslatesUtils.translates()?.mireo_activate_vip_content + ?: "Activate vip and enjoy HD video privileges" + tv_later?.text = TranslatesUtils.translates()?.mireo_open_notification_later ?: "Later" + tv_open?.text = TranslatesUtils.translates()?.mireo_open_notification_open ?: "Open" + tv_open?.setOnClickListener { + EventBus.getDefault() + .post(MsConstants.CONSTANTS_stop_play) + activateVIPDialog.dismiss() + } + tv_later?.setOnClickListener { + EventBus.getDefault() + .post(MsConstants.CONSTANTS_start_play) + activateVIPDialog.dismiss() + } + iv_close_vip?.setOnClickListener { activateVIPDialog.dismiss() } + activateVIPDialog.show() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/localee/mireo/app/ui/dialog/QualityDialog.kt b/app/src/main/java/com/localee/mireo/app/ui/dialog/QualityDialog.kt new file mode 100644 index 0000000..5373791 --- /dev/null +++ b/app/src/main/java/com/localee/mireo/app/ui/dialog/QualityDialog.kt @@ -0,0 +1,30 @@ +package com.localee.mireo.app.ui.dialog + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.view.Gravity +import android.view.Window +import android.view.WindowManager +import com.localee.mireo.shortapp.R + +class QualityDialog(context: Context) : Dialog(context) { + + init { + init() + } + + private fun init() { + requestWindowFeature(Window.FEATURE_NO_TITLE) + setContentView(R.layout.dialog_quality) + + window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window?.setLayout( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.WRAP_CONTENT + ) + window?.setGravity(Gravity.BOTTOM) + setCancelable(true) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/localee/mireo/app/ui/fragment/ExploreFragment.kt b/app/src/main/java/com/localee/mireo/app/ui/fragment/ExploreFragment.kt index a2cbb5c..0e56bd6 100644 --- a/app/src/main/java/com/localee/mireo/app/ui/fragment/ExploreFragment.kt +++ b/app/src/main/java/com/localee/mireo/app/ui/fragment/ExploreFragment.kt @@ -437,6 +437,7 @@ class ExploreFragment : TitleBarFragment(), .toString() qualityRefresh = true } + } @Subscribe(threadMode = ThreadMode.MAIN) diff --git a/app/src/main/java/com/localee/mireo/app/ui/fragment/MineFragment.kt b/app/src/main/java/com/localee/mireo/app/ui/fragment/MineFragment.kt index 2c9d60d..234a63a 100644 --- a/app/src/main/java/com/localee/mireo/app/ui/fragment/MineFragment.kt +++ b/app/src/main/java/com/localee/mireo/app/ui/fragment/MineFragment.kt @@ -77,6 +77,7 @@ class MineFragment : TitleBarFragment(), OnRefreshLoadMoreListener private val sbAbout: SettingBar? by lazy { findViewById(R.id.sb_about) } private val sbFeedback: SettingBar? by lazy { findViewById(R.id.sb_feedback) } private val sbLanguage: SettingBar? by lazy { findViewById(R.id.sb_language) } + private val sbOrder: SettingBar? by lazy { findViewById(R.id.sb_order) } private var vipSplashDialog: VipSplashDialog? = null private var bind: DialogVipSplashBinding? = null private var isVipSplash = false @@ -109,7 +110,8 @@ class MineFragment : TitleBarFragment(), OnRefreshLoadMoreListener R.id.ll_wallet, R.id.ll_vip, R.id.ll_store, - R.id.tv_login + R.id.tv_login, + R.id.sb_order ) recyclerView?.layoutManager = @@ -149,6 +151,7 @@ class MineFragment : TitleBarFragment(), OnRefreshLoadMoreListener sbAbout?.setLeftText(TranslatesUtils.translates()?.mireo_about_us) sbFeedback?.setLeftText(TranslatesUtils.translates()?.mireo_feedback) sbLanguage?.setLeftText(TranslatesUtils.translates()?.mireo_choose_language) + sbOrder?.setLeftText(TranslatesUtils.translates()?.mireo_order_record) } if (MsMMKVUtils.isTourist()) { @@ -279,7 +282,7 @@ class MineFragment : TitleBarFragment(), OnRefreshLoadMoreListener startActivity(LanguageSwitchActivity::class.java) } - R.id.ll_wallet -> { + R.id.ll_wallet, R.id.sb_order -> { startActivity(MyWalletActivity::class.java) } @@ -343,17 +346,23 @@ class MineFragment : TitleBarFragment(), OnRefreshLoadMoreListener bind?.tvVipBenefits?.text = TranslatesUtils.translates()?.mireo_unlock_vip bind?.ivClose?.setOnClickListener { + MsMMKVUtils.getMMKV().putLong( + MsConstants.CONSTANTS_PREF_LAST_POPUP_TIME_VIP, + System.currentTimeMillis() + ) vipSplashDialog?.dismiss() isVipSplash = false + System.gc() } bind?.tvVipBenefits?.setOnClickListener { MsMMKVUtils.getMMKV().putLong( MsConstants.CONSTANTS_PREF_LAST_POPUP_TIME_VIP, System.currentTimeMillis() ) - startActivity(StoreActivity::class.java) + startActivity(MyVipActivity::class.java) vipSplashDialog?.dismiss() isVipSplash = false + System.gc() } vipSplashDialog?.show() isVipSplash = true diff --git a/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleRecommendPlayerView.kt b/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleRecommendPlayerView.kt index 1dc2404..91e9afc 100644 --- a/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleRecommendPlayerView.kt +++ b/app/src/main/java/com/localee/mireo/app/ui/videoPaly/ExampleRecommendPlayerView.kt @@ -229,21 +229,21 @@ class ExampleRecommendPlayerView(context: Context, attrs: AttributeSet?) : ivCover?.visibility = View.VISIBLE MsConstants.Exampleready = false exampleTvTitlePlayerController?.text = dataRes.name - if (TranslatesUtils.translates() != null) { - exampleTvEpisodePlayerController?.text = TranslatesUtils.replace( - TranslatesUtils.translates()?.mireo_episode_set.toString(), - dataRes.video_info.episode.toString() - ).plus(" / ").plus( - TranslatesUtils.replace( - TranslatesUtils.translates()?.mireo_complete_episode.toString(), - dataRes.episode_total.toString() - ) - ) - } else { +// if (TranslatesUtils.translates() != null) { +// exampleTvEpisodePlayerController?.text = TranslatesUtils.replace( +// TranslatesUtils.translates()?.mireo_episode_set.toString(), +// dataRes.video_info.episode.toString() +// ).plus(" / ").plus( +// TranslatesUtils.replace( +// TranslatesUtils.translates()?.mireo_complete_episode.toString(), +// dataRes.episode_total.toString() +// ) +// ) +// } else { exampleTvEpisodePlayerController?.text = "EP.".plus(dataRes.video_info.episode).plus(" / EP.") .plus(dataRes.episode_total) - } +// } exampleTvCollectionNumController?.text = dataRes.collect_total?.let { formatNumber(it) } exampleTvCollectionNumController?.setTextColor( if (dataRes.is_collect) resources.getColor( diff --git a/app/src/main/java/com/localee/mireo/app/ui/videoPaly/VideoPlayerView.kt b/app/src/main/java/com/localee/mireo/app/ui/videoPaly/VideoPlayerView.kt index e9fffd8..6c67a5d 100644 --- a/app/src/main/java/com/localee/mireo/app/ui/videoPaly/VideoPlayerView.kt +++ b/app/src/main/java/com/localee/mireo/app/ui/videoPaly/VideoPlayerView.kt @@ -54,11 +54,11 @@ class VideoPlayerView(context: Context, attrs: AttributeSet?) : private var player: ExoPlayer? = builder.build() private val viewLifecycleScope = MainScope() private var isDragging = false - private var exampleSeekbarPlayerController: AppCompatSeekBar? = null + private var seekbarPlayerController: AppCompatSeekBar? = null private var exampleProgressJob: Job? = null - private var exampleIvPlayPlayerController: AppCompatImageView? = null - private var exampleIvCollectionController: AppCompatImageView? = null - private var exampleIvBackController: AppCompatImageView? = null + private var ivPlayPlayerController: AppCompatImageView? = null + private var ivCollectionController: AppCompatImageView? = null + private var ivBackController: AppCompatImageView? = null private var ivCover: AppCompatImageView? = null private var exampleTvEpisodePlayerController: ShapeTextView? = null private var ivEpisodePlayerController: AppCompatImageView? = null @@ -80,13 +80,13 @@ class VideoPlayerView(context: Context, attrs: AttributeSet?) : .inflate(R.layout.example_detail_player_view, this, true) val exampleDetailPlayerViewBinding = ExampleDetailPlayerViewBinding.bind(inflate) exampleDetailPlayerViewBinding.playerView.player = player - exampleSeekbarPlayerController = + seekbarPlayerController = exampleDetailPlayerViewBinding.playerView.findViewById(R.id.example_seekBar_player_controller) - exampleIvPlayPlayerController = + ivPlayPlayerController = exampleDetailPlayerViewBinding.playerView.findViewById(R.id.example_iv_play_player_controller) - exampleIvCollectionController = + ivCollectionController = exampleDetailPlayerViewBinding.playerView.findViewById(R.id.example_iv_collection_controller) - exampleIvBackController = + ivBackController = exampleDetailPlayerViewBinding.playerView.findViewById(R.id.example_iv_back_controller) ivCover = exampleDetailPlayerViewBinding.playerView.findViewById(R.id.iv_cover_detail) tvExampleSeries = @@ -119,7 +119,7 @@ class VideoPlayerView(context: Context, attrs: AttributeSet?) : } Player.STATE_READY -> { - exampleIvPlayPlayerController?.isEnabled = true + ivPlayPlayerController?.isEnabled = true if (ExampleDetailCanPlay && !ExampleLock) { if (seek && progress > 0) { player?.seekTo(progress) @@ -139,7 +139,7 @@ class VideoPlayerView(context: Context, attrs: AttributeSet?) : } Player.STATE_IDLE -> { - exampleIvPlayPlayerController?.isEnabled = false + ivPlayPlayerController?.isEnabled = false } } } @@ -150,7 +150,7 @@ class VideoPlayerView(context: Context, attrs: AttributeSet?) : loadingLine?.visibility = View.INVISIBLE } }) - exampleIvPlayPlayerController?.setOnClickListener { + ivPlayPlayerController?.setOnClickListener { if (!ExampleLock) { if (MsConstants.ExampleDetailPlaying) { pause() @@ -181,21 +181,21 @@ class VideoPlayerView(context: Context, attrs: AttributeSet?) : private fun setProgress() { exampleProgressJob?.cancel() val duration = player!!.duration - exampleSeekbarPlayerController?.max = duration.toInt() - exampleSeekbarPlayerController?.progress = player!!.currentPosition.toInt() - exampleSeekbarPlayerController?.setOnSeekBarChangeListener(null) + seekbarPlayerController?.max = duration.toInt() + seekbarPlayerController?.progress = player!!.currentPosition.toInt() + seekbarPlayerController?.setOnSeekBarChangeListener(null) exampleProgressJob = viewLifecycleScope.launch { while (isActive) { if (!isDragging) { withContext(Dispatchers.Main) { - exampleSeekbarPlayerController?.progress = player!!.currentPosition.toInt() + seekbarPlayerController?.progress = player!!.currentPosition.toInt() } } delay(1000) } } - exampleSeekbarPlayerController?.setOnSeekBarChangeListener(object : + seekbarPlayerController?.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { if (fromUser) { @@ -222,14 +222,14 @@ class VideoPlayerView(context: Context, attrs: AttributeSet?) : fun play() { player?.play() - exampleIvPlayPlayerController?.setImageResource(R.mipmap.iv_example_stop) + ivPlayPlayerController?.setImageResource(R.mipmap.iv_example_stop) MsConstants.ExampleDetailPlaying = true isDragging = false } fun pause() { player?.pause() - exampleIvPlayPlayerController?.setImageResource(R.mipmap.iv_example_play) + ivPlayPlayerController?.setImageResource(R.mipmap.iv_example_play) MsConstants.ExampleDetailPlaying = false isDragging = true } @@ -282,23 +282,23 @@ class VideoPlayerView(context: Context, attrs: AttributeSet?) : seek = true ivCover?.visibility = View.VISIBLE exampleTvTitlePlayerController?.text = shortVideo.name - if (TranslatesUtils.translates() != null) { - exampleTvEpisodePlayerController?.text = TranslatesUtils.replace( - TranslatesUtils.translates()?.mireo_episode_set.toString(), - episode.episode.toString() - ).plus(" / ").plus( - TranslatesUtils.replace( - TranslatesUtils.translates()?.mireo_complete_episode.toString(), - shortVideo.episode_total.toString() - ) - ) -// tvExampleSeries?.text = TranslatesUtils.translates()?.recommand_series - } else { +// if (TranslatesUtils.translates() != null) { +// exampleTvEpisodePlayerController?.text = TranslatesUtils.replace( +// TranslatesUtils.translates()?.mireo_episode_set.toString(), +// episode.episode.toString() +// ).plus(" / ").plus( +// TranslatesUtils.replace( +// TranslatesUtils.translates()?.mireo_complete_episode.toString(), +// shortVideo.episode_total.toString() +// ) +// ) +//// tvExampleSeries?.text = TranslatesUtils.translates()?.recommand_series +// } else { exampleTvEpisodePlayerController?.text = "EP.".plus(episode.episode).plus(" / EP.") .plus(shortVideo.episode_total) // tvExampleSeries?.text = context.getString(R.string.example_series) - } +// } exampleTvDesPlayerController?.text = shortVideo.description exampleTvCollectionNumController?.text = formatNumber(shortVideo.collect_total) exampleTvCollectionNumController?.setTextColor( @@ -306,7 +306,7 @@ class VideoPlayerView(context: Context, attrs: AttributeSet?) : R.color.example_color_F56490 ) else resources.getColor(R.color.white) ) - exampleIvCollectionController?.setImageResource(if (shortVideo.is_collect) R.mipmap.iv_example_collection_h else R.mipmap.iv_example_collection_n) + ivCollectionController?.setImageResource(if (shortVideo.is_collect) R.mipmap.iv_example_collection_h else R.mipmap.iv_example_collection_n) player?.setMediaSource(buildMediaSource(episode.video_url)) player?.prepare() exampleTvEpisodePlayerController?.setOnClickListener { @@ -316,12 +316,10 @@ class VideoPlayerView(context: Context, attrs: AttributeSet?) : } } ivEpisodePlayerController?.setOnClickListener { - if (!episode.is_lock) { - EventBus.getDefault() - .post(MsConstants.Constants_RecommendPlayerView_DramaSeriesExample) - } + EventBus.getDefault() + .post(MsConstants.CONSTANTS_quality) } - exampleIvBackController?.setOnClickListener { + ivBackController?.setOnClickListener { EventBus.getDefault() .post(MsConstants.Constants_RecommendPlayerView_CLOSEExample) } diff --git a/app/src/main/res/layout/activity_my_vip.xml b/app/src/main/res/layout/activity_my_vip.xml index af50aaa..0a3ac5f 100644 --- a/app/src/main/res/layout/activity_my_vip.xml +++ b/app/src/main/res/layout/activity_my_vip.xml @@ -182,8 +182,9 @@ android:layout_marginTop="@dimen/dp_15" android:drawableTop="@mipmap/ic_vip_no_ads" android:drawablePadding="@dimen/dp_8" - android:maxLines="2" + android:ellipsize="end" android:gravity="center_horizontal" + android:maxLines="2" android:text="Ad-FreeStreaming" android:textColor="#c4c4c4" android:textSize="@dimen/sp_12" @@ -195,10 +196,11 @@ android:id="@+id/tv_member_2" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginHorizontal="@dimen/dp_8" android:layout_marginTop="@dimen/dp_15" android:drawableTop="@mipmap/ic_vip_free" android:drawablePadding="@dimen/dp_8" - android:layout_marginHorizontal="@dimen/dp_8" + android:ellipsize="end" android:gravity="center_horizontal" android:maxLines="2" android:text="Exclusive Episodes" @@ -212,13 +214,14 @@ android:id="@+id/tv_member_3" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginHorizontal="@dimen/dp_8" android:layout_marginTop="@dimen/dp_15" android:drawableTop="@mipmap/ic_vip_exclusive" android:drawablePadding="@dimen/dp_8" + android:ellipsize="end" android:gravity="center_horizontal" - android:text="Daily free coins" android:maxLines="2" - android:layout_marginHorizontal="@dimen/dp_8" + android:text="Daily free coins" android:textColor="#c4c4c4" android:textSize="@dimen/sp_12" app:layout_constraintEnd_toStartOf="@+id/tv_member_4" @@ -229,13 +232,14 @@ android:id="@+id/tv_member_4" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginHorizontal="@dimen/dp_8" android:layout_marginTop="@dimen/dp_15" android:drawableTop="@mipmap/ic_vip_only_coupons" android:drawablePadding="@dimen/dp_8" + android:ellipsize="end" android:gravity="center_horizontal" - android:text="VIP-Only Coupons" - android:layout_marginHorizontal="@dimen/dp_8" android:maxLines="2" + android:text="VIP-Only Coupons" android:textColor="#c4c4c4" android:textSize="@dimen/sp_12" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/activity_store.xml b/app/src/main/res/layout/activity_store.xml index d1237c9..5edda8f 100644 --- a/app/src/main/res/layout/activity_store.xml +++ b/app/src/main/res/layout/activity_store.xml @@ -120,15 +120,28 @@ app:layout_constraintTop_toTopOf="@+id/iv_right_coin" /> + + - + app:layout_constraintTop_toBottomOf="@+id/tv_coin_recharge" /> + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_quality.xml b/app/src/main/res/layout/dialog_quality.xml new file mode 100644 index 0000000..3ab0c5a --- /dev/null +++ b/app/src/main/res/layout/dialog_quality.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_vip_splash.xml b/app/src/main/res/layout/dialog_vip_splash.xml index 3e7c8a7..7fa582b 100644 --- a/app/src/main/res/layout/dialog_vip_splash.xml +++ b/app/src/main/res/layout/dialog_vip_splash.xml @@ -25,6 +25,7 @@ android:text="Go Premium Elevate Your Binge!" android:textColor="#712B2B" android:maxLines="2" + android:ellipsize="end" android:textSize="@dimen/sp_17" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -53,6 +54,7 @@ android:drawablePadding="@dimen/dp_2" android:gravity="center_horizontal" android:maxLines="2" + android:ellipsize="end" android:text="Ad-FreeStreaming" android:textColor="#712B2B" android:textSize="@dimen/sp_11" @@ -70,6 +72,7 @@ android:drawablePadding="@dimen/dp_2" android:gravity="center_horizontal" android:maxLines="2" + android:ellipsize="end" android:text="Exclusive Episodes" android:textColor="#712B2B" android:textSize="@dimen/sp_11" @@ -87,6 +90,7 @@ android:drawablePadding="@dimen/dp_2" android:gravity="center_horizontal" android:maxLines="2" + android:ellipsize="end" android:text="Daily free coins" android:textColor="#712B2B" android:textSize="@dimen/sp_11" @@ -105,6 +109,7 @@ android:drawablePadding="@dimen/dp_2" android:gravity="center_horizontal" android:maxLines="2" + android:ellipsize="end" android:text="VIP-Only Coupons" android:textColor="#712B2B" android:textSize="@dimen/sp_11" diff --git a/app/src/main/res/layout/example_dialog_series.xml b/app/src/main/res/layout/example_dialog_series.xml index 252885c..2060de2 100644 --- a/app/src/main/res/layout/example_dialog_series.xml +++ b/app/src/main/res/layout/example_dialog_series.xml @@ -4,6 +4,7 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + - + app:cardCornerRadius="8dp" + app:cardElevation="0dp"> + + + + @@ -43,7 +53,7 @@ android:layout_below="@+id/tv_name" android:layout_marginLeft="14dp" android:layout_marginTop="11dp" - android:layout_toEndOf="@+id/iv_img" + android:layout_toEndOf="@+id/cardview" android:text="Total 80 Episodes" android:textColor="#9D9D9D" android:textSize="@dimen/sp_12" /> @@ -55,7 +65,7 @@ android:layout_below="@+id/tv_total" android:layout_marginStart="@dimen/dp_14" android:layout_marginTop="@dimen/dp_15" - android:layout_toRightOf="@+id/iv_img" + android:layout_toRightOf="@+id/cardview" android:paddingHorizontal="@dimen/dp_9" android:paddingVertical="@dimen/dp_3" android:text="sweet favor" @@ -87,7 +97,7 @@ android:id="@+id/tv_content_dialog_series" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_below="@+id/iv_img" + android:layout_below="@+id/cardview" android:layout_marginHorizontal="@dimen/dp_17" android:layout_marginTop="@dimen/sp_10" android:lineSpacingExtra="@dimen/dp_2" diff --git a/app/src/main/res/layout/home_navigation_item.xml b/app/src/main/res/layout/home_navigation_item.xml index a8fcb37..d68dc24 100644 --- a/app/src/main/res/layout/home_navigation_item.xml +++ b/app/src/main/res/layout/home_navigation_item.xml @@ -20,7 +20,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_2" - android:textSize="@dimen/sp_12" + android:textSize="@dimen/sp_11" android:singleLine="true" app:shape_textColor="#888888" app:shape_textSelectedColor="#F56490" diff --git a/app/src/main/res/layout/item_home_critically.xml b/app/src/main/res/layout/item_home_critically.xml index dd7c37d..0ded230 100644 --- a/app/src/main/res/layout/item_home_critically.xml +++ b/app/src/main/res/layout/item_home_critically.xml @@ -53,6 +53,7 @@ android:lineSpacingExtra="@dimen/dp_2" android:minLines="2" android:maxLines="2" + android:ellipsize="end" android:text="" android:textColor="@color/white" android:textSize="@dimen/sp_12" /> @@ -104,6 +105,7 @@ android:layout_toRightOf="@+id/iv_card" android:lineSpacingExtra="@dimen/dp_2" android:maxLines="2" + android:ellipsize="end" android:text="On her wedding day, Lydia Murphy catches her fiance, Justin, cheati..." android:textColor="#78D2D2D2" android:textSize="@dimen/sp_10" /> diff --git a/app/src/main/res/layout/item_home_short.xml b/app/src/main/res/layout/item_home_short.xml index 83f39b2..1942ee6 100644 --- a/app/src/main/res/layout/item_home_short.xml +++ b/app/src/main/res/layout/item_home_short.xml @@ -54,6 +54,7 @@ android:layout_marginBottom="@dimen/dp_8" android:lineSpacingExtra="@dimen/dp_2" android:maxLines="2" + android:ellipsize="end" android:text="He paid for salvation in blood—but the debt was never meant to be..." android:textColor="@color/mireo_color_d2d2d2" android:textSize="@dimen/sp_10" diff --git a/app/src/main/res/layout/item_list_tab.xml b/app/src/main/res/layout/item_list_tab.xml index 995061e..0983e7d 100644 --- a/app/src/main/res/layout/item_list_tab.xml +++ b/app/src/main/res/layout/item_list_tab.xml @@ -78,6 +78,7 @@ android:layout_marginBottom="@dimen/dp_4" android:lineSpacingExtra="@dimen/dp_2" android:maxLines="2" + android:ellipsize="end" android:text="Salvation Mispaid" android:textColor="@color/white" android:textSize="@dimen/sp_13" diff --git a/app/src/main/res/layout/item_search_girl.xml b/app/src/main/res/layout/item_search_girl.xml index 00b3f18..0b4dd89 100644 --- a/app/src/main/res/layout/item_search_girl.xml +++ b/app/src/main/res/layout/item_search_girl.xml @@ -32,6 +32,7 @@ android:layout_marginBottom="@dimen/dp_4" android:lineSpacingExtra="@dimen/dp_2" android:maxLines="2" + android:ellipsize="end" android:text="Salvation Mispaid" android:textColor="@color/white" android:textSize="@dimen/sp_13" diff --git a/app/src/main/res/layout/item_search_hot.xml b/app/src/main/res/layout/item_search_hot.xml index c57d77b..5855cac 100644 --- a/app/src/main/res/layout/item_search_hot.xml +++ b/app/src/main/res/layout/item_search_hot.xml @@ -33,6 +33,7 @@ android:layout_marginEnd="@dimen/dp_9" android:layout_toRightOf="@+id/iv_card" android:maxLines="2" + android:ellipsize="end" android:text="Caged Marriage" android:textColor="@color/white" android:textSize="@dimen/sp_13" /> @@ -47,6 +48,7 @@ android:layout_marginEnd="@dimen/dp_9" android:layout_toRightOf="@+id/iv_card" android:maxLines="2" + android:ellipsize="end" android:text="Caged Marriage" android:textColor="@color/example_color_9d9d9d" android:textSize="@dimen/sp_12" /> diff --git a/app/src/main/res/layout/mine_fragment.xml b/app/src/main/res/layout/mine_fragment.xml index 976769f..6f6f8cc 100644 --- a/app/src/main/res/layout/mine_fragment.xml +++ b/app/src/main/res/layout/mine_fragment.xml @@ -248,6 +248,35 @@ app:layout_constraintTop_toBottomOf="@+id/sb_play_list" /> + + + + + app:layout_constraintTop_toBottomOf="@+id/sb_language" /> - diff --git a/app/src/main/res/layout/tab_item_design.xml b/app/src/main/res/layout/tab_item_design.xml index fbf6102..68b3446 100644 --- a/app/src/main/res/layout/tab_item_design.xml +++ b/app/src/main/res/layout/tab_item_design.xml @@ -14,6 +14,7 @@ android:layout_centerHorizontal="true" android:gravity="center" android:maxLines="2" + android:ellipsize="end" android:paddingVertical="@dimen/dp_12" android:textSize="@dimen/sp_15" app:shape_textColor="@color/white" diff --git a/app/src/main/res/layout/tips_dialog.xml b/app/src/main/res/layout/tips_dialog.xml index d8d8203..73ec64b 100644 --- a/app/src/main/res/layout/tips_dialog.xml +++ b/app/src/main/res/layout/tips_dialog.xml @@ -34,6 +34,7 @@ android:layout_marginTop="@dimen/dp_5" android:layout_marginBottom="@dimen/dp_10" android:maxLines="3" + android:ellipsize="end" android:textColor="@color/white" android:textSize="@dimen/sp_14" tools:text="提示语" /> diff --git a/app/src/main/res/mipmap-xxhdpi/ic_login_tag.webp b/app/src/main/res/mipmap-xxhdpi/ic_login_tag.webp new file mode 100644 index 0000000000000000000000000000000000000000..6723673505145fd739d709bfec3e41f01fae0c98 GIT binary patch literal 1384 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