diff --git a/common/src/main/java/com/yunbao/common/adapter/LiveSystemMessageAdapter.java b/common/src/main/java/com/yunbao/common/adapter/LiveSystemMessageAdapter.java new file mode 100644 index 000000000..2fb288925 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/LiveSystemMessageAdapter.java @@ -0,0 +1,52 @@ +package com.yunbao.common.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.yunbao.common.R; +import com.yunbao.common.bean.ListInfoMessageModel; +import com.yunbao.common.views.LiveSystemMessageViewHolder; + +import java.util.ArrayList; +import java.util.List; + +/** + * 主播消息中心适配器 + */ +public class LiveSystemMessageAdapter extends RecyclerView.Adapter { + private Context mContext; + private LayoutInflater mInflater; + private List listInfoMessageModels = new ArrayList<>(); + + public LiveSystemMessageAdapter(Context mContext) { + this.mContext = mContext; + mInflater = LayoutInflater.from(mContext); + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new LiveSystemMessageViewHolder(mInflater.inflate(R.layout.view_live_system_message, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + LiveSystemMessageViewHolder messageViewHolder = (LiveSystemMessageViewHolder) holder; + messageViewHolder.setViewData(listInfoMessageModels.get(position)); + } + + @Override + public int getItemCount() { + return listInfoMessageModels.size(); + } + + public void addData(List list) { + listInfoMessageModels.addAll(list); + notifyDataSetChanged(); + + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/ListInfoMessageModel.java b/common/src/main/java/com/yunbao/common/bean/ListInfoMessageModel.java new file mode 100644 index 000000000..3261a8c1b --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/ListInfoMessageModel.java @@ -0,0 +1,96 @@ +package com.yunbao.common.bean; + +import android.text.TextUtils; + +import com.google.gson.annotations.SerializedName; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class ListInfoMessageModel extends BaseModel { + @SerializedName("id") + private int id; + @SerializedName("title") + private String title; + @SerializedName("banner") + private String banner; + @SerializedName("content") + private String content; + @SerializedName("link") + private String link; + @SerializedName("addtime") + private String addtime; + + public int getId() { + return id; + } + + public ListInfoMessageModel setId(int id) { + this.id = id; + return this; + } + + public String getTitle() { + return title; + } + + public ListInfoMessageModel setTitle(String title) { + this.title = title; + return this; + } + + public String getBanner() { + return banner; + } + + public ListInfoMessageModel setBanner(String banner) { + this.banner = banner; + return this; + } + + public String getContent() { + return content; + } + + public ListInfoMessageModel setContent(String content) { + this.content = content; + return this; + } + + public String getLink() { + return link; + } + + public ListInfoMessageModel setLink(String link) { + this.link = link; + return this; + } + + public String getAddtime() { + return addtime; + } + + public ListInfoMessageModel setAddtime(String addtime) { + this.addtime = addtime; + return this; + } + + /** + * 会话列表展示时间 + */ + public String getLastDate(String type) { + if (!TextUtils.isEmpty(addtime) && !TextUtils.equals(addtime, "0")) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + Date currenTimeZone; + if (TextUtils.equals(type, "-1")) { + currenTimeZone = new Date(Long.parseLong(addtime)); + } else { + currenTimeZone = new Date(Long.parseLong(addtime + "000")); + } + return sdf.format(currenTimeZone); + } else { + return ""; + } + + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/LiveDataInfoModel.java b/common/src/main/java/com/yunbao/common/bean/LiveDataInfoModel.java new file mode 100644 index 000000000..a6c3b203e --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/LiveDataInfoModel.java @@ -0,0 +1,106 @@ +package com.yunbao.common.bean; + +import com.google.gson.annotations.SerializedName; + +/** + * 直播数据 + */ +public class LiveDataInfoModel extends BaseModel{ + @SerializedName("totalCoin") + private long totalCoin;//钻石数量 + @SerializedName("totalGold") + private long totalGold;//金币数量 + @SerializedName("acceptNum") + private long acceptNum;//送礼人数 + @SerializedName("enterNum") + private long enterNum;//进场人数 + @SerializedName("attentionNum") + private long attentionNum;//关注人数 + @SerializedName("fanGroupNum") + private long fanGroupNum;//粉丝团人数 + @SerializedName("attentionNumRate") + private double attentionNumRate;//关注转化率 + @SerializedName("fanGroupNumRate") + private double fanGroupNumRate;//粉丝团转化率 + + public LiveDataInfoModel() { + } + + public long getTotalCoin() { + return totalCoin; + } + + public void setTotalCoin(long totalCoin) { + this.totalCoin = totalCoin; + } + + public long getTotalGold() { + return totalGold; + } + + public void setTotalGold(long totalGold) { + this.totalGold = totalGold; + } + + public long getAcceptNum() { + return acceptNum; + } + + public void setAcceptNum(long acceptNum) { + this.acceptNum = acceptNum; + } + + public long getEnterNum() { + return enterNum; + } + + public void setEnterNum(long enterNum) { + this.enterNum = enterNum; + } + + public long getAttentionNum() { + return attentionNum; + } + + public void setAttentionNum(long attentionNum) { + this.attentionNum = attentionNum; + } + + public long getFanGroupNum() { + return fanGroupNum; + } + + public void setFanGroupNum(long fanGroupNum) { + this.fanGroupNum = fanGroupNum; + } + + public double getAttentionNumRate() { + return attentionNumRate; + } + + public void setAttentionNumRate(double attentionNumRate) { + this.attentionNumRate = attentionNumRate; + } + + public double getFanGroupNumRate() { + return fanGroupNumRate; + } + + public void setFanGroupNumRate(double fanGroupNumRate) { + this.fanGroupNumRate = fanGroupNumRate; + } + + @Override + public String toString() { + return "LiveDataInfoModel{" + + "totalCoin=" + totalCoin + + ", totalGold=" + totalGold + + ", acceptNum=" + acceptNum + + ", enterNum=" + enterNum + + ", attentionNum=" + attentionNum + + ", fanGroupNum=" + fanGroupNum + + ", attentionNumRate=" + attentionNumRate + + ", fanGroupNumRate=" + fanGroupNumRate + + '}'; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/LiveTaskModel.java b/common/src/main/java/com/yunbao/common/bean/LiveTaskModel.java new file mode 100644 index 000000000..401be64fc --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/LiveTaskModel.java @@ -0,0 +1,259 @@ +package com.yunbao.common.bean; + + +import com.google.gson.annotations.SerializedName; +import com.yunbao.common.R; +import com.yunbao.common.utils.StringUtil; +import com.yunbao.common.utils.WordUtil; + +import java.io.Serializable; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Locale; + +/** + * 直播任务 + */ +public class LiveTaskModel extends BaseModel { + public static final int TASK_TYPE_TIP = 0; + public static final int TASK_TYPE_ITEM = 1; + + int type; + @SerializedName("new") + NewUser user; + @SerializedName("list") + List> list; + + public LiveTaskModel() { + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public NewUser getUser() { + return user; + } + + public void setUser(NewUser user) { + this.user = user; + } + + public List> getList() { + if (user != null && user.isNew()) { + for (List tasks : list) { + for (Task task : tasks) { + task.isNewUser = true; + } + } + } + return list; + } + + public void setList(List> list) { + this.list = list; + } + + @Override + public String toString() { + return "LiveTaskModel{" + + "type=" + type + + ", user=" + user + + ", list=" + list + + '}'; + } + + public static class NewUser { + @SerializedName("isNew") + private int isNew; + @SerializedName("endTime") + private String endTime; + + public NewUser() { + } + + public boolean isNew() { + return isNew == 1; + } + + public void setNew(int aNew) { + isNew = aNew; + } + + public String getEndTime() { + if (!StringUtil.isEmpty(endTime)) { + endTime = WordUtil.getString(R.string.live_task_new_user_timer) + new SimpleDateFormat("yyyy/MM/dd HH:mm", Locale.getDefault()).format(new Date(Long.parseLong(endTime) * 1000)); + } + return endTime; + } + + public void setEndTime(String endTime) { + this.endTime = endTime; + } + + @Override + public String toString() { + return "NewUser{" + + "isNew=" + isNew + + ", endTime='" + endTime + '\'' + + '}'; + } + } + + public static class Task implements Serializable { + @SerializedName("id") + private int id; + @SerializedName("type") + private int type; + @SerializedName("task_type") + private int taskType; + @SerializedName("task_name") + private String taskName; + @SerializedName("task_num") + private int taskNum; + @SerializedName("hot") + private long hot; + @SerializedName("exp") + private long exp; + @SerializedName("new_hot") + private long newUserHot; + @SerializedName("new_exp") + private long newUserExp; + @SerializedName("sort") + private int sort; + @SerializedName("status") + private int status; + + @SerializedName("now_num") + private int nowValue; + + private boolean isNewUser = false; + + public Task() { + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public int getTaskType() { + return taskType; + } + + public void setTaskType(int taskType) { + this.taskType = taskType; + } + + public String getTaskName() { + return taskName; + } + + public void setTaskName(String taskName) { + this.taskName = taskName; + } + + public int getTaskNum() { + return taskNum; + } + + public void setTaskNum(int taskNum) { + this.taskNum = taskNum; + } + + public long getHot() { + if (isNewUser) { + hot = newUserHot; + } + return hot; + } + + public void setHot(long hot) { + this.hot = hot; + } + + public long getExp() { + if (isNewUser) { + exp = newUserExp; + } + return exp; + } + + public void setExp(long exp) { + this.exp = exp; + } + + public long getNewUserHot() { + return newUserHot; + } + + public void setNewUserHot(long newUserHot) { + this.newUserHot = newUserHot; + } + + public long getNewUserExp() { + return newUserExp; + } + + public void setNewUserExp(long newUserExp) { + this.newUserExp = newUserExp; + } + + public int getSort() { + return sort; + } + + public void setSort(int sort) { + this.sort = sort; + } + + public boolean getStatus() { + return status == 1; + } + + public void setStatus(int status) { + this.status = status; + } + + public int getNowValue() { + return nowValue; + } + + public void setNowValue(int nowValue) { + this.nowValue = nowValue; + } + + @Override + public String toString() { + return "Task{" + + "id=" + id + + ", type=" + type + + ", taskType=" + taskType + + ", taskName='" + taskName + '\'' + + ", taskNum=" + taskNum + + ", hot=" + hot + + ", exp=" + exp + + ", newUserHot=" + newUserHot + + ", newUserExp=" + newUserExp + + ", sort=" + sort + + ", status=" + status + + '}'; + } + } +} diff --git a/common/src/main/java/com/yunbao/common/dialog/AbsDialogPopupWindow.java b/common/src/main/java/com/yunbao/common/dialog/AbsDialogPopupWindow.java new file mode 100644 index 000000000..150ca86e7 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/dialog/AbsDialogPopupWindow.java @@ -0,0 +1,33 @@ +package com.yunbao.common.dialog; + +import android.content.Context; + +import androidx.annotation.NonNull; + +import com.lxj.xpopup.XPopup; +import com.lxj.xpopup.core.BottomPopupView; + + +public abstract class AbsDialogPopupWindow extends BottomPopupView { + private final Context mContext; + + public AbsDialogPopupWindow(@NonNull Context context) { + super(context); + this.mContext = context; + } + + public abstract void buildDialog(XPopup.Builder builder); + public abstract int bindLayoutId(); + + @Override + protected int getImplLayoutId() { + return bindLayoutId(); + } + + public void showDialog() { + XPopup.Builder builder = new XPopup.Builder(mContext); + builder.isDestroyOnDismiss(true); + buildDialog(builder); + builder.asCustom(this).show(); + } +} diff --git a/common/src/main/java/com/yunbao/common/http/PDLiveApi.java b/common/src/main/java/com/yunbao/common/http/PDLiveApi.java index dee1a5e78..5d269d74e 100644 --- a/common/src/main/java/com/yunbao/common/http/PDLiveApi.java +++ b/common/src/main/java/com/yunbao/common/http/PDLiveApi.java @@ -12,10 +12,13 @@ import com.yunbao.common.bean.HourRank; import com.yunbao.common.bean.HttpCallbackModel; import com.yunbao.common.bean.IMLoginModel; import com.yunbao.common.bean.LinkMicUserBeanV2; +import com.yunbao.common.bean.ListInfoMessageModel; import com.yunbao.common.bean.LiveAiRobotBean; +import com.yunbao.common.bean.LiveDataInfoModel; import com.yunbao.common.bean.LiveInfoModel; import com.yunbao.common.bean.LiveRoomActivityBanner; import com.yunbao.common.bean.LiveStetUpStatusModel; +import com.yunbao.common.bean.LiveTaskModel; import com.yunbao.common.bean.MsgSwitchDetailModel; import com.yunbao.common.bean.NewPeopleInfo; import com.yunbao.common.bean.NobleRankHideUserListModel; @@ -542,4 +545,34 @@ public interface PDLiveApi { Observable> jieshuDRPK( @Query("roomid") String roomId, @Query("uid") String uid); + + @GET("/api/public/?service=Message.getListInfo") + Observable>> getListInfo( + @Query("type") String type, + @Query("p") int p); + + /** + * 获取主播任务列表 + */ + @GET("/api/public/?service=Live.getLiveTaskStatus") + Observable> getLiveTaskList( + @Query("type") int type, + @Query("liveuid") String liveUid + ); + + /** + * 获取直播数据 + */ + @GET("/api/public/?service=Live.getLiveStatisticalData") + Observable> getLiveDataInfo( + @Query("liveuid") String liveUid + ); + + /** + * 获取直播数据 + */ + @GET("/api/public/?service=Message.getAnchorMsg") + Observable>> getAnchorMsg( + @Query("liveuid") String liveUid, @Query("page") int page, @Query("limit") int limit + ); } diff --git a/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java b/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java index a1aa6c25d..89ac477d5 100644 --- a/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java +++ b/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java @@ -14,10 +14,13 @@ import com.yunbao.common.bean.EnterRoomNewModel; import com.yunbao.common.bean.HttpCallbackModel; import com.yunbao.common.bean.LinkMicUserBean; import com.yunbao.common.bean.LinkMicUserBeanV2; +import com.yunbao.common.bean.ListInfoMessageModel; import com.yunbao.common.bean.LiveAiRobotBean; +import com.yunbao.common.bean.LiveDataInfoModel; import com.yunbao.common.bean.LiveInfoModel; import com.yunbao.common.bean.LiveRoomActivityBanner; import com.yunbao.common.bean.LiveStetUpStatusModel; +import com.yunbao.common.bean.LiveTaskModel; import com.yunbao.common.bean.NobleRankHideUserListModel; import com.yunbao.common.bean.NobleTrumpetModel; import com.yunbao.common.bean.PkRankBean; @@ -1075,6 +1078,73 @@ public class LiveNetManager { }).isDisposed(); } + public void getListInfo(String type, int p, HttpCallback> callback) { + API.get().pdLiveApi(mContext) + .getListInfo(type, p) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(listResponseModel -> { + callback.onSuccess(listResponseModel.getData().getInfo()); + }, throwable -> { + callback.onError(throwable.getMessage()); + }).isDisposed(); + } + + /** + * 获取直播任务 + * + * @param type 1 直播任务 2粉丝任务 + */ + public void getLiveTask(int type, String liveUid, HttpCallback callback) { + API.get().pdLiveApi(mContext) + .getLiveTaskList(type, liveUid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(listResponseModel -> { + callback.onSuccess(listResponseModel.getData().getInfo()); + }, throwable -> { + callback.onError(throwable.getMessage()); + }).isDisposed(); + } + + /** + * 获取直播数据 + */ + public void getLiveData(String liveUid, HttpCallback callback) { + API.get().pdLiveApi(mContext) + .getLiveDataInfo(liveUid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(listResponseModel -> { + callback.onSuccess(listResponseModel.getData().getInfo()); + }, throwable -> { + callback.onError(throwable.getMessage()); + }).isDisposed(); + } + + /** + * 获取主播消息 + * + * @param liveUid 直播间id + * @param page 页码 + * @param callback 回调 + */ + public void getAnchorMsg(String liveUid, int page, HttpCallback> callback) { + API.get().pdLiveApi(mContext) + .getAnchorMsg(liveUid, page, 10) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(listResponseModel -> { + if (callback != null) { + callback.onSuccess(listResponseModel.getData().getInfo()); + } + }, throwable -> { + if (callback != null) { + callback.onError(throwable.getMessage()); + } + }).isDisposed(); + } + /** * 直播间取消网络请求 */ diff --git a/common/src/main/java/com/yunbao/common/views/LiveAnchorMessageCustomPopup.java b/common/src/main/java/com/yunbao/common/views/LiveAnchorMessageCustomPopup.java new file mode 100644 index 000000000..4f574524e --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/LiveAnchorMessageCustomPopup.java @@ -0,0 +1,91 @@ +package com.yunbao.common.views; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.lxj.xpopup.core.BottomPopupView; +import com.yunbao.common.R; +import com.yunbao.common.adapter.LiveSystemMessageAdapter; +import com.yunbao.common.bean.ListInfoMessageModel; +import com.yunbao.common.http.base.HttpCallback; +import com.yunbao.common.http.live.LiveNetManager; +import com.yunbao.common.utils.ToastUtil; +import com.yunbao.common.views.weight.OnRecyclerViewScrollListener; + +import java.util.List; + +/** + * 主播消息中心 + */ +public class LiveAnchorMessageCustomPopup extends BottomPopupView { + private LiveSystemMessageAdapter adapter; + private RecyclerView liveMessage; + private String liveUid; + private int page = 1, size = 0; + + public LiveAnchorMessageCustomPopup(@NonNull Context context, String liveUid) { + super(context); + this.liveUid = liveUid; + } + + public LiveAnchorMessageCustomPopup(@NonNull Context context) { + super(context); + } + + // 返回自定义弹窗的布局 + @Override + protected int getImplLayoutId() { + return R.layout.dialog_live_anchor_message; + } + + // 执行初始化操作,比如:findView,设置点击,或者任何你弹窗内的业务逻辑 + @Override + protected void onCreate() { + super.onCreate(); + initView(); + initDate(); + } + + private void initDate() { + LiveNetManager.get(getContext()) + .getAnchorMsg(liveUid, page, new HttpCallback>() { + @Override + public void onSuccess(List data) { + size = data.size(); + adapter.addData(data); + } + + @Override + public void onError(String error) { + ToastUtil.show(error); + } + }); + + } + + private void initView() { + liveMessage = findViewById(R.id.live_message); + liveMessage.setHasFixedSize(false); + liveMessage.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)); + adapter = new LiveSystemMessageAdapter(getContext()); + liveMessage.setAdapter(adapter); + liveMessage.addOnScrollListener(new OnRecyclerViewScrollListener() { + @Override + public void onBottom() { + if (size > 0) { + page = page + 1; + initDate(); + } + + } + }); + } + + @Override + public void onDestroy() { + super.onDestroy(); + } +} diff --git a/common/src/main/java/com/yunbao/common/views/LiveSystemMessageViewHolder.java b/common/src/main/java/com/yunbao/common/views/LiveSystemMessageViewHolder.java new file mode 100644 index 000000000..76a478112 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/LiveSystemMessageViewHolder.java @@ -0,0 +1,54 @@ +package com.yunbao.common.views; + +import android.text.TextUtils; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.cardview.widget.CardView; +import androidx.recyclerview.widget.RecyclerView; + +import com.yunbao.common.R; +import com.yunbao.common.bean.ListInfoMessageModel; +import com.yunbao.common.glide.ImgLoader; +import com.yunbao.common.utils.RouteUtil; + +public class LiveSystemMessageViewHolder extends RecyclerView.ViewHolder { + private TextView titleText, timeText, contextLayout, toView; + private CardView bannerCard; + private ImageView bannerImage; + + public LiveSystemMessageViewHolder(@NonNull View itemView) { + super(itemView); + titleText = itemView.findViewById(R.id.title_text); + timeText = itemView.findViewById(R.id.time_text); + contextLayout = itemView.findViewById(R.id.context_layout); + toView = itemView.findViewById(R.id.to_view); + bannerCard = itemView.findViewById(R.id.banner_card); + bannerImage = itemView.findViewById(R.id.banner_image); + } + + public void setViewData(ListInfoMessageModel model) { + titleText.setText(model.getTitle()); + timeText.setText(model.getLastDate("1")); + if (TextUtils.isEmpty(model.getBanner())) { + bannerCard.setVisibility(View.GONE); + } else { + bannerCard.setVisibility(View.VISIBLE); + ImgLoader.display(itemView.getContext(), model.getBanner(), bannerImage); + } + contextLayout.setText(model.getContent()); + if (TextUtils.isEmpty(model.getLink())) { + toView.setVisibility(View.GONE); + } else { + toView.setVisibility(View.VISIBLE); + toView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + RouteUtil.forwardLiveZhuangBanActivity(model.getLink(), false); + } + }); + } + } +} diff --git a/common/src/main/res/drawable/bg_live_anchor.xml b/common/src/main/res/drawable/bg_live_anchor.xml new file mode 100644 index 000000000..97e93b52b --- /dev/null +++ b/common/src/main/res/drawable/bg_live_anchor.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/common/src/main/res/drawable/bg_live_anchor_message.xml b/common/src/main/res/drawable/bg_live_anchor_message.xml new file mode 100644 index 000000000..9ff74fedd --- /dev/null +++ b/common/src/main/res/drawable/bg_live_anchor_message.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/common/src/main/res/drawable/selector_protocol_check.xml b/common/src/main/res/drawable/selector_protocol_check.xml new file mode 100644 index 000000000..a4042e2f1 --- /dev/null +++ b/common/src/main/res/drawable/selector_protocol_check.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/dialog_live_anchor_message.xml b/common/src/main/res/layout/dialog_live_anchor_message.xml new file mode 100644 index 000000000..1c017ccf9 --- /dev/null +++ b/common/src/main/res/layout/dialog_live_anchor_message.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/dialog_live_new_function.xml b/common/src/main/res/layout/dialog_live_new_function.xml index 4182a2fc9..431285898 100644 --- a/common/src/main/res/layout/dialog_live_new_function.xml +++ b/common/src/main/res/layout/dialog_live_new_function.xml @@ -1,329 +1,458 @@ - - - - + android:layout_marginBottom="8dp" + android:orientation="horizontal"> + android:layout_marginStart="10dp" + android:background="@drawable/bg_live_anchor" + android:gravity="center" + android:paddingStart="6dp" + android:paddingTop="4dp" + android:paddingEnd="6dp" + android:paddingBottom="4dp"> - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_marginStart="5dp" + android:text="00:00" + android:textColor="@color/white" + android:textSize="12sp" /> - - - - - + + android:layout_marginStart="10dp" + android:background="@drawable/bg_live_anchor" + android:gravity="center_vertical" + android:paddingStart="6dp" + android:paddingTop="4dp" - + + + + + - - - - - - - - - - - - - - - - - - - - + android:layout_marginStart="6dp" + android:text="@string/broadcast_data" + android:textColor="@color/white" + android:textSize="10sp" /> - - - - + + + + + + + + + + + + android:layout_marginTop="30dp" + android:text="@string/value_added_benefits" + android:textColor="@color/white" + android:textSize="14sp" /> + + + android:layout_marginStart="16dp" + android:layout_marginTop="10dp" + android:paddingEnd="16dp"> - - - + android:gravity="center" + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:layout_marginStart="16dp" + android:layout_marginTop="10dp" + android:layout_marginBottom="20dp" + android:paddingEnd="16dp"> - - - - - + android:gravity="center" + android:orientation="vertical"> - + - + + + + android:layout_marginStart="23dp" + android:gravity="center" + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + android:layout_marginStart="16dp" + android:layout_marginTop="10dp" + android:layout_marginBottom="20dp" + android:paddingEnd="16dp"> - - - - + android:gravity="center" + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - \ No newline at end of file diff --git a/common/src/main/res/layout/view_live_system_message.xml b/common/src/main/res/layout/view_live_system_message.xml new file mode 100644 index 000000000..968f41186 --- /dev/null +++ b/common/src/main/res/layout/view_live_system_message.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/live/src/main/res/mipmap-xhdpi/icon_more.png b/common/src/main/res/mipmap-xxhdpi/icon_more.png similarity index 100% rename from live/src/main/res/mipmap-xhdpi/icon_more.png rename to common/src/main/res/mipmap-xxhdpi/icon_more.png diff --git a/common/src/main/res/mipmap-xxhdpi/icon_protocol_check.png b/common/src/main/res/mipmap-xxhdpi/icon_protocol_check.png new file mode 100644 index 000000000..07d294e38 Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/icon_protocol_check.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/icon_protocol_uncheck.png b/common/src/main/res/mipmap-xxhdpi/icon_protocol_uncheck.png new file mode 100644 index 000000000..bb1b4754a Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/icon_protocol_uncheck.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/live_icon_data.png b/common/src/main/res/mipmap-xxhdpi/live_icon_data.png new file mode 100644 index 000000000..f23f08440 Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/live_icon_data.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/live_icon_news.png b/common/src/main/res/mipmap-xxhdpi/live_icon_news.png new file mode 100644 index 000000000..0f2cebfec Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/live_icon_news.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/live_more_icon_task.png b/common/src/main/res/mipmap-xxhdpi/live_more_icon_task.png new file mode 100644 index 000000000..6265b8b3a Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/live_more_icon_task.png differ diff --git a/common/src/main/res/values-en/strings.xml b/common/src/main/res/values-en/strings.xml index 4b0d7b828..e92aa3e9f 100644 --- a/common/src/main/res/values-en/strings.xml +++ b/common/src/main/res/values-en/strings.xml @@ -938,14 +938,14 @@ Limited ride And limited avatar frame In a batch Chat - Congratulations %s have won %s in the Lucky Angel! The next lucky angel will be you! - Congratulations on %s winning %s in Luck 100 %%! Go pass on the good luck! - Guardian group %s people - receive - To complete - Already collected - Image quality selection - More Settings + Congratulations %s have won %s in the Lucky Angel! The next lucky angel will be you! + Congratulations on %s winning %s in Luck 100 %%! Go pass on the good luck! + Guardian group %s people + receive + To complete + Already collected + Image quality selection + More Settings view more The gift is on the way... The gift is on the way @@ -955,52 +955,68 @@ Limited ride And limited avatar frame End \nPK Time %s - accept - refuse - Persist in refusing - Random PK hint + accept + refuse + Persist in refusing + Random PK hint - Automatic speech robot setup - Robot switch - Robot name setting - The word limit is 2 to 8 word - Automatic greeting setting - Number of configured items - Set automatic message sending - Go to set - Thank you for sending gifts, PK start, PK end automatic robot message, \n does not support customization. - Add content - At regular intervals, the robot automatically says the following sentence at random。 - Fill in the content recommendation, such as: send wish list, add fan group, etc - Automatic speech interval (minutes) - At least once every 5 minutes - When a user enters the studio, the robot will @the user and automatically - The following sentence is random. Set a minimum of 1 to a maximum of 20. - Robot setup - High definition - fluency - Ultra hd - After determining the definition of the broadcast, you need to restart the broadcast to change - Confirmation of broadcast Settings - clarity - Live channel - broadcast - robot - set - Not set - no - yes - Ultra HD hint - In the case of unstable network speed, the selection of ultra HD may lead to the delay of the picture in the broadcast room. Do you confirm the selection? - Stick to choice - Network prompt - The system detects that your network is unstable and insufficient device memory will affect the fluency of your live broadcast. Therefore, it is recommended that you choose fluency and clarity. - check version - Update - Latest Version - updating - There is no choice, the anchor is not turned on FHD live. - There is no choice, the anchor is not turned on HD live. - Sorry, this feature is on hold. - phone + Automatic speech robot setup + Robot switch + Robot name setting + The word limit is 2 to 8 word + Automatic greeting setting + Number of configured items + Set automatic message sending + Go to set + Thank you for sending gifts, PK start, PK end automatic robot message, \n does not support customization. + Add content + At regular intervals, the robot automatically says the following sentence at random。 + Fill in the content recommendation, such as: send wish list, add fan group, etc + Automatic speech interval (minutes) + At least once every 5 minutes + When a user enters the studio, the robot will @the user and automatically + The following sentence is random. Set a minimum of 1 to a maximum of 20. + Robot setup + High definition + fluency + Ultra hd + After determining the definition of the broadcast, you need to restart the broadcast to change + Confirmation of broadcast Settings + clarity + Live channel + broadcast + robot + set + Not set + no + yes + Ultra HD hint + In the case of unstable network speed, the selection of ultra HD may lead to the delay of the picture in the broadcast room. Do you confirm the selection? + Stick to choice + Network prompt + The system detects that your network is unstable and insufficient device memory will affect the fluency of your live broadcast. Therefore, it is recommended that you choose fluency and clarity. + check version + Update + Latest Version + updating + There is no choice, the anchor is not turned on FHD live. + There is no choice, the anchor is not turned on HD live. + Sorry, this feature is on hold. + phone + Broadcast + Click To View + Anchor Task + I have read and agreed to the + Please read and agree to the PDLIVE Host Agreement + PDLIVE Host Agreement + The statute of limitations for new anchors expires + coin + gold + Number of gifts + Number of entry + New attention + Follow the conversion rate + New fan group + Fan group conversion rate + loading… diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index bcfe413f2..795f8a9eb 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -785,6 +785,7 @@ 暫時還沒有人給予作者鼓勵T_T 點擊查看更多 + 客服 設定 每日13:00PM-1:00AM @@ -1023,4 +1024,20 @@ 無法選擇,該主播未開啟高清直播。 抱歉,該功能暫停使用中。 手機號 + 開播數據 + 點擊查看 + 主播任務 + 我已閱讀並同意 + 請閱讀並同意《PDLIVE主播協議》 + 《PDLIVE主播協議》 + 新秀主播時效截止至 + 鑽石收禮 + 金豆收禮 + 收禮人數 + 進場人數 + 新增關注 + 關注轉化率 + 新增粉絲團 + 粉絲團轉化率 + 加载中… diff --git a/config.gradle b/config.gradle index 66e026ffe..00ea7a5b8 100644 --- a/config.gradle +++ b/config.gradle @@ -9,10 +9,9 @@ ext { ] manifestPlaceholders = [ //正式 - - serverHost : "https://napi.yaoulive.com", -// -// serverHost : "https://ceshi.yaoulive.com", +// serverHost : "https://napi.yaoulive.com", + //测试 + serverHost : "https://ceshi.yaoulive.com", //腾讯地图 txMapAppKey : "EOZBZ-ASLCU-4XPV3-BDCHZ-4E3Q7-H4BWB", diff --git a/live/src/main/java/com/yunbao/live/activity/LiveActivity.java b/live/src/main/java/com/yunbao/live/activity/LiveActivity.java index 9ec322ca1..7d0ad33b5 100644 --- a/live/src/main/java/com/yunbao/live/activity/LiveActivity.java +++ b/live/src/main/java/com/yunbao/live/activity/LiveActivity.java @@ -866,7 +866,7 @@ public abstract class LiveActivity extends AbsActivity implements SocketMessageL private void showTaskDialog() { final Dialog dialog = new Dialog(LiveActivity.this, com.yunbao.live.R.style.dialog); - dialog.setContentView(R.layout.dialog_task); + dialog.setContentView(R.layout.dialog_live_task); dialog.setCancelable(true); dialog.setCanceledOnTouchOutside(true); diff --git a/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java b/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java index a673b8630..9b031e2c4 100644 --- a/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java +++ b/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java @@ -673,7 +673,9 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl } bundle.putBoolean(Constants.HAS_GAME, hasGame); bundle.putInt("leave", leave); + bundle.putString("liveUid", mLiveUid); bundle.putBoolean("isPk", isDRPK == 1 || PKing || mLivePushViewHolder.isPking()); + bundle.putLong("liveTime", mLiveAnchorViewHolder.getmAnchorLiveTime()); bundle.putBoolean(Constants.OPEN_FLASH, mLivePushViewHolder != null && mLivePushViewHolder.isFlashOpen()); fragment.setArguments(bundle); fragment.setFunctionClickListener(this); @@ -937,9 +939,11 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl if (code == 0) { JSONObject obj = JSON.parseObject(info[0]); JSONObject datas = obj.getJSONObject("data"); - - SocketRyChatUtil.closeLive(datas.getString("votes"), datas.getString("length"), datas.getString("nums"), mLiveUid, mSocketRyClient); - + try { + SocketRyChatUtil.closeLive(datas.getString("votes"), datas.getString("length"), datas.getString("nums"), mLiveUid, mSocketRyClient); + } catch (Exception e) { + e.printStackTrace(); + } if (mLiveEndViewHolder == null) { mLiveEndViewHolder = new LiveEndViewHolder(mContext, mRoot, mLiveBean.getUid()); diff --git a/live/src/main/java/com/yunbao/live/adapter/LiveDataInfoRecyclerAdapter.java b/live/src/main/java/com/yunbao/live/adapter/LiveDataInfoRecyclerAdapter.java new file mode 100644 index 000000000..5bf22b60a --- /dev/null +++ b/live/src/main/java/com/yunbao/live/adapter/LiveDataInfoRecyclerAdapter.java @@ -0,0 +1,67 @@ +package com.yunbao.live.adapter; + +import android.content.Context; +import android.text.Html; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.yunbao.live.R; +import com.yunbao.live.bean.LiveDataInfoModel; + +import java.util.ArrayList; +import java.util.List; + +public class LiveDataInfoRecyclerAdapter extends RecyclerView.Adapter { + private Context mContext; + private List list=new ArrayList<>(); + + public LiveDataInfoRecyclerAdapter(Context mContext) { + this.mContext = mContext; + } + + public void setList(List list) { + this.list = list; + notifyDataSetChanged(); + } + + @NonNull + @Override + public LiveDataHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new LiveDataHolder(LayoutInflater.from(mContext).inflate(R.layout.item_live_data, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull LiveDataHolder holder, int position) { + holder.setData(list.get(position)); + } + + @Override + public int getItemCount() { + return list.size(); + } + + public static class LiveDataHolder extends RecyclerView.ViewHolder { + private TextView title, data; + + public LiveDataHolder(@NonNull View itemView) { + super(itemView); + title = itemView.findViewById(R.id.item_title); + data = itemView.findViewById(R.id.item_data); + } + + public void setData(LiveDataInfoModel model) { + if (model.getColor() != null) { + data.setText(Html.fromHtml("" + model.getData() + "")); + } else { + data.setText(model.getData()); + } + title.setText(model.getTitle()); + } + + } +} diff --git a/live/src/main/java/com/yunbao/live/adapter/LiveTaskRecyclerAdapter.java b/live/src/main/java/com/yunbao/live/adapter/LiveTaskRecyclerAdapter.java new file mode 100644 index 000000000..86b1408b8 --- /dev/null +++ b/live/src/main/java/com/yunbao/live/adapter/LiveTaskRecyclerAdapter.java @@ -0,0 +1,117 @@ +package com.yunbao.live.adapter; + +import android.content.Context; +import android.graphics.Color; +import android.text.Html; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.yunbao.common.bean.LiveTaskModel; +import com.yunbao.common.utils.DpUtil; +import com.yunbao.common.utils.WordUtil; +import com.yunbao.live.R; + +import java.util.ArrayList; +import java.util.List; + +public class LiveTaskRecyclerAdapter extends RecyclerView.Adapter { + + private Context mContext; + private List tasks = new ArrayList<>(); + + public LiveTaskRecyclerAdapter(Context mContext) { + this.mContext = mContext; + } + + public void setTasks(List tasks) { + this.tasks = tasks; + notifyDataSetChanged(); + } + + @NonNull + @Override + public TaskHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + if (viewType == LiveTaskModel.TASK_TYPE_TIP) { + return new TaskHolder(new TextView(mContext)); + } else { + return new TaskHolder(LayoutInflater.from(mContext).inflate(R.layout.item_live_task, parent, false)); + } + } + + @Override + public int getItemViewType(int position) { + return tasks.get(position).getType(); + + } + + @Override + public void onBindViewHolder(@NonNull TaskHolder holder, int position) { + holder.setDate(tasks.get(position)); + } + + @Override + public int getItemCount() { + return tasks.size(); + } + + + public static class TaskHolder extends RecyclerView.ViewHolder { + private TextView title; + private TextView complete; + private TextView hot; + private TextView xp; + private ImageView hotIcon; + private ImageView xpIcon; + + public TaskHolder(@NonNull View itemView) { + super(itemView); + if (itemView instanceof TextView) { + title = (TextView) itemView; + title.setTextColor(Color.parseColor("#B3B3B3")); + title.setTextSize(12); + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + params.setMarginStart(DpUtil.dp2px(27)); + params.setMargins(DpUtil.dp2px(27), DpUtil.dp2px(16), 0, DpUtil.dp2px(16)); + title.setLayoutParams(params); + } else { + title = itemView.findViewById(R.id.item_task_title); + complete = itemView.findViewById(R.id.item_task_complete); + hot = itemView.findViewById(R.id.item_task_hot); + xp = itemView.findViewById(R.id.item_task_xp); + hotIcon = itemView.findViewById(R.id.item_task_hot_img); + xpIcon = itemView.findViewById(R.id.item_task_xp_img); + hotIcon.setImageResource(R.mipmap.dialog_task_hot); + xpIcon.setImageResource(R.mipmap.dialog_task_star); + } + } + + public void setDate(LiveTaskModel.Task task) { + title.setText(task.getTaskName()); + if (task.getType() == LiveTaskModel.TASK_TYPE_TIP) { + return; + } + if (task.getStatus() || task.getNowValue() >= task.getTaskNum()) { + task.setNowValue(task.getTaskNum()); + } + title.setText(String.format("%s (%s/%s)", + task.getTaskName(), + task.getNowValue(), + task.getTaskNum()) + ); + if (task.getNowValue() == task.getTaskNum()) { + task.setStatus(1); + } + complete.setText(task.getStatus() ? R.string.live_task_item_complete_true : R.string.live_task_item_complete_false); + complete.setBackgroundResource(task.getStatus() ? R.drawable.background_6cbe53 : R.drawable.background_595959); + hot.setText(Html.fromHtml("" + WordUtil.getString(R.string.live_task_item_hot) + "  " + task.getHot() + "")); + xp.setText(Html.fromHtml("" + WordUtil.getString(R.string.live_task_item_xp) + "  " + task.getExp() + "")); + } + } +} diff --git a/live/src/main/java/com/yunbao/live/bean/LiveDataInfoModel.java b/live/src/main/java/com/yunbao/live/bean/LiveDataInfoModel.java new file mode 100644 index 000000000..81a65ec4e --- /dev/null +++ b/live/src/main/java/com/yunbao/live/bean/LiveDataInfoModel.java @@ -0,0 +1,47 @@ +package com.yunbao.live.bean; + +import com.yunbao.common.bean.BaseModel; + +public class LiveDataInfoModel extends BaseModel { + private String color; + private String title; + private String data; + + public LiveDataInfoModel(String color, String title, String data) { + this.color = color; + this.title = title; + this.data = data; + } + + public LiveDataInfoModel(String title, String data) { + this.title = title; + this.data = data; + } + + public LiveDataInfoModel() { + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } +} diff --git a/live/src/main/java/com/yunbao/live/dialog/LiveDataInfoDialog.java b/live/src/main/java/com/yunbao/live/dialog/LiveDataInfoDialog.java new file mode 100644 index 000000000..a9ebf66b2 --- /dev/null +++ b/live/src/main/java/com/yunbao/live/dialog/LiveDataInfoDialog.java @@ -0,0 +1,96 @@ +package com.yunbao.live.dialog; + +import android.content.Context; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.lxj.xpopup.XPopup; +import com.yunbao.common.dialog.AbsDialogPopupWindow; +import com.yunbao.common.http.base.HttpCallback; +import com.yunbao.common.http.live.LiveNetManager; +import com.yunbao.common.utils.WordUtil; +import com.yunbao.live.R; +import com.yunbao.live.adapter.LiveDataInfoRecyclerAdapter; +import com.yunbao.live.bean.LiveDataInfoModel; + + +import java.util.ArrayList; +import java.util.List; + +public class LiveDataInfoDialog extends AbsDialogPopupWindow { + private ImageView img; + private RecyclerView recyclerView; + private LiveDataInfoRecyclerAdapter adapter; + private List list; + private String liveUid; + + public LiveDataInfoDialog(@NonNull Context context) { + super(context); + } + + public LiveDataInfoDialog(@NonNull Context context, String liveUid) { + super(context); + this.liveUid = liveUid; + } + + public void setLiveUid(String liveUid) { + this.liveUid = liveUid; + } + + @Override + public void buildDialog(XPopup.Builder builder) { + } + + @Override + public int bindLayoutId() { + return R.layout.dialog_live_data; + } + + @Override + protected void onCreate() { + super.onCreate(); + img = findViewById(R.id.live_data_img); + img.setImageResource(R.mipmap.icon_free_pk_waring); + recyclerView = findViewById(R.id.live_data_list); + adapter = new LiveDataInfoRecyclerAdapter(getContext()); + recyclerView.setAdapter(adapter); + initData(); + } + + private void initData() { + list = new ArrayList<>(); + list.add(new LiveDataInfoModel("#00FFFF", WordUtil.getString(R.string.live_data_coin), WordUtil.getString(R.string.live_data_loading))); + list.add(new LiveDataInfoModel("#FFF69F", WordUtil.getString(R.string.live_data_gold), WordUtil.getString(R.string.live_data_loading))); + list.add(new LiveDataInfoModel(WordUtil.getString(R.string.live_data_accept), WordUtil.getString(R.string.live_data_loading))); + list.add(new LiveDataInfoModel(WordUtil.getString(R.string.live_data_enter), WordUtil.getString(R.string.live_data_loading))); + list.add(new LiveDataInfoModel(WordUtil.getString(R.string.live_data_attention), WordUtil.getString(R.string.live_data_loading))); + list.add(new LiveDataInfoModel(WordUtil.getString(R.string.live_data_attention_rate), WordUtil.getString(R.string.live_data_loading))); + list.add(new LiveDataInfoModel(WordUtil.getString(R.string.live_data_fan_group), WordUtil.getString(R.string.live_data_loading))); + list.add(new LiveDataInfoModel(WordUtil.getString(R.string.live_data_fan_group_rate), WordUtil.getString(R.string.live_data_loading))); + adapter.setList(list); + LiveNetManager.get(getContext()) + .getLiveData(liveUid, new HttpCallback() { + @Override + public void onSuccess(com.yunbao.common.bean.LiveDataInfoModel data) { + list.clear(); + list.add(new LiveDataInfoModel("#00FFFF", WordUtil.getString(R.string.live_data_coin), data.getTotalCoin() + "")); + list.add(new LiveDataInfoModel("#FFF69F", WordUtil.getString(R.string.live_data_gold), data.getTotalGold() + "")); + list.add(new LiveDataInfoModel(WordUtil.getString(R.string.live_data_accept), data.getAcceptNum() + "")); + list.add(new LiveDataInfoModel(WordUtil.getString(R.string.live_data_enter), data.getEnterNum() + "")); + list.add(new LiveDataInfoModel(WordUtil.getString(R.string.live_data_attention), data.getAttentionNum() + "")); + list.add(new LiveDataInfoModel(WordUtil.getString(R.string.live_data_attention_rate), data.getAttentionNumRate() + "")); + list.add(new LiveDataInfoModel(WordUtil.getString(R.string.live_data_fan_group), data.getFanGroupNum() + "")); + list.add(new LiveDataInfoModel(WordUtil.getString(R.string.live_data_fan_group_rate), data.getFanGroupNumRate() + "")); + adapter.setList(list); + } + + @Override + public void onError(String error) { + + } + }); + + } +} diff --git a/live/src/main/java/com/yunbao/live/dialog/LiveNewFunctionDialogFragment.java b/live/src/main/java/com/yunbao/live/dialog/LiveNewFunctionDialogFragment.java index 48e7168ef..3fc60e1a5 100644 --- a/live/src/main/java/com/yunbao/live/dialog/LiveNewFunctionDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/LiveNewFunctionDialogFragment.java @@ -1,8 +1,21 @@ package com.yunbao.live.dialog; -import static com.yunbao.common.Constants.*; +import static com.yunbao.common.Constants.LIVE_FUNC_BEAUTY; +import static com.yunbao.common.Constants.LIVE_FUNC_CAMERA; +import static com.yunbao.common.Constants.LIVE_FUNC_DR; +import static com.yunbao.common.Constants.LIVE_FUNC_LINK_MIC; +import static com.yunbao.common.Constants.LIVE_FUNC_MIC; +import static com.yunbao.common.Constants.LIVE_FUNC_RANDOM_PK; +import static com.yunbao.common.Constants.LIVE_FUNC_WISHLIST; +import static com.yunbao.common.Constants.LIVE_FUNC_WKS; +import static com.yunbao.common.Constants.LIVE_FUNC_ZG; +import static com.yunbao.common.Constants.LIVE_FUNC_ZSLK; +import static com.yunbao.common.Constants.LIVE_ROBOT; import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.os.SystemClock; import android.view.Gravity; import android.view.View; import android.view.Window; @@ -10,10 +23,12 @@ import android.view.WindowManager; import android.widget.ImageView; import android.widget.TextView; +import com.lxj.xpopup.XPopup; import com.yunbao.common.Constants; import com.yunbao.common.dialog.AbsDialogFragment; -import com.yunbao.common.utils.DpUtil; +import com.yunbao.common.utils.StringUtil; import com.yunbao.common.utils.ToastUtil; +import com.yunbao.common.views.LiveAnchorMessageCustomPopup; import com.yunbao.live.R; import com.yunbao.live.activity.LiveRyAnchorActivity; import com.yunbao.live.interfaces.LiveFunctionClickListener; @@ -29,7 +44,9 @@ public class LiveNewFunctionDialogFragment extends AbsDialogFragment implements private LiveFunctionClickListener mFunctionClickListener; private int leave = 0; private boolean isPk; + private TextView mLiveTimeTextView;//主播的直播时长 + private String liveUid; // boolean isRy = false; @Override @@ -70,6 +87,8 @@ public class LiveNewFunctionDialogFragment extends AbsDialogFragment implements leave = bundle.getInt("leave", 0); isPk = bundle.getBoolean("isPk", false); // isRy = bundle.getBoolean("isRy", false); + mAnchorLiveTime = bundle.getLong("liveTime"); + liveUid = bundle.getString("liveUid"); } mWishView = findViewById(R.id.live_tool_wish); mPrankView = findViewById(R.id.live_tool_prank); @@ -81,7 +100,7 @@ public class LiveNewFunctionDialogFragment extends AbsDialogFragment implements mMultiPkView = findViewById(R.id.live_tool_multi_pk); mMicView = findViewById(R.id.live_tool_mic); mRandomPk = findViewById(R.id.live_tool_random_pk); - + mLiveTimeTextView = (TextView) findViewById(R.id.live_time); mWishView.setOnClickListener(this); mPrankView.setOnClickListener(this); mWksView.setOnClickListener(this); @@ -92,6 +111,10 @@ public class LiveNewFunctionDialogFragment extends AbsDialogFragment implements mMultiPkView.setOnClickListener(this); mMicView.setOnClickListener(this); mRandomPk.setOnClickListener(this); + findViewById(R.id.message_linear).setOnClickListener(this); + findViewById(R.id.broadcast_data).setOnClickListener(this); + findViewById(R.id.anchor_task).setOnClickListener(this); + findViewById(R.id.live_tool_robot).setOnClickListener(this); if (leave == 0) { @@ -101,7 +124,9 @@ public class LiveNewFunctionDialogFragment extends AbsDialogFragment implements ((ImageView) mLeaveView.findViewById(R.id.live_tool_leave_img)).setImageResource(R.mipmap.icon_leave_p); ((TextView) mLeaveView.findViewById(R.id.live_tool_leave_text)).setText(R.string.live_zslk1); } - + mLiveRoomHandler = new LiveRoomHandler(); + mLiveTimeTextView.setText(StringUtil.getDurationText(mAnchorLiveTime)); + startAnchorLiveTime(); } public void setFunctionClickListener(LiveFunctionClickListener functionClickListener) { @@ -146,9 +171,74 @@ public class LiveNewFunctionDialogFragment extends AbsDialogFragment implements mFunctionClickListener.onClick(LIVE_FUNC_MIC); } else if (id == R.id.live_tool_random_pk) { mFunctionClickListener.onClick(LIVE_FUNC_RANDOM_PK); - }else if (id==R.id.live_tool_robot){ + } else if (id == R.id.live_tool_robot) { mFunctionClickListener.onClick(LIVE_ROBOT); dismiss(); + } else if (id == R.id.message_linear) { + new XPopup.Builder(getContext()) + .asCustom(new LiveAnchorMessageCustomPopup(getContext(), liveUid)) + .show(); + dismiss(); + } else if (id == R.id.broadcast_data) { + //主播数据 + new LiveDataInfoDialog(mContext, liveUid).showDialog(); + dismiss(); + } else if (id == R.id.anchor_task) { + //主播任务 + taskDialog = new LiveTaskDialog(mContext); + taskDialog.setLiveUid(liveUid); + taskDialog.updateLiveTimer(mAnchorLiveTime); + taskDialog.showDialog(); + } } + + private final int WHAT_ANCHOR_LIVE_TIME = 3;//直播间主播计时 + private LiveRoomHandler mLiveRoomHandler; + private long mAnchorLiveTime;//主播直播时间 + private LiveTaskDialog taskDialog; + + /** + * 主播显示直播时间 + */ + private void showAnchorLiveTime() { + if (mLiveTimeTextView != null) { + mAnchorLiveTime += 1000; + mLiveTimeTextView.setText(StringUtil.getDurationText(mAnchorLiveTime)); + startAnchorLiveTime(); + } + } + + public void startAnchorLiveTime() { + if (mLiveRoomHandler != null) { + mLiveRoomHandler.sendEmptyMessageAtTime(WHAT_ANCHOR_LIVE_TIME, getNextTime(1000)); + } + } + + private class LiveRoomHandler extends Handler { + @Override + public void handleMessage(Message msg) { + + switch (msg.what) { + + case WHAT_ANCHOR_LIVE_TIME: + showAnchorLiveTime(); + break; + + + } + } + + public void release() { + removeCallbacksAndMessages(null); + } + } + + private long getNextTime(int time) { + long now = SystemClock.uptimeMillis(); + if (time < 1000) { + return now + time; + } + return now + time + -now % 1000; + } } diff --git a/live/src/main/java/com/yunbao/live/dialog/LiveTaskDialog.java b/live/src/main/java/com/yunbao/live/dialog/LiveTaskDialog.java new file mode 100644 index 000000000..46d7789d9 --- /dev/null +++ b/live/src/main/java/com/yunbao/live/dialog/LiveTaskDialog.java @@ -0,0 +1,267 @@ +package com.yunbao.live.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.viewpager2.adapter.FragmentStateAdapter; +import androidx.viewpager2.widget.ViewPager2; + +import com.google.android.material.tabs.TabLayout; +import com.google.android.material.tabs.TabLayoutMediator; +import com.lxj.xpopup.XPopup; +import com.yunbao.common.bean.LiveTaskModel; +import com.yunbao.common.dialog.AbsDialogPopupWindow; +import com.yunbao.common.http.base.HttpCallback; +import com.yunbao.common.http.live.LiveNetManager; +import com.yunbao.common.utils.DialogUitl; +import com.yunbao.common.utils.WordUtil; +import com.yunbao.live.R; +import com.yunbao.live.adapter.LiveTaskRecyclerAdapter; + +import java.util.ArrayList; +import java.util.List; + +/** + * 主播直播任务弹框 + */ +public class LiveTaskDialog extends AbsDialogPopupWindow { + private TextView newStarTime; + private ImageView newStarImg; + private ImageView taskInfoImg; + private ImageView tipImg; + private TabLayout tabLayout; + + private ViewPager2 viewPager; + + + private TabLayoutMediator mediator; + + + private Context mContext; + String liveUid; + int liveTimer; + + public LiveTaskDialog(Context context) { + super(context); + this.mContext = context; + } + + @Override + public void buildDialog(XPopup.Builder builder) { + builder.enableDrag(false); + } + + @Override + public int bindLayoutId() { + return R.layout.dialog_live_task; + } + + @Override + protected void onCreate() { + super.onCreate(); + initView(); + } + + public void setLiveUid(String liveUid) { + this.liveUid = liveUid; + } + + private void initView() { + newStarTime = findViewById(R.id.task_new_star_time); + newStarImg = findViewById(R.id.live_task_banner1); + taskInfoImg = findViewById(R.id.live_task_banner2); + tipImg = findViewById(R.id.live_task_tip); + tabLayout = findViewById(R.id.live_task_menu); + viewPager = findViewById(R.id.live_task_viewpager); + initImgView(); + createTask(); + + } + + private void initImgView() { + newStarImg.setImageResource(R.mipmap.dialog_task_new_star); + taskInfoImg.setImageResource(R.mipmap.dialog_task_info); + tipImg.setImageResource(R.mipmap.icon_guize); + tipImg.setOnClickListener(v -> new LiveTaskInfoDialog(mContext).showDialog()); + } + + private void initTabLayout(LiveTaskModel model) { + TabLayout.Tab liveTaskTag = tabLayout.newTab(); + TabLayout.Tab userTaskTag = tabLayout.newTab(); + liveTaskTag.setText(R.string.live_task_tab1); + userTaskTag.setText(R.string.live_task_tab2); + tabLayout.addTab(liveTaskTag); + tabLayout.addTab(userTaskTag); + + viewPager.setAdapter(new FragmentStateAdapter(((AppCompatActivity) mContext).getSupportFragmentManager(), getLifecycle()) { + + @Override + public int getItemCount() { + return 2; + } + + @NonNull + @Override + public Fragment createFragment(int position) { + TaskFragment fragment = new TaskFragment(); + Bundle bundle = new Bundle(); + bundle.putInt("position", position + 1); + bundle.putInt("liveTimer", liveTimer); + bundle.putString("liveUid", liveUid); + bundle.putSerializable("data", model); + fragment.setArguments(bundle); + return fragment; + } + + }); + + mediator = new TabLayoutMediator(tabLayout, viewPager, true, new TabLayoutMediator.TabConfigurationStrategy() { + @Override + public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) { + if (position == 0) { + tab.setText(R.string.live_task_tab1); + } else { + tab.setText(R.string.live_task_tab2); + } + } + + }); + mediator.attach(); + } + + private void updateMainUi(LiveTaskModel.NewUser task) { + if (task.isNew()) { + newStarImg.setVisibility(VISIBLE); + newStarTime.setVisibility(VISIBLE); + newStarTime.setText(task.getEndTime()); + } + } + + private Dialog loadDialog; + + private void createTask() { + loadDialog = DialogUitl.loadingDialog(getContext()); + loadDialog.show(); + LiveNetManager.get(getContext()) + .getLiveTask(1, liveUid, new HttpCallback() { + @Override + public void onSuccess(LiveTaskModel data) { + Log.i("直播任务", "onSuccess: " + data); + updateMainUi(data.getUser()); + initTabLayout(data); + if (loadDialog != null) { + loadDialog.dismiss(); + } + } + + @Override + public void onError(String error) { + Log.e("直播任务", "onError: " + error); + if (loadDialog != null) { + loadDialog.dismiss(); + } + } + }); + } + + public void updateLiveTimer(long time) { + liveTimer = (int) time / (1000 * 60); + /*TaskFragment fragment = (TaskFragment) ((AppCompatActivity) mContext).getSupportFragmentManager().findFragmentByTag("f0"); + if (fragment != null) { + fragment.adapter.updateTimer(liveTimer); + }*/ + } + + public static class TaskFragment extends Fragment { + private RecyclerView taskList; + private LiveTaskRecyclerAdapter adapter; + private int position; + private int liveTimer; + private String liveUid; + + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return new RecyclerView(getActivity()); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + this.position = getArguments().getInt("position", -1); + this.liveTimer = getArguments().getInt("liveTimer", -1); + this.liveUid = getArguments().getString("liveUid", "0"); + taskList = (RecyclerView) view; + initTaskList(); + if (position == 2) { + createTask(position); + } else { + update((LiveTaskModel) getArguments().getSerializable("data"), 1); + } + } + + private void initTaskList() { + adapter = new LiveTaskRecyclerAdapter(getContext()); + taskList.setAdapter(adapter); + taskList.setLayoutManager(new LinearLayoutManager(getContext(), RecyclerView.VERTICAL, false)); + } + + private void createTask(int type) { + LiveNetManager.get(getContext()) + .getLiveTask(type, liveUid, new HttpCallback() { + + @Override + public void onSuccess(LiveTaskModel data) { + Log.i("直播任务", "onSuccess: " + data); + update(data, type); + } + + @Override + public void onError(String error) { + Log.e("直播任务", "onError: " + error); + } + }); + } + + private void update(LiveTaskModel data, int type) { + LiveTaskModel.Task task = new LiveTaskModel.Task(); + LiveTaskModel.Task task2 = new LiveTaskModel.Task(); + if (type == 1) { + task.setTaskName(WordUtil.getString(R.string.live_task_no1)); + task2.setTaskName(WordUtil.getString(R.string.live_task_no2)); + } else { + task.setTaskName(WordUtil.getString(R.string.live_task_fans_no1)); + task2.setTaskName(WordUtil.getString(R.string.live_task_fans_no2)); + } + task.setType(LiveTaskModel.TASK_TYPE_TIP); + task2.setType(LiveTaskModel.TASK_TYPE_TIP); + List task1 = new ArrayList<>(); + task1.add(task); + task1.addAll(data.getList().get(0)); + if (type == 1) { + for (LiveTaskModel.Task tk : task1) { + tk.setNowValue(liveTimer); + } + } + task1.add(task2); + task1.addAll(data.getList().get(1)); + adapter.setTasks(task1); + } + + } + +} diff --git a/live/src/main/java/com/yunbao/live/dialog/LiveTaskInfoDialog.java b/live/src/main/java/com/yunbao/live/dialog/LiveTaskInfoDialog.java new file mode 100644 index 000000000..1b6423f49 --- /dev/null +++ b/live/src/main/java/com/yunbao/live/dialog/LiveTaskInfoDialog.java @@ -0,0 +1,34 @@ +package com.yunbao.live.dialog; + +import android.content.Context; +import android.widget.ImageView; + +import androidx.annotation.NonNull; + +import com.lxj.xpopup.XPopup; +import com.yunbao.common.dialog.AbsDialogPopupWindow; +import com.yunbao.live.R; + +public class LiveTaskInfoDialog extends AbsDialogPopupWindow { + public LiveTaskInfoDialog(@NonNull Context context) { + super(context); + } + + @Override + public void buildDialog(XPopup.Builder builder) { + + } + + @Override + public int bindLayoutId() { + return R.layout.dialog_live_task_info; + } + + @Override + protected void onCreate() { + super.onCreate(); + ImageView back = findViewById(R.id.live_task_info_back); + back.setImageResource(R.mipmap.icon_back); + back.setOnClickListener(v -> dismiss()); + } +} diff --git a/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java index 9312232bc..01f665785 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java @@ -8,6 +8,7 @@ import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; import android.os.Looper; +import android.text.Html; import android.text.TextUtils; import android.util.Log; import android.view.View; @@ -25,6 +26,7 @@ import com.lxj.xpopup.core.BasePopupView; import com.lxj.xpopup.interfaces.XPopupCallback; import com.yunbao.common.CommonAppConfig; import com.yunbao.common.Constants; +import com.yunbao.common.bean.IMLoginModel; import com.yunbao.common.bean.LiveClassBean; import com.yunbao.common.bean.LiveRoomTypeBean; import com.yunbao.common.bean.UserBean; @@ -38,6 +40,7 @@ import com.yunbao.common.utils.Bus; import com.yunbao.common.utils.DialogUitl; import com.yunbao.common.utils.L; import com.yunbao.common.utils.ProcessImageUtil; +import com.yunbao.common.utils.RouteUtil; import com.yunbao.common.utils.StringUtil; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.utils.WordUtil; @@ -63,6 +66,7 @@ import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.io.File; +import java.util.Locale; import cn.rongcloud.rtc.api.RCRTCEngine; import cn.rongcloud.rtc.api.stream.RCRTCCameraOutputStream; @@ -76,7 +80,7 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl private EditText mEditTitle; private ProcessImageUtil mImageUtil; private File mAvatarFile; - private TextView mLiveClass; + private TextView mLiveClass, anchorAgreement; private TextView mLiveTypeTextView, liveClarity;//房间类型TextView private TextView mLiveWishListTextView;//心愿单TextView private int mLiveClassID;//直播频道id @@ -88,9 +92,10 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl private LiveClassBean classBean; private FaceManager manager; private TextView faceTextView;//提示人脸未检测到的TextView - private ImageView imgClarity; + private ImageView imgClarity, selectorProtocol; private int selectClarity = 1; private LiveOpenCustomPopup liveOpenCustomPopup; + private boolean selector = true; public LiveNewReadyRyViewHolder(Context context, ViewGroup parentView, int liveSdk) { super(context, parentView, liveSdk); @@ -112,7 +117,9 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl public void init() { mRootView = (ConstraintLayout) findViewById(R.id.traceroute_rootview); imgClarity = (ImageView) findViewById(R.id.img_clarity); + selectorProtocol = (ImageView) findViewById(R.id.selector_protocol); liveClarity = (TextView) findViewById(R.id.live_clarity); + anchorAgreement = (TextView) findViewById(R.id.anchor_agreement); mRootView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -121,6 +128,7 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } }); + mAvatar = (ConstraintLayout) findViewById(R.id.avatar); mAvatar.setOnClickListener(this); UserBean u = CommonAppConfig.getInstance().getUserBean(); @@ -186,6 +194,7 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl findViewById(R.id.btn_start_live).setOnClickListener(this); findViewById(R.id.btn_wishlist).setOnClickListener(this); findViewById(R.id.btn_horizontally).setOnClickListener(this); + findViewById(R.id.anchor_agreement_layout).setOnClickListener(this); if (manager != null) { manager.setFaceStatusChanged(new FaceManager.FaceStatusChanged() { @@ -271,6 +280,19 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl .asCustom(liveClarityCustomPopup) .show(); }); + String keywordHtml2 = "" + mContext.getString(R.string.anchor_hint) + ""; + String contextHtml = "" + mContext.getString(R.string.anchor_agreement) + ""; + anchorAgreement.setText(Html.fromHtml(contextHtml + keywordHtml2)); + selectorProtocol.setPressed(true); + selectorProtocol.setSelected(true); + selector = selectorProtocol.isSelected(); + selectorProtocol.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + selector = !selector; + selectorProtocol.setSelected(selector); + } + }); } private void setSelectClarity(int selectClarity) { @@ -357,6 +379,10 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl } else if (i == R.id.btn_room_type) { chooseLiveType(); } else if (i == R.id.btn_start_live) { + if (!selector) { + ToastUtil.show(R.string.anchor_agreement_hint); + return; + } if (mLiveClassID == 0) { ToastUtil.show(R.string.live_choose_live_class); return; @@ -524,6 +550,21 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl new XPopup.Builder(mContext) .asCustom(new LiveRobotSettingCustomPopup(mContext)) .show(); + } else if (i == R.id.anchor_agreement_layout) { + String ct = Locale.getDefault().getLanguage(); + IMLoginModel model = IMLoginManager.get(mContext).getUserInfo(); + StringBuffer url = new StringBuffer(); + url.append(CommonAppConfig.HOST); + if (TextUtils.equals(ct, "zh")) { + url.append("/index.php?g=portal&m=page&a=index&id=66"); + } else { + url.append("/index.php?g=portal&m=page&a=index&id=67"); + } + url.append("&uid=") + .append(model.getId()) + .append("&token=") + .append(model.getToken()); + RouteUtil.forwardLiveZhuangBanActivity(url.toString(), false); } } diff --git a/live/src/main/java/com/yunbao/live/views/LiveRyAnchorViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveRyAnchorViewHolder.java index 5a48591af..34650a568 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveRyAnchorViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveRyAnchorViewHolder.java @@ -87,6 +87,9 @@ public class LiveRyAnchorViewHolder extends AbsLiveViewHolder { super(context, parentView); } + public long getmAnchorLiveTime() { + return mAnchorLiveTime; + } @Override protected int getLayoutId() { diff --git a/live/src/main/res/drawable/background_151515.xml b/live/src/main/res/drawable/background_151515.xml new file mode 100644 index 000000000..cd3ed4522 --- /dev/null +++ b/live/src/main/res/drawable/background_151515.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/live/src/main/res/drawable/background_595959.xml b/live/src/main/res/drawable/background_595959.xml new file mode 100644 index 000000000..c90524801 --- /dev/null +++ b/live/src/main/res/drawable/background_595959.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/live/src/main/res/drawable/background_6cbe53.xml b/live/src/main/res/drawable/background_6cbe53.xml new file mode 100644 index 000000000..47302db9d --- /dev/null +++ b/live/src/main/res/drawable/background_6cbe53.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/live/src/main/res/layout/dialog_live_data.xml b/live/src/main/res/layout/dialog_live_data.xml new file mode 100644 index 000000000..d38297bab --- /dev/null +++ b/live/src/main/res/layout/dialog_live_data.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/live/src/main/res/layout/dialog_live_task.xml b/live/src/main/res/layout/dialog_live_task.xml new file mode 100644 index 000000000..00747b60d --- /dev/null +++ b/live/src/main/res/layout/dialog_live_task.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/live/src/main/res/layout/dialog_live_task_info.xml b/live/src/main/res/layout/dialog_live_task_info.xml new file mode 100644 index 000000000..178791b53 --- /dev/null +++ b/live/src/main/res/layout/dialog_live_task_info.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/live/src/main/res/layout/item_live_data.xml b/live/src/main/res/layout/item_live_data.xml new file mode 100644 index 000000000..f46e318f4 --- /dev/null +++ b/live/src/main/res/layout/item_live_data.xml @@ -0,0 +1,44 @@ + + + + + + + + + + \ No newline at end of file diff --git a/live/src/main/res/layout/item_live_task.xml b/live/src/main/res/layout/item_live_task.xml new file mode 100644 index 000000000..8208faf8f --- /dev/null +++ b/live/src/main/res/layout/item_live_task.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/live/src/main/res/layout/view_new_live_ready.xml b/live/src/main/res/layout/view_new_live_ready.xml index eadb2a80c..43961a227 100644 --- a/live/src/main/res/layout/view_new_live_ready.xml +++ b/live/src/main/res/layout/view_new_live_ready.xml @@ -267,7 +267,7 @@ android:layout_width="30dp" android:layout_height="30dp" android:layout_marginStart="50dp" - android:layout_marginBottom="53dp" + android:layout_marginBottom="83dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:srcCompat="@mipmap/icon_beauty" /> @@ -276,7 +276,7 @@ android:id="@+id/btn_start_live" android:layout_width="189dp" android:layout_height="42dp" - android:layout_marginBottom="47dp" + android:layout_marginBottom="77dp" android:background="@drawable/bg_live_ready_btn" android:text="@string/live_start" android:textColor="@color/white" @@ -303,9 +303,36 @@ android:layout_width="30dp" android:layout_height="30dp" android:layout_marginEnd="50dp" - android:layout_marginBottom="53dp" + android:layout_marginBottom="83dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:srcCompat="@mipmap/icon_robot" /> + + + + + + + \ No newline at end of file diff --git a/live/src/main/res/mipmap-xhdpi/dialog_task_hot.png b/live/src/main/res/mipmap-xhdpi/dialog_task_hot.png new file mode 100644 index 000000000..5f1599659 Binary files /dev/null and b/live/src/main/res/mipmap-xhdpi/dialog_task_hot.png differ diff --git a/live/src/main/res/mipmap-xhdpi/dialog_task_info.png b/live/src/main/res/mipmap-xhdpi/dialog_task_info.png new file mode 100644 index 000000000..7627e345e Binary files /dev/null and b/live/src/main/res/mipmap-xhdpi/dialog_task_info.png differ diff --git a/live/src/main/res/mipmap-xhdpi/dialog_task_new_star.png b/live/src/main/res/mipmap-xhdpi/dialog_task_new_star.png new file mode 100644 index 000000000..6673b3e89 Binary files /dev/null and b/live/src/main/res/mipmap-xhdpi/dialog_task_new_star.png differ diff --git a/live/src/main/res/mipmap-xhdpi/dialog_task_star.png b/live/src/main/res/mipmap-xhdpi/dialog_task_star.png new file mode 100644 index 000000000..fee098e1b Binary files /dev/null and b/live/src/main/res/mipmap-xhdpi/dialog_task_star.png differ diff --git a/live/src/main/res/values-en/strings.xml b/live/src/main/res/values-en/strings.xml index a6cc2d9aa..a33906b78 100644 --- a/live/src/main/res/values-en/strings.xml +++ b/live/src/main/res/values-en/strings.xml @@ -18,4 +18,20 @@ Only those who have the room code can watch Submit The number of voices has reached 3, and no more can be added. + Consecutive broadcast duration of the day (minutes) + PK count on the day (unlimited mode) + Accumulated new followers on that day + Cumulative new fan group members on that day + Live interaction + Fan growth + Special instructions for anchor tasks + After the broadcast, all anchors can get a series of tasks of the day. After completing the tasks according to the corresponding requirements, anchors can get the task reward of the previous day after the broadcast of the next day. + ● All task values will be calculated by the system in real time. If data errors occur due to personal, mobile, computer equipment problems, network problems or no normal downcasting, relevant anchors can contact relevant platform staff or online customer service for feedback. After confirmation by relevant part, compensation will be processed.\n● The normal settlement period of all mission data will be settled at 6:00 am every day. If the broadcast time is longer than 6:00 AM, the reward cannot be settled normally, please be noted.\n● When the anchor standard score is lower than 90, the anchor task center can only get 50% of all rewards. When the anchor standard score is lower than 80, the anchor task reward cannot be obtained. + success + incomplete + hot + exp + This live data statistics + Historical data can be viewed in the anchor center + * Non-real-time calculation of data \ No newline at end of file diff --git a/live/src/main/res/values/strings.xml b/live/src/main/res/values/strings.xml index c994ee24a..e4fb07da6 100644 --- a/live/src/main/res/values/strings.xml +++ b/live/src/main/res/values/strings.xml @@ -49,6 +49,20 @@ 請輸入您要pk的主播昵稱或id 對方正在PK中 PK次數已用完 - - + 當日連續開播時長(分鐘) + 當日累計PK次數(不限模式) + 當日累積新增關註粉絲 + 當日累積新增粉絲團成員 + 直播互動 + 粉絲增漲 + 主播任務特別說明 + 所有主播在開播後,即可獲得一系列的當日任務,當根據相應的要求完成任務後,主播即可在第二天開播後,獲得前一天的任務獎勵。 + ● 所有任務數值將由系統進行實時計算,如因個人手機電腦設備問題、網絡問題或是沒有正常進行下播導致數據出現錯誤等問題,為此相關主播可進行聯系相關平臺工作人員或是在線客服,進行反饋,待相關部分確認後,將會再進行補償處理。\n● 所有任務數據的正常結算周期將會在每日的淩晨6點進行結算,若開播時間超過淩晨6點,將會出現獎勵無法正常結算的情況,請知悉。\n● 當主播規範分低於90時,主播任務中心的所有獎勵,將僅能獲得50%的,當主播規範分低於80以下時,將無法獲得主播任務獎勵。 + 已完成 + 未完成 + 直播熱度 + 主播經驗 + 本場直播數據統計 + 歷史數據可在主播中心查看 + * 人數及新增相關數據非实时计算 diff --git a/main/src/main/java/com/yunbao/main/activity/TestActivity.java b/main/src/main/java/com/yunbao/main/activity/TestActivity.java index d4094b529..e62419001 100644 --- a/main/src/main/java/com/yunbao/main/activity/TestActivity.java +++ b/main/src/main/java/com/yunbao/main/activity/TestActivity.java @@ -1,23 +1,60 @@ package com.yunbao.main.activity; +import android.content.Intent; import android.os.Bundle; +import android.os.Environment; import android.text.SpannableStringBuilder; +import android.util.Log; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ListView; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; -import com.yunbao.main.R; +import com.yunbao.common.utils.ToastUtil; +import com.yunbao.live.dialog.LiveDataInfoDialog; +import com.yunbao.live.dialog.LiveTaskDialog; + + +import java.io.File; public class TestActivity extends AppCompatActivity { private TextView contextLayout; + private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_test); - contextLayout = findViewById(R.id.context_layout); - SpannableStringBuilder builder = new SpannableStringBuilder(); + listView = new ListView(this); + setContentView(listView); + String[] strs = new String[]{ + "弹出主播任务", + "直播數據" + }; + + listView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_expandable_list_item_1, strs)); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + switch (position) { + case 0: + new LiveTaskDialog(TestActivity.this).showDialog(); + break; + case 1: + new LiveDataInfoDialog(TestActivity.this).showDialog(); + break; + + } + } + }); + } + + @Override + protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { + super.onActivityResult(requestCode, resultCode, data); } } \ No newline at end of file diff --git a/main/src/main/java/com/yunbao/main/views/MainHomeViewHolder.java b/main/src/main/java/com/yunbao/main/views/MainHomeViewHolder.java index 4cc0b3327..a6ec4e727 100644 --- a/main/src/main/java/com/yunbao/main/views/MainHomeViewHolder.java +++ b/main/src/main/java/com/yunbao/main/views/MainHomeViewHolder.java @@ -1,6 +1,7 @@ package com.yunbao.main.views; import android.content.Context; +import android.content.Intent; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; @@ -11,6 +12,7 @@ import com.yunbao.common.utils.WordUtil; import com.yunbao.live.dialog.LiveRobotSettingDialogFragment; import com.yunbao.main.R; import com.yunbao.main.activity.MainActivity; +import com.yunbao.main.activity.TestActivity; /** * Created by cxf on 2018/9/22. @@ -38,6 +40,10 @@ public class MainHomeViewHolder extends AbsMainHomeParentViewHolder { super.init(); img_trophy = (ImageView) findViewById(R.id.img_trophy); + img_trophy.setOnLongClickListener(v -> { + mContext.startActivity(new Intent(mContext, TestActivity.class)); + return true; + }); ImgLoader.display(mContext, "https://downs.yaoulive.com/gif_trophy.gif", img_trophy);