光环助手V3.7.0-游戏视频功能-前端5(问答相关)(2)https://gitlab.ghzs.com/pm/halo-app-issues/issues/626

This commit is contained in:
kehaoyuan
2019-10-06 17:35:06 +08:00
parent 9b069a97d1
commit 6ae6a4e14a
22 changed files with 857 additions and 616 deletions

View File

@ -6,7 +6,6 @@ import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
@ -29,6 +28,7 @@ import com.gh.common.util.PlatformUtils;
import com.gh.common.util.StringUtils;
import com.gh.common.view.DownloadDialog;
import com.gh.common.view.DownloadProgressBar;
import com.gh.common.view.DrawableView;
import com.gh.download.DownloadManager;
import com.gh.gamecenter.DownloadManagerActivity;
import com.gh.gamecenter.R;
@ -41,7 +41,7 @@ import com.gh.gamecenter.entity.PluginLocation;
import com.gh.gamecenter.entity.ServerCalendarEntity;
import com.gh.gamecenter.eventbus.EBReuse;
import com.gh.gamecenter.manager.PackagesManager;
import com.halo.assistant.HaloApp;
import com.gh.gamecenter.qa.entity.CommunityVideoEntity;
import com.lightgame.download.DownloadEntity;
import com.lightgame.download.FileUtils;
import com.lightgame.utils.Utils;
@ -512,4 +512,30 @@ public class BindingAdapters {
}
}
@BindingAdapter({"setCommunityImage", "setCommunityVideoImage"})
public static void setCommunityImage(SimpleDraweeView imageView, List<String> images, List<CommunityVideoEntity> videos) {
if (videos.size() > 0) {
CommunityVideoEntity videoEntity = videos.get(0);
ImageUtils.display(imageView, videoEntity.getPoster());
imageView.setVisibility(View.VISIBLE);
} else if (images.size() > 0) {
imageView.setVisibility(View.VISIBLE);
ImageUtils.display(imageView, images.get(0));
} else {
imageView.setVisibility(View.GONE);
}
}
@BindingAdapter({"setCommunityVideoDuration"})
public static void setCommunityVideoDuration(TextView mVideoDuration, List<CommunityVideoEntity> videos) {
if (videos != null && videos.size() > 0) {
CommunityVideoEntity videoEntity = videos.get(0);
mVideoDuration.setBackground(DrawableView.getOvalDrawable(R.color.black_alpha_80, 999F));
mVideoDuration.setText(videoEntity.getDuration());
mVideoDuration.setVisibility(View.VISIBLE);
} else {
mVideoDuration.setVisibility(View.GONE);
}
}
}

View File

@ -17,15 +17,15 @@ import com.gh.gamecenter.room.dao.GameDao
import com.gh.gamecenter.room.dao.NewsHistoryDao
import com.halo.assistant.HaloApp
@Database(entities = [AnswerEntity::class, ArticleEntity::class, NewsEntity::class, HistoryGameEntity::class], version = 3, exportSchema = false)
@TypeConverters(*[
CountConverter::class,
CommunityConverter::class,
TimeConverter::class,
AnswerUserConverter::class,
ThumbnailConverter::class,
TagStyleListConverter::class,
StringArrayListConverter::class])
@Database(entities = [AnswerEntity::class, ArticleEntity::class, NewsEntity::class, HistoryGameEntity::class], version = 4, exportSchema = false)
@TypeConverters(CountConverter::class,
CommunityConverter::class,
TimeConverter::class,
AnswerUserConverter::class,
ThumbnailConverter::class,
TagStyleListConverter::class,
StringArrayListConverter::class,
CommunityVideoConverter::class)
abstract class HistoryDatabase : RoomDatabase() {
@ -42,9 +42,16 @@ abstract class HistoryDatabase : RoomDatabase() {
}
}
val MIGRATION_3_4: Migration = object : Migration(3, 4) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("Alter TABLE ArticleEntity add videos TEXT")
}
}
val instance by lazy {
Room.databaseBuilder(HaloApp.getInstance().application, HistoryDatabase::class.java, "USER_TRACK_HISTORY_DATABASE")
.addMigrations(MIGRATION_2_3)
.addMigrations(MIGRATION_3_4)
.build()
}
}

View File

