From 319fe2f5561a2c153ac83bc0439bcdc92ca7f183 Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Wed, 25 Sep 2019 18:29:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=B8=B8=E6=88=8F=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E9=A1=B5=E6=B8=B8=E6=88=8F=E8=A7=86=E9=A2=91=E5=9F=BA?= =?UTF-8?q?=E6=9C=AC=E7=9A=84=E6=BB=9A=E5=8A=A8=E6=95=88=E6=9E=9C=EF=BC=8C?= =?UTF-8?q?=E7=BB=86=E8=8A=82=E5=8A=9F=E8=83=BD=E5=BE=85=E5=AE=8C=E5=96=84?= =?UTF-8?q?=20https://gitlab.ghzs.com/pm/halo-app-issues/issues/625?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/common/view/ExpendTextView.java | 86 +++--- .../common/view/MaterializedRelativeLayout.kt | 25 ++ .../com/gh/gamecenter/GameDetailActivity.java | 17 +- .../gh/gamecenter/entity/GameDetailEntity.kt | 16 ++ .../gamedetail/GameDetailFragment.kt | 198 ++++++++++---- .../gamedetail/GameDetailViewModel.kt | 3 +- .../gamedetail/video/TopVideoView.kt | 167 ++++++++++++ .../bg_game_detail_seekbar.xml | 28 ++ .../res/drawable-xxhdpi/bg_video_control.xml | 7 + .../ic_game_detail_download_light.png | Bin 0 -> 1121 bytes .../ic_game_detail_enter_full_screen.png | Bin 0 -> 1112 bytes .../ic_game_detail_exit_full_screen.png | Bin 0 -> 1275 bytes .../ic_game_detail_follow_light.png | Bin 0 -> 2005 bytes .../ic_game_detail_followed_light.png | Bin 0 -> 2036 bytes .../ic_game_detail_more_light.png | Bin 0 -> 349 bytes .../drawable-xxhdpi/ic_game_detail_pause.png | Bin 0 -> 4173 bytes .../drawable-xxhdpi/ic_game_detail_play.png | Bin 0 -> 4783 bytes .../drawable-xxhdpi/ic_game_detail_replay.png | Bin 0 -> 6492 bytes .../ic_game_detail_share_light.png | Bin 0 -> 1585 bytes .../ic_game_detail_volume_off.png | Bin 0 -> 1993 bytes .../ic_game_detail_volume_on.png | Bin 0 -> 1683 bytes .../main/res/layout/activity_game_detail.xml | 12 + .../main/res/layout/fragment_gamedetail.xml | 8 +- app/src/main/res/layout/gamedetail_body.xml | 258 ++++++++++-------- .../layout_game_detail_video_landscape.xml | 89 ++++++ .../layout_game_detail_video_portrait.xml | 88 ++++++ .../res/layout/piece_game_detail_video.xml | 28 ++ .../main/res/layout/piece_video_control.xml | 69 +++++ .../main/res/layout/piece_video_replay.xml | 26 ++ app/src/main/res/values/styles.xml | 8 + 30 files changed, 920 insertions(+), 213 deletions(-) create mode 100644 app/src/main/java/com/gh/common/view/MaterializedRelativeLayout.kt create mode 100644 app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt create mode 100644 app/src/main/res/drawable-xxhdpi/bg_game_detail_seekbar.xml create mode 100644 app/src/main/res/drawable-xxhdpi/bg_video_control.xml create mode 100644 app/src/main/res/drawable-xxhdpi/ic_game_detail_download_light.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_game_detail_enter_full_screen.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_game_detail_exit_full_screen.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_game_detail_follow_light.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_game_detail_followed_light.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_game_detail_more_light.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_game_detail_pause.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_game_detail_play.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_game_detail_replay.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_game_detail_share_light.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_game_detail_volume_off.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_game_detail_volume_on.png create mode 100644 app/src/main/res/layout/activity_game_detail.xml create mode 100644 app/src/main/res/layout/layout_game_detail_video_landscape.xml create mode 100644 app/src/main/res/layout/layout_game_detail_video_portrait.xml create mode 100644 app/src/main/res/layout/piece_game_detail_video.xml create mode 100644 app/src/main/res/layout/piece_video_control.xml create mode 100644 app/src/main/res/layout/piece_video_replay.xml diff --git a/app/src/main/java/com/gh/common/view/ExpendTextView.java b/app/src/main/java/com/gh/common/view/ExpendTextView.java index 682787e358..0f1f6d1361 100644 --- a/app/src/main/java/com/gh/common/view/ExpendTextView.java +++ b/app/src/main/java/com/gh/common/view/ExpendTextView.java @@ -19,30 +19,30 @@ import androidx.appcompat.widget.AppCompatTextView; import androidx.core.content.ContextCompat; public class ExpendTextView extends AppCompatTextView { - + private CharSequence mSnapshotText; private CharSequence mCloseText; - + private String mExpendText = "...全文"; - + private int mMaxLines = 3; // 由于sdk版本限制(getMaxLines) 这里设置默认值 - + private boolean mInitLayout = false; private boolean mOpenLayout = false; - + private ExpandCallback mExpandCallback; - + public ExpendTextView(Context context) { super(context); } - + public ExpendTextView(Context context, AttributeSet attrs) { super(context, attrs); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { mMaxLines = getMaxLines(); } } - + @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); @@ -53,30 +53,30 @@ public class ExpendTextView extends AppCompatTextView { showExpendButton(); } } - + public void setExpendText(String text) { this.mExpendText = text; } - + public void setExpandCallback(ExpandCallback callback) { this.mExpandCallback = callback; } - + @Override public void setText(CharSequence text, BufferType type) { mInitLayout = true; super.setText(text, type); } - + private void showExpendButton() { Layout layout = getLayout(); int start = layout.getLineStart(0); int lastLineEnd = layout.getLineEnd(mMaxLines - 1); int lastLineStart = layout.getLineStart(mMaxLines - 1); float lastLineRight = layout.getLineRight(mMaxLines - 1); - + int viewWidth = getWidth() - getPaddingRight() - getPaddingLeft(); - + TextPaint paint = getPaint(); float expendTextWidth = paint.measureText(mExpendText); CharSequence content = mSnapshotText.subSequence(start, lastLineEnd); @@ -98,47 +98,39 @@ public class ExpendTextView extends AppCompatTextView { int startPosition = content.length() - mExpendText.length(); startPosition = startPosition < 0 ? 0 : startPosition; msp.replace(startPosition, length, mExpendText); - msp.setSpan( - new ClickableSpan() { - @Override - public void updateDrawState(TextPaint ds) { - super.updateDrawState(ds); - ds.setColor(ContextCompat.getColor(getContext(), R.color.theme)); - ds.setUnderlineText(false); - } - - @Override - public void onClick(View widget) { - mOpenLayout = true; - setMaxLines(Integer.MAX_VALUE); - setText(mSnapshotText); - - if (mExpandCallback != null) { - mExpandCallback.onExpand(); - } - } - }, - startPosition, - msp.length(), - Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - msp.setSpan( - new BackgroundColorSpan(Color.WHITE), - startPosition, - msp.length(), - Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - + msp.setSpan(new ClickableSpan() { + @Override + public void updateDrawState(TextPaint ds) { + super.updateDrawState(ds); + ds.setColor(ContextCompat.getColor(getContext(), R.color.theme)); + ds.setUnderlineText(false); + } + + @Override + public void onClick(View widget) { + mOpenLayout = true; + setMaxLines(Integer.MAX_VALUE); + setText(mSnapshotText); + + if (mExpandCallback != null) { + mExpandCallback.onExpand(); + } + } + }, startPosition, msp.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + msp.setSpan(new BackgroundColorSpan(Color.WHITE), startPosition, msp.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + setText(msp); setMovementMethod(CustomLinkMovementMethod.getInstance()); } - - + + public void setExpendMaxLines(int maxLines) { mMaxLines = maxLines; setMaxLines(maxLines); } - + public interface ExpandCallback { void onExpand(); } - + } diff --git a/app/src/main/java/com/gh/common/view/MaterializedRelativeLayout.kt b/app/src/main/java/com/gh/common/view/MaterializedRelativeLayout.kt new file mode 100644 index 0000000000..3bcbf89a2c --- /dev/null +++ b/app/src/main/java/com/gh/common/view/MaterializedRelativeLayout.kt @@ -0,0 +1,25 @@ +package com.gh.common.view + +import android.annotation.TargetApi +import android.content.Context +import android.os.Build +import android.util.AttributeSet +import android.view.WindowInsets +import android.widget.RelativeLayout + +class MaterializedRelativeLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) + : RelativeLayout(context, attrs) { + + /** + * 将 windowInsets 传递给子 view [https://medium.com/androiddevelopers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec#.raoa9t506] + */ + @TargetApi(Build.VERSION_CODES.KITKAT_WATCH) + override fun onApplyWindowInsets(insets: WindowInsets): WindowInsets { + val childCount = childCount + for (index in 0 until childCount) { + getChildAt(index).dispatchApplyWindowInsets(insets) + } + return insets + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/GameDetailActivity.java b/app/src/main/java/com/gh/gamecenter/GameDetailActivity.java index 601b73930e..3ac424e1d2 100644 --- a/app/src/main/java/com/gh/gamecenter/GameDetailActivity.java +++ b/app/src/main/java/com/gh/gamecenter/GameDetailActivity.java @@ -9,6 +9,7 @@ import com.gh.common.exposure.ExposureManager; import com.gh.common.exposure.ExposureTraceUtils; import com.gh.common.exposure.ExposureType; import com.gh.common.util.DataUtils; +import com.gh.common.util.DisplayUtils; import com.gh.common.util.EntranceUtils; import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.gamedetail.GameDetailFragment; @@ -18,12 +19,24 @@ import com.gh.gamecenter.gamedetail.GameDetailFragment; * 游戏详情适配器 */ public class GameDetailActivity extends NormalActivity { - + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + DisplayUtils.transparentStatusAndNavigation(this); + } + @Override protected Intent provideNormalIntent() { return getTargetIntent(this, GameDetailActivity.class, GameDetailFragment.class); } - + + @Override + protected int getLayoutId() { + return R.layout.activity_game_detail; + } + /** * 启动游戏详情页面 */ diff --git a/app/src/main/java/com/gh/gamecenter/entity/GameDetailEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/GameDetailEntity.kt index 22a7b3e985..6228f48b77 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/GameDetailEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/GameDetailEntity.kt @@ -80,6 +80,12 @@ class GameDetailEntity( @SerializedName("server_label") val serverLabel: ColorEntity? = null, + @SerializedName("top_video") + var topVideo: Video? = null, + + @SerializedName("intro_video") + var introVideo: Video? = null, + @SerializedName("direct_comment") val directComment: Boolean = false) : Parcelable { @@ -114,6 +120,16 @@ class GameDetailEntity( const val TAG: String = "GameDetailEntity" } + @Parcelize + data class Video( + @SerializedName("video_id") + var videoId: String = "", + @SerializedName("video_count") + var videoCount: Int = 0, + var poster: String = "", + var url: String = "" + ) : Parcelable + @Parcelize data class RelatedVersion( var first: Boolean = false, diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt index 83e256aab9..fcc47b72bc 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -5,10 +5,13 @@ import android.content.Intent import android.graphics.drawable.ColorDrawable import android.os.Build import android.os.Bundle +import android.text.TextUtils import android.view.* import android.widget.CheckedTextView import android.widget.RelativeLayout import android.widget.TextView +import androidx.appcompat.widget.Toolbar +import androidx.core.content.ContextCompat import androidx.core.view.ViewCompat import androidx.fragment.app.Fragment import butterknife.BindView @@ -35,6 +38,7 @@ import com.gh.gamecenter.eventbus.EBReuse import com.gh.gamecenter.gamedetail.desc.DescFragment import com.gh.gamecenter.gamedetail.fuli.FuLiFragment import com.gh.gamecenter.gamedetail.rating.RatingFragment +import com.gh.gamecenter.gamedetail.video.TopVideoView import com.gh.gamecenter.manager.PackagesManager import com.gh.gamecenter.mvvm.Status import com.gh.gamecenter.normal.NormalFragment @@ -47,6 +51,12 @@ import com.lightgame.download.DataWatcher import com.lightgame.download.DownloadEntity import com.lightgame.view.NoScrollableViewPager import com.qq.gdt.action.ActionType +import com.shuyu.gsyvideoplayer.GSYVideoManager +import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder +import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack +import com.shuyu.gsyvideoplayer.utils.OrientationUtils +import kotlinx.android.synthetic.main.gamedetail_body.* +import kotlinx.android.synthetic.main.piece_game_detail_video.* import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode @@ -102,6 +112,10 @@ class GameDetailFragment : NormalFragment() { lateinit var mBasicTag: TextView @BindView(R.id.gamedetail_name_container) lateinit var mNameContainer: View + @BindView(R.id.toolbar) + lateinit var mToolbar: Toolbar + @BindView(R.id.player) + lateinit var mTopVideoView: TopVideoView private var mSkeleton: ViewSkeletonScreen? = null @@ -111,8 +125,10 @@ class GameDetailFragment : NormalFragment() { private var mDownloadEntity: DownloadEntity? = null private var mGameDetailEntity: GameDetailEntity? = null private var mTraceEvent: ExposureEvent? = null + private var mOrientationUtils: OrientationUtils? = null private var mConcernMenuItem: MenuItem? = null + private var mMoreMenuItem: MenuItem? = null private var downloadAddWord: String? = null private var downloadOffText: String? = null @@ -155,8 +171,31 @@ class GameDetailFragment : NormalFragment() { override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - initMenu(R.menu.menu_game_detail) - mConcernMenuItem = getItemMenu(R.id.menu_concern) + mToolbar.inflateMenu(R.menu.menu_game_detail) + mMoreMenuItem = mToolbar.menu.findItem(R.id.menu_more) + mConcernMenuItem = mToolbar.menu.findItem(R.id.menu_concern) + + mConcernMenuItem?.setOnMenuItemClickListener { + consume { + checkReadPhoneStatePermissionBeforeAction { + ifLogin("游戏详情-[关注]") { + if (mGameDetailEntity != null && mGameDetailEntity!!.me.isGameConcerned) { + DialogUtils.showCancelDialog(context!!, { mViewModel.concernCommand(false) }, null) + } else { + mViewModel.concernCommand(true) + } + } + } + } + } + + mMoreMenuItem?.setOnMenuItemClickListener { + consume { + if (mGameEntity != null && mGameDetailEntity != null) { + showMoreMenuDialog() + } + } + } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { @@ -209,22 +248,48 @@ class GameDetailFragment : NormalFragment() { } mAppBarLayout.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset -> + val absVerticalOffset = abs(verticalOffset) val total = appBarLayout.totalScrollRange - if (abs(verticalOffset) > total / 2) { - setNavigationTitle(if (mGameEntity != null) mGameEntity!!.name else "") + + if (absVerticalOffset > total * 4 / 5) { + updateToolbarStyle(isLightTheme = true) + mToolbar.title = mGameEntity?.name ?: "" } else { - setNavigationTitle("") + updateToolbarStyle(isLightTheme = false) + mToolbar.title = "" } - if (abs(verticalOffset) == total && mIsScrollToKaiFu) { - mIsScrollToKaiFu = false - EventBus.getDefault().post(EBReuse(SCROLL_TO_KAIFU)) + if (absVerticalOffset == total) { + toolbar.setTitleTextColor(ContextCompat.getColor(requireContext(), R.color.black)) + + if (mIsScrollToKaiFu) { + mIsScrollToKaiFu = false + EventBus.getDefault().post(EBReuse(SCROLL_TO_KAIFU)) + } } }) observeData() } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + mOrientationUtils = OrientationUtils(requireActivity(), player) + mOrientationUtils?.isEnable = false + + // toolbar 消费 fitsSystemWindows 避免在 collapsingToolbar 下面出现多出来的 padding + // [https://stackoverflow.com/questions/48137666/viewgroup-inside-collapsingtoolbarlayout-show-extra-bottom-padding-when-set-fits] + ViewCompat.setOnApplyWindowInsetsListener(mAppBarLayout) { _, insets -> + (mToolbar.layoutParams as ViewGroup.MarginLayoutParams).topMargin = insets.systemWindowInsetTop + insets.consumeSystemWindowInsets() + } + + mToolbar.setNavigationOnClickListener { requireActivity().finish() } + + updateToolbarStyle(isLightTheme = true) + } + override fun onResume() { super.onResume() if (mGameEntity != null && (mGameEntity!!.getApk().size == 1 || mGameEntity!!.isReservable)) { @@ -312,6 +377,8 @@ class GameDetailFragment : NormalFragment() { mAutoDownload = false } + data.topVideo?.let { setUpTopVideo(it) } + mSkeleton?.hide() } else if (detailResource.status == Status.ERROR) { loadErrorControl(detailResource.exception) @@ -326,11 +393,9 @@ class GameDetailFragment : NormalFragment() { DataUtils.onEvent(context, "游戏关注", mGameEntity!!.name, kv) MtaHelper.onEvent("游戏详情_新", "关注", mGameEntity!!.name) DataCollectionUtils.uploadConcern(context, mGameEntity!!.name, mGameEntity!!.id, "关注") - GdtHelper.logAction(ActionType.ADD_TO_WISHLIST, - GdtHelper.CONTENT_TYPE, "GAME", - GdtHelper.CONTENT_ID, mGameEntity!!.id) + GdtHelper.logAction(ActionType.ADD_TO_WISHLIST, GdtHelper.CONTENT_TYPE, "GAME", GdtHelper.CONTENT_ID, mGameEntity!!.id) - mConcernMenuItem!!.setIcon(R.drawable.ic_menu_gamedetail_collected) + updateConcernIcon(isConcerned = true) toast(R.string.concern_success) } else { toast(R.string.concern_failure) @@ -341,11 +406,10 @@ class GameDetailFragment : NormalFragment() { kv["状态"] = "取消关注" DataUtils.onEvent(context, "游戏关注", mGameEntity!!.name, kv) - DataCollectionUtils.uploadConcern(context, - mGameEntity!!.name, mGameEntity!!.id, "取消关注") + DataCollectionUtils.uploadConcern(context, mGameEntity!!.name, mGameEntity!!.id, "取消关注") MtaHelper.onEvent("游戏详情_新", "取消关注", mGameEntity!!.name) - mConcernMenuItem!!.setIcon(R.drawable.ic_menu_gamedetail_collect) + updateConcernIcon(isConcerned = false) } else { toast(R.string.cancel_concern_failure) } @@ -389,7 +453,7 @@ class GameDetailFragment : NormalFragment() { mLoading.visibility = View.GONE mNoConnection.visibility = View.GONE mNoneDataView.visibility = View.VISIBLE - mConcernMenuItem!!.isVisible = false + mConcernMenuItem?.isVisible = false toast("内容可能已被删除") } else { mLoading.visibility = View.GONE @@ -400,23 +464,6 @@ class GameDetailFragment : NormalFragment() { mSkeleton?.hide() } - override fun onMenuItemClick(menuItem: MenuItem) { - when (menuItem.itemId) { - R.id.menu_concern -> checkReadPhoneStatePermissionBeforeAction { - ifLogin("游戏详情-[关注]") { - if (mGameDetailEntity != null && mGameDetailEntity!!.me.isGameConcerned) { - DialogUtils.showCancelDialog(context!!, { mViewModel.concernCommand(false) }, null) - } else { - mViewModel.concernCommand(true) - } - } - } - R.id.menu_more -> if (mGameEntity != null && mGameDetailEntity != null) { - showMoreMenuDialog() - } - } - } - private fun showMoreMenuDialog() { if (!isVisible) return @@ -475,11 +522,7 @@ class GameDetailFragment : NormalFragment() { tabParams.width = mMaxWidth * 2 / 3 } - if (mGameDetailEntity!!.me.isGameConcerned) { - mConcernMenuItem!!.setIcon(R.drawable.ic_menu_gamedetail_collected) - } else { - mConcernMenuItem!!.setIcon(R.drawable.ic_menu_gamedetail_collect) - } + updateConcernIcon(mGameDetailEntity!!.me.isGameConcerned) if (mGameDetailEntity!!.topTag != null && !mGameDetailEntity!!.topTag!!.isEmpty()) { mBasicTag.visibility = View.VISIBLE @@ -541,22 +584,57 @@ class GameDetailFragment : NormalFragment() { } } - if (mGameEntity!!.isLibaoExists) { - mLibaoIcon.visibility = View.VISIBLE + mLibaoIcon.goneIf(!mGameEntity!!.isLibaoExists) + } + + private fun setUpTopVideo(topVideo: GameDetailEntity.Video) { + GSYVideoOptionBuilder() + .setIsTouchWigetFull(false) + .setIsTouchWiget(false) + .setRotateViewAuto(false) + .setShowFullAnimation(false) + .setSeekRatio(1f) + .setUrl(topVideo.url) + .setCacheWithPlay(true) + .setVideoAllCallBack(object : GSYSampleCallBack() { + override fun onQuitFullscreen(url: String?, vararg objects: Any) { + mOrientationUtils?.backToProtVideo() + } + }) + .build(mTopVideoView) + + mTopVideoView.gameName = mGameEntity?.name ?: "" + mTopVideoView.updateThumb("${topVideo.url}?x-oss-process=video/snapshot,t_0,f_jpg,w_0,h_0") + + mTopVideoView.fullscreenButton.setOnClickListener { + mOrientationUtils?.resolveByClick() + player.startWindowFullscreen(requireContext(), true, true) + } + + mTopVideoView.observeVolume(this) + } + + private fun updateToolbarStyle(isLightTheme: Boolean) { + if (isLightTheme) { + mToolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_material) + updateConcernIcon(mGameDetailEntity?.me?.isGameConcerned ?: false) + mConcernMenuItem?.setIcon(R.drawable.ic_menu_gamedetail_collect) + mMoreMenuItem?.setIcon(R.drawable.ic_menu_gamedetail_more) } else { - mLibaoIcon.visibility = View.GONE + mToolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_material) + updateConcernIcon(mGameDetailEntity?.me?.isGameConcerned ?: false) + mConcernMenuItem?.setIcon(R.drawable.ic_game_detail_follow_light) + mMoreMenuItem?.setIcon(R.drawable.ic_game_detail_more_light) } } private fun share() { - if (mGameDetailEntity != null) { + mGameDetailEntity?.let { DataCollectionUtils.uploadClick(context, "分享", "游戏详情", mGameEntity!!.name) - GdtHelper.logAction(ActionType.SHARE, - GdtHelper.CONTENT_TYPE, "GAME", - GdtHelper.CONTENT_ID, mGameEntity!!.id) + GdtHelper.logAction(ActionType.SHARE, GdtHelper.CONTENT_TYPE, "GAME", GdtHelper.CONTENT_ID, mGameEntity!!.id) - val url = "http://www.ghzs666.com/game/" + mGameDetailEntity!!.shareCode!! + val url = "http://www.ghzs666.com/game/" + it.shareCode!! if (activity is BaseActivity) { var shareType: ShareUtils.ShareType = ShareUtils.ShareType.game @@ -682,10 +760,38 @@ class GameDetailFragment : NormalFragment() { } } + private fun updateConcernIcon(isConcerned: Boolean) { + if (isConcerned) { + if (TextUtils.isEmpty(mToolbar.title)) { + // 有文字,显示黑色图标 + mConcernMenuItem?.setIcon(R.drawable.ic_game_detail_followed_light) + } else { + mConcernMenuItem?.setIcon(R.drawable.ic_menu_gamedetail_collected) + } + } else { + if (TextUtils.isEmpty(mToolbar.title)) { + // 有文字,显示黑色图标 + mConcernMenuItem?.setIcon(R.drawable.ic_game_detail_follow_light) + } else { + mConcernMenuItem?.setIcon(R.drawable.ic_menu_gamedetail_collect) + } + } + } + private fun tabPerformClick(view: View?) { if (!mIsPageChanged) view!!.performClick() } + override fun onBackPressed(): Boolean { + mOrientationUtils?.backToProtVideo() + + if (GSYVideoManager.backFromWindowFull(requireContext())) { + return true + } + + return super.onBackPressed() + } + companion object { const val INDEX_TRENDES = 0 const val INDEX_DESC = 1 diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt index c353f84823..b384f95aa4 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt @@ -9,6 +9,7 @@ import com.gh.common.history.HistoryHelper import com.gh.common.util.ApkActiveUtils import com.gh.common.util.ConcernUtils import com.gh.common.util.DataUtils +import com.gh.common.util.testChannelOnly import com.gh.gamecenter.entity.GameDetailEntity import com.gh.gamecenter.entity.GameEntity import com.gh.gamecenter.mvvm.Resource @@ -85,7 +86,7 @@ class GameDetailViewModel(application: Application, } } - + testChannelOnly { response.topVideo = GameDetailEntity.Video(url = "https://resource.ghzs.com/video/game/5d26e984c391ca0c9a16121c.mp4") } gameDetailLiveData.postValue(Resource.success(response)) } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt new file mode 100644 index 0000000000..3377be4ab3 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt @@ -0,0 +1,167 @@ +package com.gh.gamecenter.gamedetail.video + +import android.content.Context +import android.os.Handler +import android.util.AttributeSet +import android.view.GestureDetector +import android.view.MotionEvent +import android.view.Surface +import android.view.View +import android.widget.ImageView +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import com.gh.common.observer.MuteCallback +import com.gh.common.observer.VolumeObserver +import com.gh.common.util.MtaHelper +import com.gh.gamecenter.R +import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer +import com.shuyu.gsyvideoplayer.video.base.GSYVideoView +import com.squareup.picasso.Picasso +import kotlinx.android.synthetic.main.piece_video_control.view.* +import kotlinx.android.synthetic.main.piece_video_replay.view.* + +class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : StandardGSYVideoPlayer(context, attrs) { + + var gameName = "" + + private var mMuteCallback : MuteCallback + private var mVolumeObserver : VolumeObserver + + init { + post { + gestureDetector = GestureDetector(getContext().applicationContext, object : GestureDetector.SimpleOnGestureListener() { + override fun onSingleTapConfirmed(e: MotionEvent): Boolean { + if (!mChangePosition && !mChangeVolume && !mBrightness) { + onClickUiToggle() + } + return super.onSingleTapConfirmed(e) + } + }) + } + + mMuteCallback = object : MuteCallback { + override fun onMute(isMute: Boolean) { + if (isMute) { + volume.setImageResource(R.drawable.ic_game_detail_volume_off) + } else { + volume.setImageResource(R.drawable.ic_game_detail_volume_on) + } + } + } + + mVolumeObserver = VolumeObserver(context, Handler(), mMuteCallback) + } + + //这个必须配置最上面的构造才能生效 + override fun getLayoutId(): Int { + return if (mIfCurrentIsFullscreen) R.layout.layout_game_detail_video_landscape else R.layout.layout_game_detail_video_portrait + } + + fun observeVolume(fragment: Fragment?) { + fragment?.context?.applicationContext?.contentResolver?.registerContentObserver( + android.provider.Settings.System.CONTENT_URI, true, mVolumeObserver) + + fragment?.fragmentManager?.registerFragmentLifecycleCallbacks( + object : FragmentManager.FragmentLifecycleCallbacks() { + override fun onFragmentPaused(fm: FragmentManager, f: Fragment) { + if (f === fragment) { + fragment.context?.applicationContext?.contentResolver?.unregisterContentObserver(mVolumeObserver) + fragment.fragmentManager?.unregisterFragmentLifecycleCallbacks(this) + } + } + }, false) + } + + private fun mute() { + volume.setImageResource(R.drawable.ic_game_detail_volume_off) + try { + + } catch (e: Exception) { + e.printStackTrace() + } + MtaHelper.onEvent("游戏详情_新", "视频_点击静音", gameName) + } + + private fun unmute() { + volume.setImageResource(R.drawable.ic_game_detail_volume_on) + try { + + } catch (e: Exception) { + e.printStackTrace() + } + MtaHelper.onEvent("游戏详情_新", "视频_解除静音", gameName) + } + + + fun updateThumb(url: String) { + Picasso.with(context).load(url).into(findViewById(R.id.thumbImage)) + } + + /******************* 下方两个重载方法,在播放开始前不屏蔽封面,不需要可屏蔽 ********************/ + + override fun onSurfaceUpdated(surface: Surface) { + super.onSurfaceUpdated(surface) + if (mThumbImageViewLayout != null && mThumbImageViewLayout.visibility == View.VISIBLE) { + mThumbImageViewLayout.visibility = View.INVISIBLE + } + } + + override fun setViewShowState(view: View?, visibility: Int) { + if (view === mThumbImageViewLayout && visibility != View.VISIBLE) { + return + } + super.setViewShowState(view, visibility) + } + + override fun onCompletion() { + super.onAutoCompletion() + } + + override fun touchDoubleUp() { + // we do not need double click to play or pause + } + + override fun updateStartImage() { + if (mIfCurrentIsFullscreen) { + if (mStartButton is ImageView) { + val imageView = mStartButton as ImageView + when (mCurrentState) { + GSYVideoView.CURRENT_STATE_PLAYING -> imageView.setImageResource(R.drawable.ic_game_detail_pause) + GSYVideoView.CURRENT_STATE_ERROR -> imageView.setImageResource(R.drawable.ic_game_detail_play) + else -> imageView.setImageResource(R.drawable.ic_game_detail_play) + } + } + } else { + super.updateStartImage() + } + } + + override fun setStateAndUi(state: Int) { + super.setStateAndUi(state) + + if (state == CURRENT_STATE_AUTO_COMPLETE) { + hideAllWidget() + replayContainer.visibility = View.VISIBLE + replayIv.setOnClickListener { + startButton.performClick() + } + } else { + replayContainer.visibility = View.GONE + } + } + + override fun getEnlargeImageRes(): Int { + return R.drawable.ic_game_detail_enter_full_screen + } + + override fun getShrinkImageRes(): Int { + return R.drawable.ic_game_detail_exit_full_screen + } + + override fun onInterceptTouchEvent(ev: MotionEvent): Boolean { + if (!isIfCurrentIsFullscreen) { + parent.requestDisallowInterceptTouchEvent(true) + } + return super.onInterceptTouchEvent(ev) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-xxhdpi/bg_game_detail_seekbar.xml b/app/src/main/res/drawable-xxhdpi/bg_game_detail_seekbar.xml new file mode 100644 index 0000000000..1974b3d4e6 --- /dev/null +++ b/app/src/main/res/drawable-xxhdpi/bg_game_detail_seekbar.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-xxhdpi/bg_video_control.xml b/app/src/main/res/drawable-xxhdpi/bg_video_control.xml new file mode 100644 index 0000000000..9d9d3ff74d --- /dev/null +++ b/app/src/main/res/drawable-xxhdpi/bg_video_control.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/main/res/drawable-xxhdpi/ic_game_detail_download_light.png b/app/src/main/res/drawable-xxhdpi/ic_game_detail_download_light.png new file mode 100644 index 0000000000000000000000000000000000000000..885ce6b5dcb7bbe60e988f32779d1932e69d9746 GIT binary patch literal 1121 zcmeAS@N?(olHy`uVBq!ia0vp^5kMTk!3HGf9@`WNq!^2X+?^QKos)UVz`!Ey>Eakt z!T5I0-aHXQf#by-QVJg!0)pC@G`VaTPAY1> zNmcy$w9WIkX6VPMKgc`$Epg$+irp0tO*vRjL^rOwaDUChwne5)ue=#^3ifJ5*&Gqw z&))o`{DqA$<4@-5k2gKmaFp{lJeSgB(A(7}JgcJrCZ|P$wXjBk)ry6 zrCcwS?0lOyghu>MVwirzr+U+jiI(kQJtDW}oer~*30hlHZWw#GspM#HtO#G|M)_vN z%`%S)JdS!yVVb@reXsGWwUrGQo^a3im}*(wovY@z&@yzgRejFEo~0HcN4GX5XXolp ze_!D9P$~4;o9Lr6q<&`^oRwb9a4bmXo1pEqZFbq|bB)~;L9$v2Jif8neNyLR1(G%S zwk8#2U%WQUWZGtfiCV?SxK6KB+;+_V>vOFM8%5fKChoj8tw{Xo>A)30dvCKokJvnS z^NZwckgZRSMqhulbCpyym-tGfbcV!8;-1a*8v{;#ip-A?dVA%zU-s{Sj@4jW3 z(;!^HM+w;hxI_HU<0TJbyG7?_M^g&PaVj!b!&XC&o27 zN+6d1cbOTU)uQV95ua>lthgNf^!aLyg)tL1s!akUzGjR&~`jo&S@ zjSnp4=?*XOXy48Gi;uHv)1CLt%v0Xk-C=*v_|EZr$^3^bS&ARTr5735^OWZQ0hSpI Mp00i_>zopr0GkyKa{vGU literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_game_detail_enter_full_screen.png b/app/src/main/res/drawable-xxhdpi/ic_game_detail_enter_full_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..7fdd6e824a80236f3187d457ceda1f1c0b3e7b0c GIT binary patch literal 1112 zcmV-e1gHCnP)Px(5=lfsRCodHT+eG0K@?6jDq0Y)RSy*fdk`a1Eb1ktC^+2-E>M} z&H}H25H^n_!9`+DfVn%duh{7#u(2(nu)`qm90+a2whHkGMu8li-P$`OD0p<2$slkH zpt5mT#jA)mf>5OEYt;^iUkE%j9CG{|JL+1r-$8ry(l z5bb+FoZ^&he*u@FbKZa!2b=1{1|E>(IOZU2-I92at{2zR;E8EHMY1F44BGpeR13E< zhg5fgJcjOvaB2T#GCA|65B3$pb|A@xS|TXL(c^O}|Bbk-zbx2Wrj%JAnz{ z8z9+71mt+u;zgijZxL{4B?-mZ7r5*KUPz?jAE7`~LLf)Zsu9Nu4^F#*9|HF)6sRl& zU9(A7+Y-Dl3EZc7klrc~za#k5?0zT|-_HZ|B7$58-9DTtz6*&`=?3>LDEy0~_@5N0 z>ImRfW!B|SyHDb8uY=OgGq(CwAVFFcNCgrU5ZpR~R3JeC!L1`m1rihx+&Y3h1aeI> zxqL$E)VN(7=Qx5&4k|96W4BbfTpUZB?ufea7RwxR(xmg^Z-RIOj`x@dwu9dVO`15i z9&$CDdy>D^L6@q4DxeCe0;+&2pbDr0s(>n>3aA3AfGVI0r~*cTUY{^>@;A=qo^{YE zSI(-MsYWc8wcyWIB<*Vp)|_6BvLXfIJZzK&f3_ll0y+8XKg=*RTpya=S#_xcp9-V` z2?_{q9YHFPpn%}k5u^eM3J7i;K`M}-fZ*l`T5!eSLUXgrpJty2w*?C1`U@KQ?@6-= zLhTZ_3I&=KlKl6uy%3)!_j#e%S^k=z1SA_35~a=!!lM#t_$Mh)-XoAx0wbwYA);V% z0bJ7@R+7E76j+49h}*oFQ^Vl|k+&j25++x(sa)4(ergeCDH%{Tg; z0wUiH5b3aLnVpBQejGRqYyVs eqn>Bdj(-6Z-9mGW`Yu5L0000Px(wMj%lRCodHThEJ4Q5=86Af_bQ&?rS28zapySQwEMB`X$6u~t_80AXRHtdv+j zD+{tv7M_K~LPpszDPkrWLWBI8=ktAYZ}aA!d%x$Lch2|D>-m1`(|z}R&-r}6=X1}y z_r7z^t5iy`dcEEYRDrPs^tm@yXyO9I_+#bi#FKR9BaT_4vS87O0}$hP>SWAH=nP%? zBCCeR0^NGyegO>316Us@%k8E70i%?FHpgFeGIP(W=O&ps9?N4hF1kMB;gB01;bl-46=mo8q?{< z6;2!@NM?DOkihXVIEOHI$WAW0#zoH5k0-z;*ETKG`-C?AM!Q5!9K?(kEY=!<0}H^} z2YeRGdYZVJH^S&Ky)rQWqUOKh*o%=>E21mk za3SvCZ~*v1=Mt7DSWO_%LvRjCjjZN;6VZlH_O!V?(&w7NgJE5?FxtxP;W-)|GJ=#) zfVlL!K~GPYR}NIOT4UkaxQ9_+(3Bpb7l2{F^?vphb;p6Xzf;vR zAg}{imB95~jQUgqPNP56H#Jp26;K6K0aZX1Pz6*0RX`O`1yli5Kow90Q~_1szfmCe z1R^btX%*=Q;A*q>Rv6-dMdB;joZJLX zqHh(*b_6jN0w;m@Kn!avvt{F?J9lE;^otUG1V`=@+DNE{0&s5wVy#Cu_o14b4rqnfrW@+6IVSruPUIOD#3ivLEuLUAX*X8R_aJMR z(K*oEF61-f4FkU<)dF|^S285=v@OW#$uwo@K=7tuiia4Bfj5>|q3*^_U+lF4Ka1|6 zFPBpR3y!qcA%>j-$?6zHIUKaN;yTbTzPAFGbii_1U*sg{RRsP;fXmK9diOdD(8yor z6{M`nNUR6oY%(+#kniULB)$OeUO*$s(>n>3bcU&{{T{FGmLND`;Pzs002ovPDHLkV1nUAR(}8h literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_game_detail_follow_light.png b/app/src/main/res/drawable-xxhdpi/ic_game_detail_follow_light.png new file mode 100644 index 0000000000000000000000000000000000000000..dc5cb19b2ed5214525e502043ce32aa8a7355a95 GIT binary patch literal 2005 zcmV;`2P*i9P)Px+k4Z#9RCodHoLi_BRT#%RrRF6yFI`Q=vIMcHNYscDQhKPY#D{{&mk7I91QkY4 zU8#_YghES#9)dzeyNN+?G73}E9)j?acq~e>%<__{c>4WMvxnK^%=*@vvu8K^cs}?u zv)6a~f8Uusvu4fgbJ}UW(%XUF4zzFw+8WKhv$L~5F>eHu!2~cC3;~0{ey|7Zj_^I( zHEnHed)WpHxz54qCNK${AK^TJ<;wFybI^3D48A?cu0Iz@}pb?^mtN>T0`D-lFg*FYhOc7^sACb;g z`e%|301Lo=P?oGD@Pr83FH2N|Y8gxS%;6lV zbEUVO?rn)7&AW@uTF{KsFwY{urOz!5Yv3egT^Q4F;O0T?D2B z&EYhc>yGTjS$W#Q&p>$&0Oh$5XdbFO(?MSlA`jEVMIjD#wlr@BI1YSe8-{bi(7Hf5 zAF$J@;d-zJgo=FRYaRqjkKIr(7l@;;9K&!%4t@79j^n^S&rExFg<}%H+!AEpkG|)e?pCvJ8fsO*4NjnCGzp@q? zV(a`kK7!YI&Wf3(R}Db5Sn@@d|4Cy+x!H<@eg_zNl5>j=sFtWEHcq+OED?8~bKf*G zP>UH*_cUkg{!_Zoh1lpMZY@W-gS1%Vl60xvI(QDKM@gT$eU#SMSM#FF>YRGe2h|2t zqf6?(#_4ZXu-Bik`4U5Hkh+LH)p&j4v#X5(i;z5l5C)L1dihJoqrosi`e2@YSapo zwNSFNR%Wt+x^%~fX3Ze6?Z)|{ zC}e$77dJ2({3@x;*sr^h&d|5~5C_t6idgC>VN^(7GiAt_vN-ENplYB)iU$u%>F6qY%PdYos%_<*aRzXiG-26SK(Sb>wSoi zWf3o(4FsOHNJRSg*_Lxs?nads_ilvtbA>=3pdYpP$ZLL4n`dQ_ZVD4f=!yLyi%g`~ z^rkXLqQ$wp4ea9+fE5bO=I_RKIk1}Z5H^|y-5)KH`J@Q4A@(&mTnz>VIc69W>(Pwi z^pJk9vWa>&rWHY-N%lDKm3J}J;$*{wcq74TUjilADR=i~90XVrKuj+#TF;xk8%(Sf z0lCXEUExhQ%Mez&sC*K@PGA2^vtose5o1h1&azG8Uup&4%SJ1l&jzS@>!|2f zPy0NxiFu0uVLav%+(40~iF$5u2lz;zJw#vQ4{73Spy+vVyGNd8nKXurngLdV5cwA4 z;IA}3y0!Fq89anb5!?2L{*_>$bK+ZpO!TU(rbR)5&sgC5+YU?{F3KIB|3u!J(|H$2 z;3qJCF)-!_*gwK4VYhE0^5|jEEkF;q&hqfH=6SDr#5jn}X7Djwt@ma;!sVDy+-z_d zgvfr3=YfX(F_ZKxB1zjy>_d1m=&*=q=)Y#H;g1P2^3)AgqG@RoFdPQ-{54echWtxl za5`qu&lZ8Aahu`?`3Jz?RuLKcJ&~{1y}GNIjM#NUF5gP%V0#7lp^mlx2i?WY0foBA%|PnO;hvrCobQ`s>X&jj17qH^@Qy2rOrzD4H5iidsU zRK^bG`aRxr;AmWh|IVt=LaflC@hW3aVH1HKMumv}p+t~a!GnTT&6whJe|s;`Ro6#$ zh1NjOosPgeL*u3G3$4bagB1PDZBZw98-M-s=UH&rh_%|#XQ@BS8jQwVI)__DRU9c7 z0IhgyLY`bp298$daqA!MrbiscPB%OCdGFMco}>X nLHqirkiF8|f!+?B+8y{8I5$q-s4<5800000NkvXXu0mjf31Qgh literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_game_detail_followed_light.png b/app/src/main/res/drawable-xxhdpi/ic_game_detail_followed_light.png new file mode 100644 index 0000000000000000000000000000000000000000..ba420556c2ea33ee6558c3089c4b7e167dec51dc GIT binary patch literal 2036 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 X?lZ(4Q=q`{00000NkvXXu0mjfL8-`V literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_game_detail_play.png b/app/src/main/res/drawable-xxhdpi/ic_game_detail_play.png new file mode 100644 index 0000000000000000000000000000000000000000..0d279a31567ccc570e32830d5d6cca3ba0a5be85 GIT binary patch literal 4783 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 JPDHLkV1jCG-Q@rP literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_game_detail_replay.png b/app/src/main/res/drawable-xxhdpi/ic_game_detail_replay.png new file mode 100644 index 0000000000000000000000000000000000000000..a2a1526f67fa257b17acadf747bca0984aac270c GIT binary patch literal 6492 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ͯRz$cR^ zZtGk`IU0$?SA)NOm5KHLLwi+@LT_&tpY?Tsu4>?An^J`Jge!{&h; zq|m+)NO(Ee??^nf>!bEX*JWlZa1WRct%S#JUzgL!es~gH0ABMX+;n&L5q6Q0>_@>@ zO;gT?H-`YPmU{Te+iaW`vN}S39u=)356+xwLs=Bp>hJlMV23KFMSZ>}tqJ@7Rg@f_SpJd8HD!4Q<0Y4Bi001DR&L2}VNw zTef4c+rboQMqb5uesXY&AZc$M!#4utEKQ2^4JZBQCObloAzFmp#XtxJXMw6nyP2EG zY3%PWm&-3#3EKSmH2mi{#*n@j!A%aG-9=FrgQvg*$Vz^N=yGjzYaq?nrGrnKxyuhp z-B;YjQP+oqd|zc^_bVbIsx z8aN(rNE^Pl3{F`kn5S}KAj=OM45Bn@DfS)e;0dKQNW$DagzrX+6TSZ$ic;>CJ_sOb z)?_yhi_HuY2G$@6bMp|s0kFs5-RLF4F|!-VSP<{gKEpexqKI)gn~JMf1(D3`H93NE zP6Gj*vILQ($gjfVpxiK6V22e_xp9$mbD{ z={WP7Z600Mx{2u^`F=qFmnlJ9k8Ve#$Kh?QoH5Dk!bw=` z{5;~OZz%|w=e&en<99P+%Dz#H*WF4xB5cduj8X3~TC=&**cf&D8!w~{rWHSbIJ26x z+<4Cc@{CQBi)6iJKCo^qcVMGWp3+8Y_-WCL&Tv=NxNkT3ZaUzJK;G3C8UY@b zGw6_E6Ay$-+<6-%^qyGfW4q?kDetF_`SjHO`OORD_$biiI7>&Z?D2t_CQ-R z*YqQVd!8^%HyHYv3wAGW!Fz~5luv#_;W}yDHN$ufXvZebXW@tS?Zr+N&DW)a zO!gwk7M`TY`yp4keAGUiWE=47AY`6|S+H!yvg6x;C0WKj4anVroH2g@*^_yxS_n%C zK~HQXxAIKto0>yZohg>AqX=ZJNDyDTlo{x)AXMa4g!`Cxyy9|TtW4)Yt}!~^M^3qY znWf{!@C`_ja{D@zFXoQ-Q>2qG)LB)hNb*YNW5C*%j7cQ&ll!o6M?Ic~HGX0A`%>q zb{R%U!mB~(zvx<#;n2mQqCiW)*T5(80!lMC!^KHHG*Sv6@0H#Owt#&=&Z_T${F}g` dP@XL8{sTgqM(#i)lfM7}002ovPDHLkV1lH5B~t(Z literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_game_detail.xml b/app/src/main/res/layout/activity_game_detail.xml new file mode 100644 index 0000000000..3206851478 --- /dev/null +++ b/app/src/main/res/layout/activity_game_detail.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_gamedetail.xml b/app/src/main/res/layout/fragment_gamedetail.xml index 16927e6910..f3eaa826bd 100644 --- a/app/src/main/res/layout/fragment_gamedetail.xml +++ b/app/src/main/res/layout/fragment_gamedetail.xml @@ -1,7 +1,8 @@ - + android:layout_height = "match_parent" + android:fitsSystemWindows = "true"> - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/gamedetail_body.xml b/app/src/main/res/layout/gamedetail_body.xml index 3d16f34f4e..2bb8bbe216 100644 --- a/app/src/main/res/layout/gamedetail_body.xml +++ b/app/src/main/res/layout/gamedetail_body.xml @@ -5,6 +5,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + android:fitsSystemWindows="true" android:orientation="vertical"> - - - - - - - - - + android:layout_height="match_parent" + android:fitsSystemWindows="true" + app:contentScrim="@color/white" + app:expandedTitleGravity="top" + app:layout_scrollFlags="scroll|exitUntilCollapsed" + app:scrimAnimationDuration="50" + app:scrimVisibleHeightTrigger="105dp" + app:titleEnabled="false"> - + + - - - - - - - - + android:gravity="center_vertical" + android:orientation="horizontal" + android:paddingLeft="16dp" + android:paddingTop="20dp" + android:paddingRight="20dp" + android:paddingBottom="10dp"> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/layout_game_detail_video_portrait.xml b/app/src/main/res/layout/layout_game_detail_video_portrait.xml new file mode 100644 index 0000000000..e33b1fbb04 --- /dev/null +++ b/app/src/main/res/layout/layout_game_detail_video_portrait.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/piece_game_detail_video.xml b/app/src/main/res/layout/piece_game_detail_video.xml new file mode 100644 index 0000000000..c95dca7a04 --- /dev/null +++ b/app/src/main/res/layout/piece_game_detail_video.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/piece_video_control.xml b/app/src/main/res/layout/piece_video_control.xml new file mode 100644 index 0000000000..e7d29e5ba3 --- /dev/null +++ b/app/src/main/res/layout/piece_video_control.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/piece_video_replay.xml b/app/src/main/res/layout/piece_video_replay.xml new file mode 100644 index 0000000000..d06a2bcc43 --- /dev/null +++ b/app/src/main/res/layout/piece_video_replay.xml @@ -0,0 +1,26 @@ + + + + + + + + \ 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 ecf7dd69e1..bbb5fab131 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -226,6 +226,14 @@ @android:style/Animation.Dialog + +