diff --git a/app/src/main/java/com/gh/common/util/DisplayUtils.java b/app/src/main/java/com/gh/common/util/DisplayUtils.java index c1e6fea372..31ea6a686b 100644 --- a/app/src/main/java/com/gh/common/util/DisplayUtils.java +++ b/app/src/main/java/com/gh/common/util/DisplayUtils.java @@ -87,6 +87,22 @@ public class DisplayUtils { return result; } + public static void transparentStatusBar(Activity activity) { + //make full transparent statusBar + if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) { + setWindowFlag(activity, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, true); + } + if (Build.VERSION.SDK_INT >= 19) { + activity.getWindow() + .getDecorView() + .setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); + } + if (Build.VERSION.SDK_INT >= 21) { + setWindowFlag(activity, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false); + activity.getWindow().setStatusBarColor(Color.TRANSPARENT); + } + } + public static void transparentStatusAndNavigation(Activity activity) { //make full transparent statusBar if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) { diff --git a/app/src/main/java/com/gh/common/view/NavigationBarView.kt b/app/src/main/java/com/gh/common/view/NavigationBarView.kt new file mode 100644 index 0000000000..35461f8f1e --- /dev/null +++ b/app/src/main/java/com/gh/common/view/NavigationBarView.kt @@ -0,0 +1,61 @@ +package com.gh.common.view + +import android.app.Activity +import android.content.Context +import android.os.Build +import android.util.AttributeSet +import android.util.DisplayMetrics +import android.view.KeyCharacterMap +import android.view.KeyEvent +import android.view.View +import android.view.ViewConfiguration + +/** + * 导航栏占位 View + */ +class NavigationBarView @JvmOverloads constructor(context: Context?, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : View(context, attrs, defStyleAttr) { + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + val height = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + 0 + } else { + retrieveNavigationHeight() + } + setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), height) + } + + // TODO 将这部分移到通用方法去 + private fun hasSoftKeys(): Boolean { + if (context !is Activity) return false + + val hasSoftwareKeys: Boolean + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + val d = (context as Activity).windowManager.defaultDisplay + + val realDisplayMetrics = DisplayMetrics() + d.getRealMetrics(realDisplayMetrics) + + val realHeight = realDisplayMetrics.heightPixels + val realWidth = realDisplayMetrics.widthPixels + + val displayMetrics = DisplayMetrics() + d.getMetrics(displayMetrics) + + val displayHeight = displayMetrics.heightPixels + val displayWidth = displayMetrics.widthPixels + + hasSoftwareKeys = realWidth - displayWidth > 0 || realHeight - displayHeight > 0 + } else { + val hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey() + val hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK) + hasSoftwareKeys = !hasMenuKey && !hasBackKey + } + return hasSoftwareKeys + } + + private fun retrieveNavigationHeight(): Int { + val resources = context.resources + val resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android") + return if (resourceId > 0 && hasSoftKeys()) resources.getDimensionPixelSize(resourceId) else 0 + } +} diff --git a/app/src/main/java/com/gh/gamecenter/GameDetailActivity.java b/app/src/main/java/com/gh/gamecenter/GameDetailActivity.java index 7943b5169b..8ddceefaa5 100644 --- a/app/src/main/java/com/gh/gamecenter/GameDetailActivity.java +++ b/app/src/main/java/com/gh/gamecenter/GameDetailActivity.java @@ -27,7 +27,7 @@ public class GameDetailActivity extends NormalActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - DisplayUtils.transparentStatusAndNavigation(this); + DisplayUtils.transparentStatusBar(this); } @Override diff --git a/app/src/main/java/com/gh/gamecenter/entity/VideoEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/VideoEntity.kt index 657ac83d4a..b61012bebc 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/VideoEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/VideoEntity.kt @@ -30,7 +30,9 @@ open class VideoEntity( val length: Long = 0, // 有三种状态 pass通过,fail未通过,pending审核中 var status: String = "", - var thumb: String = "$url?x-oss-process=video/snapshot,t_0,f_jpg,w_0,h_0", val format: String = "Mp4", @SerializedName("tag_id") - val tagsId: List = ArrayList()) : Parcelable \ No newline at end of file + val tagsId: List = ArrayList()) : Parcelable { + + fun getThumb() = "$url?x-oss-process=video/snapshot,t_0,f_jpg,w_0,h_0" +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/CommentActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/CommentActivity.kt index 1157af17b8..9000b4ae94 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/CommentActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/CommentActivity.kt @@ -69,7 +69,7 @@ class CommentActivity : BaseActivity() { commentCallback) } - DisplayUtils.transparentStatusAndNavigation(this) + DisplayUtils.transparentStatusBar(this) supportFragmentManager.beginTransaction().replace(R.id.answer_comment_placeholder, commentFragment).commitNowAllowingStateLoss() } diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt b/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt index 3af0b3a28a..bd5ed99455 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt @@ -68,7 +68,7 @@ class DetailPlayerView @JvmOverloads constructor(context: Context, attrs: Attrib } shareContainer.setOnClickListener { - val shareIcon = videoEntity.thumb + val shareIcon = videoEntity.getThumb() val shareSummary = "@" + videoEntity.user.name + "在光环助手发布了游戏小视频,快点开看看吧" @@ -221,6 +221,14 @@ class DetailPlayerView @JvmOverloads constructor(context: Context, attrs: Attrib errorContainer.visibility = View.VISIBLE } + override fun netWorkErrorLogic() { + super.netWorkErrorLogic() + + Utils.toast(context, "网络错误,视频播放失败") + setViewShowState(mStartButton, View.INVISIBLE) + errorContainer.visibility = View.VISIBLE + } + override fun updateStartImage() { // no need to change } diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailActivity.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailActivity.kt index 16ef420510..33fff67341 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailActivity.kt @@ -18,7 +18,7 @@ class VideoDetailActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - DisplayUtils.transparentStatusAndNavigation(this) + DisplayUtils.transparentStatusBar(this) IjkPlayerManager.setLogLevel(IjkMediaPlayer.IJK_LOG_SILENT) diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt index 295bc7f02d..6e4306a859 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt @@ -14,9 +14,13 @@ import com.gh.gamecenter.entity.VideoEntity import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.normal.NormalFragment import kotlinx.android.synthetic.main.fragment_video_detail_container.* +import kotlinx.android.synthetic.main.reuse_no_connection.* class VideoDetailContainerFragment : NormalFragment() { + private var mInitialVideoId = "" + private var mLocation = "" + private lateinit var mViewModel: VideoDetailContainerViewModel private lateinit var mFragmentAdapter: VideoFragmentPagerAdapter @@ -27,11 +31,11 @@ class VideoDetailContainerFragment : NormalFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val videoId = arguments?.getString(EntranceUtils.KEY_ID) ?: "" - val location = arguments?.getString(EntranceUtils.KEY_LOCATION) ?: "" + mInitialVideoId = arguments?.getString(EntranceUtils.KEY_ID) ?: "" + mLocation = arguments?.getString(EntranceUtils.KEY_LOCATION) ?: "" mViewModel = viewModelProviderFromParent() - mViewModel.getVideoDetailList(videoId, location) + mViewModel.getVideoDetailList(mInitialVideoId, mLocation) mViewModel.showComment = arguments?.getBoolean(EntranceUtils.KEY_SHOW_COMMENT) ?: false } @@ -53,6 +57,8 @@ class VideoDetailContainerFragment : NormalFragment() { } mViewModel.videoList.observeNonNull(this) { + hideNetworkErrorView() + if (!::mFragmentAdapter.isInitialized) { mFragmentAdapter = VideoFragmentPagerAdapter(this) { videoEntity -> VideoDetailFragment.instance(videoEntity) @@ -68,6 +74,26 @@ class VideoDetailContainerFragment : NormalFragment() { viewpager.setCurrentItem(it.size * 100 + mViewModel.startPosition, false) mFragmentAdapter.notifyDataSetChanged() } + + mViewModel.networkError.observeNonNull(this) { + if (it) { + showNetworkErrorView() + toast("网络异常") + } + } + } + + private fun showNetworkErrorView() { + errorContainer.visibility = View.VISIBLE + reuse_no_connection.visibility = View.VISIBLE + reuse_no_connection.setOnClickListener { + mViewModel.getVideoDetailList(mInitialVideoId, mLocation) + } + } + + private fun hideNetworkErrorView() { + errorContainer.visibility = View.GONE + reuse_no_connection.visibility = View.GONE } private fun showMoreMenuDialog(video: VideoEntity) { @@ -120,7 +146,7 @@ class VideoDetailContainerFragment : NormalFragment() { private fun share() { mViewModel.currentDisplayingVideo?.let { - val shareIcon = it.thumb + val shareIcon = it.getThumb() val shareSummary = "@" + it.user.name + "在光环助手发布了游戏小视频,快点开看看吧" diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerViewModel.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerViewModel.kt index a04e5c1860..80886c0181 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerViewModel.kt @@ -15,10 +15,15 @@ class VideoDetailContainerViewModel(application: Application) : AndroidViewModel var startPosition = 0 var showComment = false var currentDisplayingVideo: VideoEntity? = null + + var networkError = MutableLiveData() var videoList = MutableLiveData>() var action = MutableLiveData() + // 是否为第一次加载(即没有进行加载更多) + private var mIsFirstLoad = true + fun collect() { action.postValue(Action(currentDisplayingVideo?.id ?: "", ActionType.COLLECT)) } @@ -39,6 +44,12 @@ class VideoDetailContainerViewModel(application: Application) : AndroidViewModel mergeVideoList(videoId, data) } + + override fun onFailure(exception: Exception) { + if (mIsFirstLoad) { + networkError.postValue(true) + } + } }) } diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailFragment.kt index 42be9ffda2..bed8949a15 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailFragment.kt @@ -71,7 +71,7 @@ class VideoDetailFragment : NormalFragment() { videoView.setViewModel(mViewModel) videoView.updateViewDetail(it) - videoView.updateThumb(it.thumb) + videoView.updateThumb(it.getThumb()) } } diff --git a/app/src/main/res/layout/fragment_video_detail.xml b/app/src/main/res/layout/fragment_video_detail.xml index 71794ec600..8f719f057d 100644 --- a/app/src/main/res/layout/fragment_video_detail.xml +++ b/app/src/main/res/layout/fragment_video_detail.xml @@ -1,5 +1,5 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_video_detail_container.xml b/app/src/main/res/layout/fragment_video_detail_container.xml index dd51820988..42303c02bb 100644 --- a/app/src/main/res/layout/fragment_video_detail_container.xml +++ b/app/src/main/res/layout/fragment_video_detail_container.xml @@ -18,6 +18,18 @@ android:layout_width="match_parent" android:layout_height="wrap_content" /> + + + + + + + + @@ -228,7 +234,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dp" - android:lineSpacingExtra="21sp" + android:lineSpacingExtra="10sp" android:textColor="@color/white" android:textSize="14sp" tools:text="举例:比如切换之前,当前视频已播放了 ,切换App或者回到手机桌面,在切换回光环助手,要从开始播放" />