@ -1,5 +1,6 @@
package com.gh.gamecenter.entity
import com.gh.gamecenter.qa.entity.CommunityVideoEntity
import com.google.gson.annotations.SerializedName
data class PersonalHistoryEntity(
@ -12,6 +13,7 @@ data class PersonalHistoryEntity(
val time: Long = 0,
val title: String = "",
val community: CommunityEntity = CommunityEntity(),
var videos: List<CommunityVideoEntity> = ArrayList(),
var user: PersonalEntity? = null,
@SerializedName("fold_users")
var foldUsers: List<UserEntity>? = null,

View File

@ -23,7 +23,7 @@ class MyArticleAdapter(context: Context,
return ItemViewType.ITEM_BODY
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): androidx.recyclerview.widget.RecyclerView.ViewHolder {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val view: View
return when (viewType) {
ItemViewType.ITEM_FOOTER -> {
@ -41,7 +41,7 @@ class MyArticleAdapter(context: Context,
return if (mEntityList.size == 0) 0 else mEntityList.size + 1
}
override fun onBindViewHolder(holder: androidx.recyclerview.widget.RecyclerView.ViewHolder, position: Int) {
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is ArticleViewHolder) {
val entity = mEntityList[position]
holder.binding.data = entity

View File

@ -26,7 +26,7 @@ class HotAdapter(context: Context,
return if (position == itemCount - 1) ItemViewType.ITEM_FOOTER else ItemViewType.ITEM_BODY
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): androidx.recyclerview.widget.RecyclerView.ViewHolder {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
ItemViewType.ITEM_FOOTER -> {
FooterViewHolder(mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false))
@ -41,7 +41,7 @@ class HotAdapter(context: Context,
return if (mEntityList == null || mEntityList.isEmpty()) 0 else mEntityList.size + ListAdapter.FOOTER_ITEM_COUNT
}
override fun onBindViewHolder(holder: androidx.recyclerview.widget.RecyclerView.ViewHolder, position: Int) {
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is AskQuestionsRecommendsViewHolder) {
val answerEntity = mEntityList[position]
if ("community_article" == answerEntity.type) {

View File

@ -26,7 +26,7 @@ class RecommendsAdapter(context: Context,
return if (position == itemCount - 1) ItemViewType.ITEM_FOOTER else ItemViewType.ITEM_BODY
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): androidx.recyclerview.widget.RecyclerView.ViewHolder {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
ItemViewType.ITEM_FOOTER -> {
FooterViewHolder(mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false))
@ -41,7 +41,7 @@ class RecommendsAdapter(context: Context,
return if (mEntityList == null || mEntityList.isEmpty()) 0 else mEntityList.size + ListAdapter.FOOTER_ITEM_COUNT
}
override fun onBindViewHolder(holder: androidx.recyclerview.widget.RecyclerView.ViewHolder, position: Int) {
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is AskQuestionsRecommendsViewHolder) {
val answerEntity = mEntityList[position]
if ("community_article" == answerEntity.type) {

View File

@ -21,7 +21,7 @@ class UnansweredAdapter(context: Context,
return if (position == itemCount - 1) ItemViewType.ITEM_FOOTER else ItemViewType.ITEM_BODY
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): androidx.recyclerview.widget.RecyclerView.ViewHolder {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
ItemViewType.ITEM_FOOTER -> {
FooterViewHolder(mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false))
@ -36,7 +36,7 @@ class UnansweredAdapter(context: Context,
return if (mEntityList == null || mEntityList.isEmpty()) 0 else mEntityList.size + ListAdapter.FOOTER_ITEM_COUNT
}
override fun onBindViewHolder(holder: androidx.recyclerview.widget.RecyclerView.ViewHolder, position: Int) {
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is AskQuestionsNewViewHolder) {
val questions = mEntityList[position]
holder.initAskQuestionsNewViewHolder(questions)

View File

@ -8,6 +8,7 @@ import android.os.Parcelable
import androidx.annotation.NonNull
import com.gh.gamecenter.entity.UserEntity
import com.gh.gamecenter.room.converter.AnswerUserConverter
import com.gh.gamecenter.room.converter.CommunityVideoConverter
import com.gh.gamecenter.room.converter.ListStringConverter
import com.gh.gamecenter.room.converter.QuestionsConverter
import com.google.gson.annotations.SerializedName
@ -41,6 +42,9 @@ class AnswerEntity() : Parcelable {
@TypeConverters(ListStringConverter::class)
var images: List<String> = ArrayList()
@TypeConverters(CommunityVideoConverter::class)
var videos: List<CommunityVideoEntity> = ArrayList()
var vote: Int = 0
@TypeConverters(AnswerUserConverter::class)

View File

@ -4,8 +4,10 @@ import androidx.room.Entity
import androidx.room.Ignore
import androidx.room.PrimaryKey
import android.os.Parcelable
import androidx.room.TypeConverters
import com.gh.gamecenter.entity.CommunityEntity
import com.gh.gamecenter.entity.UserEntity
import com.gh.gamecenter.room.converter.CommunityVideoConverter
import com.google.gson.annotations.SerializedName
import kotlinx.android.parcel.Parcelize
@ -21,6 +23,8 @@ data class ArticleEntity(
var orderTag: Long = 0,
@Ignore
var images: List<String> = ArrayList(),
@TypeConverters(CommunityVideoConverter::class)
var videos: List<CommunityVideoEntity> = ArrayList(),
var count: Count = Count(),
var community: CommunityEntity = CommunityEntity(),
var time: TimeEntity? = TimeEntity(),

View File

@ -0,0 +1,10 @@
package com.gh.gamecenter.qa.entity
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
@Parcelize
data class CommunityVideoEntity(val id: String = "",
val url: String = "",
val duration: String = "",
val poster: String = "") : Parcelable

View File

@ -16,6 +16,6 @@ data class Questions(@SerializedName("_id")
@SerializedName("answer_count")
var answerCount: Int = 0,
var description: String? = null,
var images: List<String> = ArrayList(),
var images: ArrayList<String> = ArrayList(),
val time: Long = 0,
val count: Count = Count()) : Parcelable

View File

@ -2,7 +2,9 @@ package com.gh.gamecenter.qa.questions.detail;
import android.content.Context;
import android.graphics.Paint;
import androidx.core.content.ContextCompat;
import android.view.View;
import android.widget.TextView;
@ -12,10 +14,12 @@ import com.gh.base.OnListClickListener;
import com.gh.common.util.ImageUtils;
import com.gh.common.util.NewsUtils;
import com.gh.common.util.NumberUtils;
import com.gh.common.view.DrawableView;
import com.gh.gamecenter.PersonalHomeActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.entity.UserEntity;
import com.gh.gamecenter.qa.entity.AnswerEntity;
import com.gh.gamecenter.qa.entity.CommunityVideoEntity;
import java.util.List;
@ -49,6 +53,10 @@ public class AnswerViewHolder extends BaseRecyclerViewHolder<AnswerEntity> {
View mUserIconContainer;
@BindView(R.id.ask_answer_item_end_desc)
TextView mEndDescTv;
@BindView(R.id.ask_answer_item_video_duration)
TextView mVideoDuration;
@BindView(R.id.ask_answer_item_video_play)
View mVideoPlayIcon;
public AnswerViewHolder(View itemView, OnListClickListener listClickListener) {
super(itemView, listClickListener);
@ -74,22 +82,7 @@ public class AnswerViewHolder extends BaseRecyclerViewHolder<AnswerEntity> {
} else {
ImageUtils.display(mBadgeIcon, "");
}
List<String> images = entity.getImages();
if (images.size() > 0) {
for (int i = 0; i < images.size(); i++) {
if (!images.get(i).contains(".gif")) {
mImg.setVisibility(View.VISIBLE);
ImageUtils.display(mImg, images.get(i));
break;
}
if (i == images.size() - 1) {
mImg.setVisibility(View.GONE);
}
}
} else {
mImg.setVisibility(View.GONE);
}
setAnswerImage(entity.getImages(), entity.getVideos());
if (entity.getTime() != null && entity.getTime() != 0) {
mEndDescTv.setText(NewsUtils.getFormattedTime(entity.getTime()));
}
@ -123,21 +116,7 @@ public class AnswerViewHolder extends BaseRecyclerViewHolder<AnswerEntity> {
} else {
ImageUtils.display(mBadgeIcon, "");
}
List<String> images = entity.getImages();
if (images.size() > 0) {
for (int i = 0; i < images.size(); i++) {
if (!images.get(i).contains(".gif")) {
mImg.setVisibility(View.VISIBLE);
ImageUtils.display(mImg, images.get(i));
break;
}
if (i == images.size() - 1) {
mImg.setVisibility(View.GONE);
}
}
} else {
mImg.setVisibility(View.GONE);
}
setAnswerImage(entity.getImages(), entity.getVideos());
skipPersonalHome(entity, entrance, "我的收藏-回答");
}
@ -152,8 +131,19 @@ public class AnswerViewHolder extends BaseRecyclerViewHolder<AnswerEntity> {
mCommunityName.setText(entity.getCommunityName());
mCommentCount.setText(String.format("%s 评论", NumberUtils.transSimpleCount(entity.getCommentCount())));
mVotecount.setText(itemView.getContext().getString(R.string.ask_vote_count, NumberUtils.transSimpleCount(entity.getVote())));
List<String> images = entity.getImages();
if (images.size() > 0) {
setAnswerImage(entity.getImages(), entity.getVideos());
}
private void setAnswerImage(List<String> images, List<CommunityVideoEntity> videos) {
if (videos.size() > 0) {
CommunityVideoEntity videoEntity = videos.get(0);
ImageUtils.display(mImg, videoEntity.getPoster());
mVideoDuration.setBackground(DrawableView.getOvalDrawable(R.color.black_alpha_80, 999F));
mVideoDuration.setText(videoEntity.getDuration());
mVideoDuration.setVisibility(View.VISIBLE);
mVideoPlayIcon.setVisibility(View.VISIBLE);
mImg.setVisibility(View.VISIBLE);
} else if (images.size() > 0) {
for (int i = 0; i < images.size(); i++) {
if (!images.get(i).contains(".gif")) {
mImg.setVisibility(View.VISIBLE);
@ -164,13 +154,18 @@ public class AnswerViewHolder extends BaseRecyclerViewHolder<AnswerEntity> {
mImg.setVisibility(View.GONE);
}
}
mVideoPlayIcon.setVisibility(View.GONE);
mVideoDuration.setVisibility(View.GONE);
} else {
mImg.setVisibility(View.GONE);
mVideoPlayIcon.setVisibility(View.GONE);
mVideoDuration.setVisibility(View.GONE);
}
}
private void skipPersonalHome(AnswerEntity entity, String entrance, String path) {
mUsericon.setOnClickListener(v -> PersonalHomeActivity.startTargetActivity(itemView.getContext(), entity.getUser().getId(), entrance, path));
mUsername.setOnClickListener(v -> PersonalHomeActivity.startTargetActivity(itemView.getContext(), entity.getUser().getId(), entrance, path));
View.OnClickListener onClickListener = v -> PersonalHomeActivity.startTargetActivity(itemView.getContext(), entity.getUser().getId(), entrance, path);
mUsericon.setOnClickListener(onClickListener);
mUsername.setOnClickListener(onClickListener);
}
}

View File

@ -10,11 +10,13 @@ import com.gh.base.OnListClickListener;
import com.gh.common.util.ImageUtils;
import com.gh.common.util.NewsUtils;
import com.gh.common.util.NumberUtils;
import com.gh.common.view.DrawableView;
import com.gh.gamecenter.PersonalHomeActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.entity.UserEntity;
import com.gh.gamecenter.qa.entity.AnswerEntity;
import com.gh.gamecenter.qa.entity.ArticleEntity;
import com.gh.gamecenter.qa.entity.CommunityVideoEntity;
import java.util.List;
@ -46,6 +48,10 @@ public class AskQuestionsRecommendsViewHolder extends BaseRecyclerViewHolder<Ans
TextView mAskEndDesc;
@BindView(R.id.ask_item_line)
public View mLine;
@BindView(R.id.ask_item_video_duration)
TextView mVideoDuration;
@BindView(R.id.ask_item_video_play)
View mVideoPlayIcon;
public AskQuestionsRecommendsViewHolder(View itemView, OnListClickListener listClickListener) {
super(itemView, listClickListener);
@ -77,17 +83,11 @@ public class AskQuestionsRecommendsViewHolder extends BaseRecyclerViewHolder<Ans
}
mAskTitle.setText(entity.getQuestions().getTitle());
setAnswerImage(entity.getImages(), entity.getVideos());
List<String> images = entity.getImages();
if (images.size() > 0) {
mAskImg.setVisibility(View.VISIBLE);
ImageUtils.display(mAskImg, images.get(0));
} else {
mAskImg.setVisibility(View.GONE);
}
mAskUsericon.setOnClickListener(v -> PersonalHomeActivity.startTargetActivity(context, entity.getUser().getId(), entrance, path));
mAskUsername.setOnClickListener(v -> PersonalHomeActivity.startTargetActivity(context, entity.getUser().getId(), entrance, path));
View.OnClickListener userClick = v -> PersonalHomeActivity.startTargetActivity(context, entity.getUser().getId(), entrance, path);
mAskUsericon.setOnClickListener(userClick);
mAskUsername.setOnClickListener(userClick);
if (entity.getTime() != null && entity.getTime() != 0) {
mAskEndDesc.setText(NewsUtils.getFormattedTime(entity.getTime()));
@ -112,21 +112,36 @@ public class AskQuestionsRecommendsViewHolder extends BaseRecyclerViewHolder<Ans
}
mAskTitle.setText(entity.getTitle());
setAnswerImage(entity.getImages(), entity.getVideos());
List<String> images = entity.getImages();
if (images.size() > 0) {
mAskImg.setVisibility(View.VISIBLE);
ImageUtils.display(mAskImg, images.get(0));
} else {
mAskImg.setVisibility(View.GONE);
}
mAskUsericon.setOnClickListener(v -> PersonalHomeActivity.startTargetActivity(context, entity.getUser().getId(), entrance, path));
mAskUsername.setOnClickListener(v -> PersonalHomeActivity.startTargetActivity(context, entity.getUser().getId(), entrance, path));
View.OnClickListener userClick = v -> PersonalHomeActivity.startTargetActivity(context, entity.getUser().getId(), entrance, path);
mAskUsericon.setOnClickListener(userClick);
mAskUsername.setOnClickListener(userClick);
if (entity.getTime() != null && entity.getTime().getCreate() != 0) {
mAskEndDesc.setText(NewsUtils.getFormattedTime(entity.getTime().getCreate()));
}
}
private void setAnswerImage( List<String> images, List<CommunityVideoEntity> videos) {
if (videos.size() > 0) {
CommunityVideoEntity videoEntity = videos.get(0);
ImageUtils.display(mAskImg, videoEntity.getPoster());
mVideoDuration.setBackground(DrawableView.getOvalDrawable(R.color.black_alpha_80, 999F));
mVideoDuration.setText(videoEntity.getDuration());
mVideoPlayIcon.setVisibility(View.VISIBLE);
mVideoDuration.setVisibility(View.VISIBLE);
mAskImg.setVisibility(View.VISIBLE);
} else if (images.size() > 0) {
mAskImg.setVisibility(View.VISIBLE);
ImageUtils.display(mAskImg, images.get(0));
mVideoPlayIcon.setVisibility(View.GONE);
mVideoDuration.setVisibility(View.GONE);
} else {
mAskImg.setVisibility(View.GONE);
mVideoPlayIcon.setVisibility(View.GONE);
mVideoDuration.setVisibility(View.GONE);
}
}
}

View File

@ -23,7 +23,11 @@ import com.gh.gamecenter.video.upload.UploadEntity;
/**
* Created by khy on 28/11/17.
*/
@Database(entities = {LoginTokenEntity.class, UserInfoEntity.class, SignEntity.class, AnswerEntity.class, UploadEntity.class}, version = 10, exportSchema = false)
@Database(entities = {LoginTokenEntity.class,
UserInfoEntity.class,
SignEntity.class,
AnswerEntity.class,
UploadEntity.class}, version = 11, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
public abstract AnswerDao answerDao();
@ -107,6 +111,13 @@ public abstract class AppDatabase extends RoomDatabase {
}
};
static final Migration MIGRATION_10_11 = new Migration(10, 11) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("Alter TABLE ArticleEntity add videos TEXT");
}
};
private static AppDatabase buildDatabase(Context context) {
return Room.databaseBuilder(context, AppDatabase.class, DATABASE_NAME)
.addMigrations(
@ -116,7 +127,8 @@ public abstract class AppDatabase extends RoomDatabase {
MIGRATION_6_7,
MIGRATION_7_8,
MIGRATION_8_9,
MIGRATION_9_10)
MIGRATION_9_10,
MIGRATION_10_11)
// 不允许主线程查询
.allowMainThreadQueries()
// // 提供db升级的策略而不是强行销毁

View File

@ -0,0 +1,19 @@
package com.gh.gamecenter.room.converter
import androidx.room.TypeConverter
import com.gh.common.util.toJson
import com.gh.common.util.toObject
import com.gh.gamecenter.qa.entity.CommunityVideoEntity
class CommunityVideoConverter {
@TypeConverter
fun toCommunityVideoString(data: List<CommunityVideoEntity>?): String {
return data?.toJson() ?: ""
}
@TypeConverter
fun toCommunityVideoEntity(token: String?): List<CommunityVideoEntity> {
return token?.toObject() ?: arrayListOf()
}
}