Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev

This commit is contained in:
kehaoyuan@ghzhushou.com
2020-05-06 11:04:54 +08:00
19 changed files with 127 additions and 52 deletions

View File

@ -111,7 +111,7 @@ class GameDetailEntity(
@Parcelize
data class Video(
@SerializedName("video_id")
@SerializedName("_id")
var videoId: String = "",
@SerializedName("new_video_count", alternate = ["video_count"]) // 选用 JSON 最后一个值作为 videoCount 的值
var videoCount: Int = 0,

View File

@ -6,10 +6,7 @@ import android.os.Build
import android.os.Bundle
import android.text.TextUtils
import android.view.*
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.PopupWindow
import android.widget.TextView
import android.widget.*
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
import androidx.core.view.ViewCompat
@ -23,7 +20,6 @@ import com.facebook.drawee.view.SimpleDraweeView
import com.gh.base.BaseActivity
import com.gh.base.adapter.FragmentAdapter
import com.gh.base.fragment.BaseFragment_TabLayout
import com.gh.base.fragment.BaseFragment_TabLayout.createDefaultTabCustomView
import com.gh.common.exposure.ExposureEvent
import com.gh.common.util.*
import com.gh.common.view.FlexLinearLayout
@ -49,7 +45,6 @@ import com.gh.gamecenter.gamedetail.video.TopVideoView
import com.gh.gamecenter.mvvm.Status
import com.gh.gamecenter.normal.NormalFragment
import com.gh.gamecenter.packagehelper.PackageViewModel
import com.gh.gamecenter.subject.SubjectActivity
import com.gh.gamecenter.suggest.SuggestType
import com.gh.gamecenter.tag.TagsActivity
import com.google.android.material.appbar.AppBarLayout
@ -266,8 +261,8 @@ class GameDetailFragment : NormalFragment() {
if (mFirstTimeSelected) {
when (position) {
INDEX_DESC -> MtaHelper.onEvent("游戏详情_新", "默认[详情]", mGameEntity!!.name)
INDEX_TRENDES -> MtaHelper.onEvent("游戏详情_新", "默认[专区]", mGameEntity!!.name)
else -> MtaHelper.onEvent("游戏详情_新", "默认[评论]", mGameEntity!!.name)
// INDEX_TRENDES -> MtaHelper.onEvent("游戏详情_新", "默认[专区]", mGameEntity!!.name)
// else -> MtaHelper.onEvent("游戏详情_新", "默认[评论]", mGameEntity!!.name)
}
mFirstTimeSelected = false
} else {
@ -513,7 +508,7 @@ class GameDetailFragment : NormalFragment() {
for (i in 0 until mTabLayout.tabCount) {
val tab = mTabLayout.getTabAt(i) ?: continue
val tabTitle = if (tab.text != null) tab.text.toString() else ""
val tabView = createDefaultTabCustomView(tabTitle)
val tabView = getTabView(tabTitle)
tab.customView = tabView
}
@ -785,15 +780,12 @@ class GameDetailFragment : NormalFragment() {
fun onEventMainThread(reuse: EBReuse) {
if (SKIP_DESC == reuse.type) {
tabPerformClick(INDEX_DESC)
MtaHelper.onEvent("游戏详情_新", "默认_介绍", mGameEntity!!.name)
} else if (OPEN_APPBAR == reuse.type && !mIsTouchScreen) {
mAppBarLayout.setExpanded(true, true)
} else if (SKIP_FULI == reuse.type) {
mViewPager.currentItem = INDEX_TRENDES
MtaHelper.onEvent("游戏详情_新", "默认_动态", mGameEntity!!.name)
} else if (SKIP_RATING == reuse.type) {
mViewPager.currentItem = INDEX_RATING
MtaHelper.onEvent("游戏详情_新", "默认_评分", mGameEntity!!.name)
} else if ("hideKaifuHint" == reuse.type) {
mIsShowKaifuHint = false
mKaifuHint.visibility = View.GONE
@ -896,6 +888,15 @@ class GameDetailFragment : NormalFragment() {
updateDownloadCountHint(mPackageViewModel.filterSameUpdateLiveData.value)
}
private fun getTabView(title: String): View {
val view = LayoutInflater.from(HaloApp.getInstance().application.baseContext).inflate(R.layout.tab_item_gamedetail, null)
val tabTitle = view.findViewById<View>(R.id.tab_title)
if (tabTitle is CheckedTextView) {
tabTitle.setText(title)
}
return view
}
private fun pauseVideo() {
if (mViewModel.displayTopVideo) {
mTopVideoView.onVideoPause()

View File

@ -15,6 +15,7 @@ import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import anet.channel.util.Utils.context
import com.gh.base.OnListClickListener
import com.gh.common.util.*
import com.gh.common.view.GridSpacingItemColorDecoration
@ -202,7 +203,9 @@ class DescAdapter(context: Context,
private fun bindCustomColumnViewHolder(viewHolder: GameDetailCustomColumnViewHolder, detailEntity: DetailEntity) {
val customColumn = detailEntity.customColumn!!
val tags = if (customColumn.showInfoTag == true) customColumn.infoTag else arrayListOf()
val maxDesLines = if (mExpandSparseBooleanArray.get(viewHolder.adapterPosition)) { Int.MAX_VALUE } else {
val maxDesLines = if (mExpandSparseBooleanArray.get(viewHolder.adapterPosition)) {
Int.MAX_VALUE
} else {
when {
customColumn.showDesType == "all" || customColumn.showDesRowNum == 0 -> {
Int.MAX_VALUE
@ -255,7 +258,7 @@ class DescAdapter(context: Context,
viewHolder.binding.titleHintTv.performClick()
}
viewHolder.binding.titleHintTv.setOnClickListener {
MtaHelper.onEvent("游戏详情_新", "自定义栏目标题后跳转", "${gameName}-${customColumn.name}-${customColumn.nameLink}")
MtaHelper.onEvent("游戏详情_新", "自定义栏目标题后跳转", "${gameName}-${customColumn.name}-${customColumn.nameLink?.value}")
DirectUtils.directToLinkPage(mContext, customColumn.nameLink!!, StringUtils.buildString(mEntrance, "游戏详情[", gameName, "]:自定义栏目"), "")
}
@ -275,6 +278,7 @@ class DescAdapter(context: Context,
if (subjectAdapter == null) {
viewHolder.binding.galleryRv.layoutManager = GridLayoutManager(mContext, 4)
subjectAdapter = GameHorizontalAdapter(mContext, subjectEntity, true)
subjectAdapter.gameName = gameName ?: ""
(viewHolder.binding.galleryRv.itemAnimator as DefaultItemAnimator).supportsChangeAnimations = false
viewHolder.binding.galleryRv.adapter = subjectAdapter
} else {
@ -354,8 +358,8 @@ class DescAdapter(context: Context,
params.rightMargin = 0
layoutParams = params
layoutManager = LinearLayoutManager(mContext, RecyclerView.HORIZONTAL, false)
val gameGalleryAdapter = GameGalleryAdapter(mContext, videos, null, gameName!!,
StringUtils.buildString(mEntrance, "+(游戏详情[", gameName, "]:游戏介绍)"))
val gameGalleryAdapter = GameGalleryAdapter(mContext, videos, null, mViewModel.game!!,
StringUtils.buildString(mEntrance, "+(游戏详情[", gameName, "]:视频)"))
adapter = gameGalleryAdapter
val snapHelper = LeftPagerSnapHelper(0)
snapHelper.attachToRecyclerView(this)
@ -373,6 +377,7 @@ class DescAdapter(context: Context,
viewHolder.binding.moreTv.visibleIf(videoCount >= 3)
viewHolder.binding.moreTv.setOnClickListener {
MtaHelper.onEvent("游戏详情_新", "视频_更多", gameName)
DirectUtils.directToGameVideo(mContext, mViewModel.gameId ?: "", mEntrance, "游戏详情")
}
}
@ -386,8 +391,8 @@ class DescAdapter(context: Context,
params.rightMargin = 0
layoutParams = params
layoutManager = LinearLayoutManager(mContext, RecyclerView.HORIZONTAL, false)
val gameGalleryAdapter = GameGalleryAdapter(mContext, null, gallery, gameName!!,
StringUtils.buildString(mEntrance, "+(游戏详情[", gameName, "]:游戏介绍)"))
val gameGalleryAdapter = GameGalleryAdapter(mContext, null, gallery, mViewModel.game!!,
StringUtils.buildString(mEntrance, "+(游戏详情[", gameName, "]:图片)"))
adapter = gameGalleryAdapter
}
}
@ -412,6 +417,7 @@ class DescAdapter(context: Context,
?: GameEntity(), mEntrance, "更新内容")
mContext.startActivity(intent)
}
holder.binding.historyVersionTv.goneIf(updateContent?.historyApkStatus != "on")
holder.binding.contentTv.setExpandCallback {
MtaHelper.onEvent("游戏详情_新", "展开更新内容", gameName)
}

View File

@ -131,6 +131,7 @@ class DescCommentsAdapter(context: Context,
MtaHelper.onEvent("游戏详情_新", "玩家评论_复制", mViewModel.game?.name)
}
"修改" -> {
MtaHelper.onEvent("游戏详情_新", "玩家评论_修改", mViewModel.game?.name)
val intent = RatingEditActivity.getPatchIntent(mContext, mViewModel.game!!, commentData)
SyncDataBetweenPageHelper.startActivityForResult(mContext, intent, RatingFragment.RATING_PATCH_REQUEST, position)
}

View File

@ -2,6 +2,8 @@ package com.gh.gamecenter.gamedetail.desc
import android.annotation.SuppressLint
import android.app.Application
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
@ -18,6 +20,8 @@ import com.gh.gamecenter.gamedetail.entity.CustomColumn
import com.gh.gamecenter.gamedetail.entity.DetailEntity
import com.gh.gamecenter.retrofit.Response
import com.gh.gamecenter.retrofit.RetrofitManager
import com.squareup.picasso.Picasso
import com.squareup.picasso.Target
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
@ -204,9 +208,30 @@ class DescViewModel(application: Application,
}
}
loadCustomColumnImageInAdvance(detailEntityList)
return detailEntityList
}
/**
* 预加载自定义栏目的标签小图标
*/
private fun loadCustomColumnImageInAdvance(detailEntityList: ArrayList<DetailEntity>) {
for (item in detailEntityList) {
if (item.type == DetailEntity.Type.CUSTOM_COLUMN.value) {
item.customColumn?.infoTag?.let {
for (tag in it) {
Picasso.with(getApplication()).load(tag.icon).into(object : Target {
override fun onPrepareLoad(placeHolderDrawable: Drawable?) {}
override fun onBitmapFailed(errorDrawable: Drawable?) {}
override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) {}
})
}
}
}
}
}
class Factory(private val mApplication: Application,
private val game: GameEntity?) : ViewModelProvider.NewInstanceFactory() {
override fun <T : ViewModel> create(modelClass: Class<T>): T {

View File

@ -4,7 +4,6 @@ import android.content.Context
import android.graphics.Bitmap
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable
import android.net.Uri
import android.text.Spanned
import android.view.View
import android.view.ViewGroup
@ -46,10 +45,13 @@ class GameDetailCustomColumnAdapter(context: Context)
val marginBetweenIconAndName = " "
val content = if (mShowTagDes) "$marginBetweenIconAndName$name $des" else "$marginBetweenIconAndName$name"
val spannable = SpanBuilder(content).color(marginBetweenIconAndName.length, name?.length?.plus(marginBetweenIconAndName.length) ?: 1, color
?: "#000000").build()
val spannable = SpanBuilder(content)
.color(marginBetweenIconAndName.length,
name?.length?.plus(marginBetweenIconAndName.length) ?: 1,
color ?: "#000000")
.build()
Picasso.with(mContext).load(Uri.parse(icon))
Picasso.with(mContext).load(icon)
.priority(Picasso.Priority.HIGH)
.into(object : Target {
override fun onPrepareLoad(placeHolderDrawable: Drawable?) {

View File

@ -56,7 +56,7 @@ class GameDetailInfoItemAdapter(val context: Context, gameInfo: GameInfo, privat
"求更新" -> {
MtaHelper.onEvent("游戏详情_新", "详细信息_我要求更新", gameName)
DialogUtils.showTrackableDialog(context, "版本求更新", "如果游戏上线了新版本,您可以提交申请,让小助手尽快更新版本喔!",
"提交申请", "取消退出", {
"提交申请", "取消", {
mViewModel.sendSuggestion()
MtaHelper.onEvent("版本求更新", "弹窗", "点击提交申请")
MtaHelper.onEvent("版本求更新", "提交申请", gameName)

View File

@ -15,12 +15,13 @@ import com.gh.gamecenter.R
import com.gh.gamecenter.ViewImageActivity
import com.gh.gamecenter.databinding.GalleryVideoItemBinding
import com.gh.gamecenter.entity.GameDetailEntity
import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.video.detail.VideoDetailContainerViewModel
class GameGalleryAdapter(var context: Context,
private val mVideo: ArrayList<GameDetailEntity.Video>? = null,
private val mGallery: ArrayList<String>? = null,
private val mGameName: String,
val mGame: GameEntity,
private val mEntrance: String) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
var mLayoutInflater: LayoutInflater = (context as Activity).layoutInflater
@ -62,7 +63,7 @@ class GameGalleryAdapter(var context: Context,
}
holder.itemView.setOnClickListener {
DataCollectionUtils.uploadClick(context, "游戏介绍", "游戏详情")
MtaHelper.onEvent("游戏详情_新", "点击游戏截图", mGameName)
MtaHelper.onEvent("游戏详情_新", "点击游戏截图", mGame.name)
val intent = ViewImageActivity.getViewImageIntent(context, mGallery, holder.adapterPosition, mEntrance)
context.startActivity(intent)
@ -74,9 +75,10 @@ class GameGalleryAdapter(var context: Context,
holder.binding.usernameTv.text = video?.user?.name
holder.binding.videoTitleTv.text = video?.title
holder.binding.screenshotItemIv.setOnClickListener {
MtaHelper.onEvent("游戏详情_新", "点击视频", "${mGameName}+${video?.title}")
// DirectUtils.directToVideoDetail(holder.binding.root.context, video?.videoId
// ?: "", VideoDetailContainerViewModel.Location.VIDEO_HOT.value, path = "游戏详情-视频")
MtaHelper.onEvent("游戏详情_新", "点击视频", "${mGame.name}+${video?.title}")
DirectUtils.directToVideoDetail(context, video?.videoId
?: "", VideoDetailContainerViewModel.Location.GAME_DETAIL.value,
false, mGame.id, mEntrance, "游戏详情")
}
}
}

View File

@ -50,7 +50,7 @@ class GameLibaoAdapter(val context: Context, val libaos: ArrayList<LibaoEntity>,
val available = libaoEntity.available
if (total != 0) {
holder.binding.libaoSchedulePb.progress = (((total - available) / total.toFloat()) * 100).toInt()
holder.binding.remainingTv.text = String.format(Locale.CHINA, "剩余%.2f", ((available) / total.toFloat()) * 100) + "%"
holder.binding.remainingTv.text = String.format(Locale.CHINA, "剩余%.1f", ((available) / total.toFloat()) * 100) + "%"
}
LibaoUtils.setLiBaoBtnStatusRound(holder.binding.receiveTv, libaoEntity.status, context)
holder.itemView.setOnClickListener {

View File

@ -54,7 +54,7 @@ class GameDetailAnswerAdapter(context: Context,
HaloApp.put(Constants.GAME_DETAIL_COME_IN, true)
MtaHelper.onEvent("进入问答", "游戏详情", mViewModel.gameCommunity?.name + "+" + mViewModel.game?.name)
if ("community_article" == entity.type) {
MtaHelper.onEvent("游戏详情_新", "点击文章", mViewModel.game?.name + "+" + entity.questions.title)
MtaHelper.onEvent("游戏详情_新", "点击社区文章", mViewModel.game?.name + "+" + entity.questions.title)
mContext.startActivity(ArticleDetailActivity.getIntent(mContext, CommunityEntity(entity.articleCommunityId, ""), entity.id!!, mEntrance, path))
} else {
MtaHelper.onEvent("游戏详情_新", "点击问题", mViewModel.game?.name + "+" + entity.questions.title)
@ -66,7 +66,7 @@ class GameDetailAnswerAdapter(context: Context,
HaloApp.put(Constants.GAME_DETAIL_COME_IN, true)
MtaHelper.onEvent("进入问答", "游戏详情", mViewModel.gameCommunity?.name + "+" + mViewModel.game?.name)
if ("community_article" == entity.type) {
MtaHelper.onEvent("游戏详情_新", "点击文章", mViewModel.game?.name + "+" + entity.questions.title)
MtaHelper.onEvent("游戏详情_新", "点击社区文章", mViewModel.game?.name + "+" + entity.questions.title)
mContext.startActivity(ArticleDetailActivity.getIntent(mContext, CommunityEntity(entity.articleCommunityId, ""), entity.id!!, mEntrance, path))
} else {
MtaHelper.onEvent("游戏详情_新", "点击回答", mViewModel.game?.name + "+" + StringUtils.shrinkStringWithDot(entity.brief, 10))

View File

@ -42,7 +42,7 @@ class HistoryApkListAdapter(context: Context, private var mViewModel: HistoryApk
view = mLayoutInflater.inflate(R.layout.item_history_apk, parent, false)
HistoryApkViewHolder(ItemHistoryApkBinding.bind(view))
}
else -> throw NullPointerException()
else -> throw IllegalAccessException("No viewType is matched.")
}
}
@ -54,6 +54,7 @@ class HistoryApkListAdapter(context: Context, private var mViewModel: HistoryApk
val maxDesLines = if (mExpandSparseBooleanArray.get(holder.adapterPosition)) Int.MAX_VALUE else 1
holder.binding.apk = apkEntity
holder.binding.versionTv.text = "版本${apkEntity.version}"
holder.binding.updateDescTv.setExpandMaxLines(maxDesLines)
holder.binding.updateDescTv.setIsExpanded(maxDesLines == Int.MAX_VALUE)
holder.binding.releaseDateTv.text = TimeUtils.getFormatTime(apkEntity.updateTime, "yyyy.MM.dd")
@ -105,6 +106,8 @@ class HistoryApkListAdapter(context: Context, private var mViewModel: HistoryApk
if (PackagesManager.isInstalledWithSpecificVersion(apkEntity.packageName, apkEntity.version
?: "")) {
setText(R.string.launch)
} else {
setText(R.string.download)
}
}
}
@ -169,7 +172,7 @@ class HistoryApkListAdapter(context: Context, private var mViewModel: HistoryApk
private fun setDownloadBtnStatus(context: Context, gameEntity: GameEntity, downloadBtn: TextView) {
val status = GameUtils.getSimpleDownloadBtnText(context, gameEntity)
downloadBtn.text = status
if ("启动" == status) {
if ("下载中" == status) {
downloadBtn.setBackgroundResource(R.drawable.detail_download_open_style)
downloadBtn.setTextColor(ContextCompat.getColor(context, R.color.theme_font))
} else {

View File

@ -48,7 +48,7 @@ class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseR
val p = Pattern.compile(LABEL_REGEX)
val m = p.matcher(commentData.content)
if (m.find()) {
val contents = TextHelper.getCommentLabelSpannableStringBuilder(commentData.content,R.color.theme_font)
val contents = TextHelper.getCommentLabelSpannableStringBuilder(commentData.content, R.color.theme_font)
content.setTextWithHighlightedTextWrappedInsideWrapper(text = contents, copyClickedText = true)
} else {
content.setTextWithHighlightedTextWrappedInsideWrapper(text = commentData.content, copyClickedText = true)
@ -183,6 +183,7 @@ class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseR
commentData.content.replace(RatingEditActivity.LABEL_REPLACE_REGEX.toRegex(), "").copyTextAndToast()
}
"修改" -> {
if (path == "游戏详情:评分") MtaHelper.onEvent("游戏详情_新", "评论Tab_修改", game?.name)
val intent = RatingEditActivity.getPatchIntent(context, game!!, commentData)
SyncDataBetweenPageHelper.startActivityForResult(context, intent, RatingFragment.RATING_PATCH_REQUEST, dataPosition)
}

View File

@ -1889,6 +1889,12 @@ public interface ApiService {
@POST("videos/stream?page_size=20")
Single<ArrayList<VideoEntity>> getVideoStream(@Query("type") String type, @Body RequestBody cacheVideoIds, @Query("video_id") String videoId, @Query("cache_id") String cacheId, @Query("page") int page);
/**
* 游戏详情视频流播放算法
*/
@POST("videos/stream?page_size=20")
Single<ArrayList<VideoEntity>> getGameDetailVideoStream(@Query("type") String type, @Body RequestBody cacheVideoIds, @Query("video_id") String videoId, @Query("game_id") String gameId, @Query("page") int page);
/**
* 获取最新排序的视频流首页最新Tab
*/

View File

@ -69,7 +69,8 @@ class VideoDetailContainerViewModel(application: Application) : AndroidViewModel
fun getVideoDetailList(videoId: String, location: String, isLoadNext: Boolean) {
when (location) {
Location.VIDEO_CHOICENESS.value,
Location.VIDEO_HOT.value -> {
Location.VIDEO_HOT.value,
Location.GAME_DETAIL.value -> {
if (isLoadNext) {
getVideoStream(location, videoId)
}
@ -186,8 +187,13 @@ class VideoDetailContainerViewModel(application: Application) : AndroidViewModel
if (cacheId.isEmpty()) {
cacheId = "${Util_System_Phone_State.getImei(HaloApp.getInstance().application)}${System.currentTimeMillis()}${Random.nextInt(9999)}"
}
RetrofitManager.getInstance(getApplication())
.api.getVideoStream(type, body, videoId, cacheId, page)
if (type == Location.GAME_DETAIL.value) {
RetrofitManager.getInstance(getApplication())
.api.getGameDetailVideoStream(type, body, videoId, gameId, page)
} else {
RetrofitManager.getInstance(getApplication())
.api.getVideoStream(type, body, videoId, cacheId, page)
}
}.subscribeOn(Schedulers.io())
.subscribe(object : BiResponse<ArrayList<VideoEntity>>() {
override fun onSuccess(data: ArrayList<VideoEntity>) {
@ -443,6 +449,9 @@ class VideoDetailContainerViewModel(application: Application) : AndroidViewModel
* v375新增 [https://gitlab.ghzs.com/halo/halo-api/wikis/v3.7.5/api-v3.7.5#get-videosstream]
* newest 获取最新排序的视频流
* activity_video 获取活动的视频流
*
* v400新增[https://gitlab.ghzs.com/halo/halo-api/-/wikis/v4.0.0/API-v4.0.0#post-videosstream]
* game_detail 游戏详情视频流播放算法,使用场景:游戏详情
*/
enum class Location(val value: String) {
HOTTEST_GAME_VIDEO("hottest_game_video"),
@ -463,7 +472,9 @@ class VideoDetailContainerViewModel(application: Application) : AndroidViewModel
VIDEO_NEWEST("newest"),
VIDEO_ACTIVITY("activity_video")
VIDEO_ACTIVITY("activity_video"),
GAME_DETAIL("game_detail")
}
}

View File

@ -11,8 +11,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/ECF6FF"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:paddingTop="9dp"
android:paddingBottom="9dp"
android:visibility="gone">
<TextView
@ -21,6 +21,7 @@
android:layout_centerVertical="true"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:includeFontPadding="false"
android:text="@string/history_apk_hint"
android:textColor="@color/text_1383EB"
android:textSize="12sp" />

View File

@ -7,12 +7,11 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="20dp"
android:paddingTop="16dp"
android:paddingTop="12dp"
android:paddingRight="20dp"
android:paddingBottom="11dp"
android:background="@color/white">
<TextView
android:id="@+id/titleTv"
android:layout_width="wrap_content"
@ -24,12 +23,11 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.gh.common.view.ExpandTextView
android:id="@+id/contentTv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="13dp"
android:layout_marginTop="7dp"
android:textSize="13sp"
android:textColor="@color/text_333333"
android:maxLines="4"
@ -49,8 +47,10 @@
app:layout_constraintTop_toBottomOf="@+id/contentTv"
app:layout_constraintStart_toStartOf="parent"
android:textColor="@color/theme_font"
android:layout_marginTop="14dp"
android:layout_marginTop="6dp"
android:textSize="13sp"
android:visibility="gone"
tools:visibility="visible"
android:text="历史版本 >"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -37,7 +37,6 @@
android:id="@+id/versionTv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{apk.version}"
android:textColor="@color/text_999999"
android:textSize="12sp"
app:layout_constraintBottom_toBottomOf="@id/downloadBtn"
@ -61,7 +60,7 @@
android:id="@+id/updateDescTv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:layout_marginTop="9dp"
android:includeFontPadding="false"
android:lineSpacingExtra="4dp"
android:maxLines="1"

View File

@ -134,9 +134,9 @@
android:textSize="14sp"
android:textStyle="bold"
app:layout_constrainedWidth="true"
android:shadowColor="#B3000000"
android:shadowColor="#0D000000"
android:shadowDx="0"
android:shadowDy="3"
android:shadowDy="0.5"
android:shadowRadius="1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/sdv_user_badge"
@ -185,9 +185,9 @@
android:lineSpacingExtra="4dp"
android:textColor="@color/white"
android:textSize="14sp"
android:shadowColor="#B3000000"
android:shadowColor="#0D000000"
android:shadowDx="0"
android:shadowDy="3"
android:shadowDy="0.5"
android:shadowRadius="1"
tools:text="举例:比如切换之前,当前视频已播放了 切换App或者回到手机桌面在切换回光环助手要从开始播放" />

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="37dp"
android:gravity="center">
<CheckedTextView
android:id="@+id/tab_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:textColor="@color/text_tabbar_style"
android:textSize="14dp"
tools:text="详情" />
</LinearLayout>