diff --git a/FaceUnity/src/main/res/values/strings.xml b/FaceUnity/src/main/res/values/strings.xml index 799a50e10..e0f66a9b3 100644 --- a/FaceUnity/src/main/res/values/strings.xml +++ b/FaceUnity/src/main/res/values/strings.xml @@ -299,7 +299,7 @@ Hip Head shrink Thin leg - No body tracking + No message tracking Body driver Bust driver diff --git a/app/src/main/java/com/shayu/phonelive/utils/CustomMessageReceiver.java b/app/src/main/java/com/shayu/phonelive/utils/CustomMessageReceiver.java index 844c12b45..ad6efe52e 100644 --- a/app/src/main/java/com/shayu/phonelive/utils/CustomMessageReceiver.java +++ b/app/src/main/java/com/shayu/phonelive/utils/CustomMessageReceiver.java @@ -89,20 +89,23 @@ public class CustomMessageReceiver extends PushMessageReceiver { public boolean onNotificationMessageArrived(Context context, PushType pushType, PushNotificationMessage notificationMessage) { Log.i("gmc", notificationMessage.getPushContent() + "VVV" + notificationMessage.getPushTitle() + "gmc11112222" + notificationMessage.getExtra()); if (!SpUtil.getInstance().getBooleanValue("NOTIFICATION")) { - Activity activity = AppContext.activityWeakReference.get(); - if (activity != null) { - DialogUitl.showSimpleDialog(activity, "应用需要通知权限", new DialogUitl.SimpleCallback() { - @Override - public void onConfirmClick(Dialog dialog, String content) { - Intent intent = new Intent(); - intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); - intent.putExtra("app_package", context.getPackageName()); - intent.putExtra("app_uid", context.getApplicationInfo().uid); - // for Android 8 and above - intent.putExtra("android.provider.extra.APP_PACKAGE", context.getPackageName()); - activity.startActivity(intent); - } - }); + if (AppContext.activityWeakReference != null) { + Activity activity = AppContext.activityWeakReference.get(); + if (activity != null) { + DialogUitl.showSimpleDialog(activity, "应用需要通知权限", new DialogUitl.SimpleCallback() { + @Override + public void onConfirmClick(Dialog dialog, String content) { + Intent intent = new Intent(); + intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); + intent.putExtra("app_package", context.getPackageName()); + intent.putExtra("app_uid", context.getApplicationInfo().uid); + // for Android 8 and above + intent.putExtra("android.provider.extra.APP_PACKAGE", context.getPackageName()); + activity.startActivity(intent); + + } + }); + } } } if (notificationMessage.getExtra() == null) { diff --git a/common/src/main/java/com/yunbao/common/Constants.java b/common/src/main/java/com/yunbao/common/Constants.java index 02b0020ea..fabbf6967 100644 --- a/common/src/main/java/com/yunbao/common/Constants.java +++ b/common/src/main/java/com/yunbao/common/Constants.java @@ -133,6 +133,7 @@ public class Constants { public static final int LIVE_FUNC_WKS = 2014;//語音 public static final int LIVE_FUNC_ZSLK = 2015;//語音 public static final int LIVE_FUNC_RANDOM_PK = 2016;//随机PK + public static final int LIVE_ROBOT= 2017;//机器人 //socket public static final String SOCKET_CONN = "conn"; diff --git a/common/src/main/java/com/yunbao/common/adapter/RobotMessageAdapter.java b/common/src/main/java/com/yunbao/common/adapter/RobotMessageAdapter.java new file mode 100644 index 000000000..a9745714a --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/RobotMessageAdapter.java @@ -0,0 +1,51 @@ +package com.yunbao.common.adapter; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.yunbao.common.R; +import com.yunbao.common.bean.LiveAiRobotBean; +import com.yunbao.common.views.RobotMessageViewHolder; + +import java.util.ArrayList; +import java.util.List; + +public class RobotMessageAdapter extends RecyclerView.Adapter { + private List messageList = new ArrayList<>(); + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View robotMessageView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_robot_message, parent, false); + return new RobotMessageViewHolder(robotMessageView); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + RobotMessageViewHolder messageViewHolder = (RobotMessageViewHolder) holder; + messageViewHolder.setData(messageList.get(position), position + 1); + + } + + @Override + public int getItemCount() { + return messageList.size(); + } + + + public void setDataAll(List messages) { + messageList.clear(); + messageList.addAll(messages); + notifyDataSetChanged(); + } + + // 删除数据 + public void removeData(int position) { + messageList.remove(position); + //删除动画 + notifyItemRemoved(position); + } +} diff --git a/common/src/main/java/com/yunbao/common/adapter/RobotSayHelloAdapter.java b/common/src/main/java/com/yunbao/common/adapter/RobotSayHelloAdapter.java new file mode 100644 index 000000000..adeacfa4e --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/RobotSayHelloAdapter.java @@ -0,0 +1,51 @@ +package com.yunbao.common.adapter; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.yunbao.common.R; +import com.yunbao.common.bean.LiveAiRobotBean; +import com.yunbao.common.views.RobotSayHelloViewHoler; + +import java.util.ArrayList; +import java.util.List; + +public class RobotSayHelloAdapter extends RecyclerView.Adapter { + private List messageList = new ArrayList<>(); + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View robotSayHelloView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_robot_message, parent, false); + return new RobotSayHelloViewHoler(robotSayHelloView); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + RobotSayHelloViewHoler robotSayHelloViewHoler = (RobotSayHelloViewHoler) holder; + robotSayHelloViewHoler.setData(messageList.get(position), position + 1); + } + + @Override + public int getItemCount() { + return messageList.size(); + } + + + public void setDataAll(List messages) { + messageList.clear(); + messageList.addAll(messages); + notifyDataSetChanged(); + } + + // 删除数据 + public void removeData(int position) { + messageList.remove(position); + //删除动画 + notifyItemRemoved(position); + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/HttpCallbackModel.java b/common/src/main/java/com/yunbao/common/bean/HttpCallbackModel.java index c2369455f..da77d56e5 100644 --- a/common/src/main/java/com/yunbao/common/bean/HttpCallbackModel.java +++ b/common/src/main/java/com/yunbao/common/bean/HttpCallbackModel.java @@ -1,10 +1,18 @@ package com.yunbao.common.bean; -public class HttpCallbackModel extends BaseModel{ +public class HttpCallbackModel extends BaseModel { private int code; private String msg; + public HttpCallbackModel() { + } + + public HttpCallbackModel(int code, String msg) { + this.code = code; + this.msg = msg; + } + public int getCode() { return code; } diff --git a/common/src/main/java/com/yunbao/common/bean/LiveAiRobotBean.java b/common/src/main/java/com/yunbao/common/bean/LiveAiRobotBean.java new file mode 100644 index 000000000..44e8b9f95 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/LiveAiRobotBean.java @@ -0,0 +1,138 @@ +package com.yunbao.common.bean; + +import androidx.annotation.NonNull; + +import com.google.gson.annotations.SerializedName; + +/** + * 机器人bean + */ +public class LiveAiRobotBean extends BaseModel { + @SerializedName("ai_name") + private String name; + @SerializedName("ai_state") + private int status;//1=开 0=关 + @SerializedName("ai_time") + private int time; + @SerializedName("ai_sayhi") + private int autoSeyHiNumber;// 自动打招呼已配置数量 + @SerializedName("ai_gz") + private int autoRequestFollowNumber;//自动求关注已配置数量 + + public LiveAiRobotBean() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public int getTime() { + return time; + } + + public void setTime(int time) { + this.time = time; + } + + public int getAutoSeyHiNumber() { + return autoSeyHiNumber; + } + + public void setAutoSeyHiNumber(int autoSeyHiNumber) { + this.autoSeyHiNumber = autoSeyHiNumber; + } + + public int getAutoRequestFollowNumber() { + return autoRequestFollowNumber; + } + + public void setAutoRequestFollowNumber(int autoRequestFollowNumber) { + this.autoRequestFollowNumber = autoRequestFollowNumber; + } + + @NonNull + @Override + public String toString() { + return "LiveAiRobotBean{" + + "name='" + name + '\'' + + ", status=" + status + + ", time=" + time + + ", autoSeyHiNumber=" + autoSeyHiNumber + + ", autoRequestFollowNumber=" + autoRequestFollowNumber + + '}'; + } + + /** + * 机器人消息 + */ + public static class Message { + public static final int TYPE_SAY_HI=1;//自动打招呼 + public static final int TYPE_FOLLOW=3;//自动求关注 + @SerializedName("id") + private int id; + @SerializedName("uid") + private int uid; + @SerializedName("type") + private int type; + @SerializedName("content") + private String content; + + public Message() { + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getUid() { + return uid; + } + + public void setUid(int uid) { + this.uid = uid; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + @NonNull + @Override + public String toString() { + return "Message{" + + "id=" + id + + ", uid=" + uid + + ", type=" + type + + ", content='" + content + '\'' + + '}'; + } + } +} diff --git a/common/src/main/java/com/yunbao/common/event/LiveRobotMessageEvent.java b/common/src/main/java/com/yunbao/common/event/LiveRobotMessageEvent.java new file mode 100644 index 000000000..815b58813 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/event/LiveRobotMessageEvent.java @@ -0,0 +1,16 @@ +package com.yunbao.common.event; + +import com.yunbao.common.bean.BaseModel; + +public class LiveRobotMessageEvent extends BaseModel { + private int index = -1; + + public int getIndex() { + return index; + } + + public LiveRobotMessageEvent setIndex(int index) { + this.index = index; + return this; + } +} diff --git a/common/src/main/java/com/yunbao/common/event/LiveRobotSayHelloEvent.java b/common/src/main/java/com/yunbao/common/event/LiveRobotSayHelloEvent.java new file mode 100644 index 000000000..6e3e192a5 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/event/LiveRobotSayHelloEvent.java @@ -0,0 +1,16 @@ +package com.yunbao.common.event; + +import com.yunbao.common.bean.BaseModel; + +public class LiveRobotSayHelloEvent extends BaseModel { + private int index = -1; + + public int getIndex() { + return index; + } + + public LiveRobotSayHelloEvent setIndex(int index) { + this.index = index; + return this; + } +} 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 ba403f483..1edb1f6ca 100644 --- a/common/src/main/java/com/yunbao/common/http/PDLiveApi.java +++ b/common/src/main/java/com/yunbao/common/http/PDLiveApi.java @@ -9,8 +9,10 @@ import com.yunbao.common.bean.CustomSidebarInfoModel; import com.yunbao.common.bean.EnterRoomNewModel; import com.yunbao.common.bean.FaceBookUpModel; 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.LiveAiRobotBean; import com.yunbao.common.bean.LiveInfoModel; import com.yunbao.common.bean.LiveRoomActivityBanner; import com.yunbao.common.bean.MsgSwitchDetailModel; @@ -18,10 +20,10 @@ import com.yunbao.common.bean.NewPeopleInfo; import com.yunbao.common.bean.NobleRankHideUserListModel; import com.yunbao.common.bean.NobleTrumpetModel; import com.yunbao.common.bean.PkRankBean; -import com.yunbao.common.bean.RandomPkUserBean; -import com.yunbao.common.bean.RankPkInfoBean; import com.yunbao.common.bean.PrankGiftBean; import com.yunbao.common.bean.PrankHttpTurntableBean; +import com.yunbao.common.bean.RandomPkUserBean; +import com.yunbao.common.bean.RankPkInfoBean; import com.yunbao.common.bean.SearchModel; import com.yunbao.common.bean.SetAttentsModel; import com.yunbao.common.bean.SlideInBannerModel; @@ -29,6 +31,7 @@ import com.yunbao.common.bean.StarChallengeStatusModel; import com.yunbao.common.bean.VipModel; import java.util.List; +import java.util.Map; import io.reactivex.Observable; import retrofit2.http.Field; @@ -36,6 +39,7 @@ import retrofit2.http.FormUrlEncoded; import retrofit2.http.GET; import retrofit2.http.POST; import retrofit2.http.Query; +import retrofit2.http.QueryMap; /** * PDLive网络接口访问 @@ -354,42 +358,51 @@ public interface PDLiveApi { /** * 设置随机PK开关 + * * @param pk 1=开,0=关 */ @GET("/api/public/?service=Livepk.setRandomPKType") Observable>> changeRandomPkSwitch(@Query("random_pk") int pk); + /** * 获取自由PK次数 */ @GET("/api/public/?service=Livepk.getActivePkNum") Observable> getFreePkNumber(); + /** * 发起随机PK */ @GET("/api/public/?service=Livepk.setRandomPK") Observable> randomPK(); + /** * 随机PK后调用接口给后台记录 */ @GET("/api/public/?service=Livepk.startRandomPK") - Observable> startRandomPK(@Query("pkuid")String pkuid); + Observable> startRandomPK(@Query("pkuid") String pkuid); + /** * 自由PK开始后调用接口扣掉次数 */ @GET("/api/public/?service=Livepk.setActivePkNum") Observable> setFreePkNum(); + /** * 随机PK搜索用户 + * * @param cs 简体关键字/uid * @param ct 繁体关键字/uid */ @GET("/api/public/?service=Livepk.searchUser") - Observable>> randomPkSearchUser(@Query("jian_key")String cs,@Query("fan_key")String ct); + Observable>> randomPkSearchUser(@Query("jian_key") String cs, @Query("fan_key") String ct); + /** * 拒绝随机PK */ @GET("/api/public/?service=Livepk.setBanRandomPK") Observable> setBanRandomPK(); + /** * 拒绝随机PK */ @@ -403,6 +416,7 @@ public interface PDLiveApi { Observable> getAnchorPrankTurntable( @Query("anchor_id") String anchor_id ); + /** * 提交整蛊 */ @@ -418,6 +432,7 @@ public interface PDLiveApi { @Query("turntable_six") String turntable_six, @Query("status") String status ); + /** * 转盘整蛊结束后调用的接口 */ @@ -431,7 +446,7 @@ public interface PDLiveApi { * 获取整蛊列表 */ @GET("/api/public/?service=Prank.prankList") - Observable>> prankList( @Query("anchor_id") String anchor_id); + Observable>> prankList(@Query("anchor_id") String anchor_id); /** * 设置礼物整蛊 @@ -443,6 +458,7 @@ public interface PDLiveApi { @Query("gift_num") String gift_num, @Query("prank_content") String prank_content ); + /** * 删除礼物整蛊 */ @@ -451,58 +467,66 @@ public interface PDLiveApi { @Query("anchor_id") String anchor_id, @Query("prank_index") String prank_index ); + /** * 设置机器人开关 */ @GET("/api/public/?service=Live.setAnchorAiState") - Observable>> setAnchorAiState( + Observable> setAnchorAiState( @Query("ai_state") String ai_state ); + /** * 获取机器人信息 */ @GET("/api/public/?service=Live.getAnchorAiState") - Observable>> getAnchorAiState( + Observable> getAnchorAiState( ); + /** * 修改机器人信息 */ @GET("/api/public/?service=Live.setAnchorAiState") - Observable>> getAnchorAiState( - @Query("name") String name, - @Query("value") String value + Observable> setAnchorAiState( + @QueryMap Map map ); - /** + + /** * 获取机器人自定义话术 - * @param type 1(自定义打招呼) 3(自定义求关注) + * + * @param type 1(自定义打招呼) 3(自定义求关注) */ @GET("/api/public/?service=Live.getAiAutomaticSpeech") - Observable>> getAiAutomaticSpeech( + Observable>> getAiAutomaticSpeech( @Query("type") String type ); + /** * 机器人添加话术 */ @GET("/api/public/?service=Live.addAiAutomaticSpeech") - Observable>> addAiAutomaticSpeech( + Observable>> addAiAutomaticSpeech( @Query("type") String type, @Query("content") String content ); + /** * 机器人删除话术 */ @GET("/api/public/?service=Live.delAiAutomaticSpeech ") - Observable>> delAiAutomaticSpeech ( - @Query("type") String type, - @Query("id") String id - ); - /** - * 机器人修改话术 - */ - @GET("/api/public/?service=Live.updateAiAutomaticSpeech ") - Observable>> updateAiAutomaticSpeech ( + Observable>> delAiAutomaticSpeech( @Query("type") String type, @Query("id") String id ); + /** + * 机器人修改话术 + */ + @GET("/api/public/?service=Live.updateAiAutomaticSpeech ") + Observable>> updateAiAutomaticSpeech( + @Query("type") String type, + @Query("id") String id, + @Query("content") String content + ); + } 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 b5ff172fb..d83668492 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,6 +14,7 @@ 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.LiveAiRobotBean; import com.yunbao.common.bean.LiveInfoModel; import com.yunbao.common.bean.LiveRoomActivityBanner; import com.yunbao.common.bean.NobleRankHideUserListModel; @@ -21,7 +22,6 @@ import com.yunbao.common.bean.NobleTrumpetModel; import com.yunbao.common.bean.PkRankBean; import com.yunbao.common.bean.PrankGiftBean; import com.yunbao.common.bean.PrankHttpTurntableBean; -import com.yunbao.common.bean.PrankTurntableBean; import com.yunbao.common.bean.RandomPkUserBean; import com.yunbao.common.bean.RankPkInfoBean; import com.yunbao.common.bean.SetAttentsModel; @@ -33,13 +33,14 @@ import com.yunbao.common.http.base.CheckLiveCallBack; import com.yunbao.common.http.base.HttpCallback; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.functions.Consumer; import io.reactivex.schedulers.Schedulers; -import retrofit2.http.Query; /** @@ -879,7 +880,7 @@ public class LiveNetManager { /** * 整蛊结束 */ - public void endPrankTurntable(String mLiveUid,HttpCallback callback){ + public void endPrankTurntable(String mLiveUid, HttpCallback callback) { API.get().pdLiveApi(mContext) .endPrankTurntable(mLiveUid) .subscribeOn(Schedulers.io()) @@ -898,6 +899,141 @@ public class LiveNetManager { } + public void getAiRobotStatus(HttpCallback callback) { + API.get().pdLiveApi(mContext) + .getAnchorAiState() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(responseModel -> { + if (callback != null) { + callback.onSuccess(responseModel.getData().getInfo()); + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + if (callback != null) { + callback.onError(throwable.getMessage()); + } + } + }).isDisposed(); + } + + public void setAiRobotStatus(String status, HttpCallback callback) { + API.get().pdLiveApi(mContext) + .setAnchorAiState(status) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(responseModel -> { + if (callback != null) { + callback.onSuccess(null); + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + if (callback != null) { + callback.onError(throwable.getMessage()); + } + } + }).isDisposed(); + } + + public void setAiRobotDate(String name, String value, HttpCallback callback) { + Map map = new HashMap<>(); + map.put(name, value); + API.get().pdLiveApi(mContext) + .setAnchorAiState(map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(responseModel -> { + if (callback != null) { + callback.onSuccess(null); + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + if (callback != null) { + callback.onError(throwable.getMessage()); + } + } + }).isDisposed(); + } + + public void getAiRobotBody(int type, HttpCallback> callback) { + API.get().pdLiveApi(mContext) + .getAiAutomaticSpeech(type + "") + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(responseModel -> { + if (callback != null) { + callback.onSuccess(responseModel.getData().getInfo()); + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + if (callback != null) { + callback.onError(throwable.getMessage()); + } + } + }).isDisposed(); + } + + public void addAiRobotBody(int type, String content, HttpCallback callback) { + API.get().pdLiveApi(mContext) + .addAiAutomaticSpeech(type + "", content) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(responseModel -> { + if (callback != null) { + callback.onSuccess(new HttpCallbackModel(responseModel.getData().getCode(), responseModel.getData().getMsg())); + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + if (callback != null) { + callback.onError(throwable.getMessage()); + } + } + }).isDisposed(); + } + + public void updateAiRobotBody(int type, int id, String content, HttpCallback callback) { + API.get().pdLiveApi(mContext) + .updateAiAutomaticSpeech(type + "", id + "", content) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(responseModel -> { + if (callback != null) { + callback.onSuccess(new HttpCallbackModel(responseModel.getData().getCode(), responseModel.getData().getMsg())); + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + if (callback != null) { + callback.onError(throwable.getMessage()); + } + } + }).isDisposed(); + } + + public void delAiRobotBody(int type, int id, HttpCallback callback) { + API.get().pdLiveApi(mContext) + .delAiAutomaticSpeech(type + "", id + "") + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(responseModel -> { + if (callback != null) { + callback.onSuccess(new HttpCallbackModel(responseModel.getData().getCode(), responseModel.getData().getMsg())); + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + if (callback != null) { + callback.onError(throwable.getMessage()); + } + } + }).isDisposed(); + } + /** * 直播间取消网络请求 */ diff --git a/common/src/main/java/com/yunbao/common/views/CustomDrawerPopupView.java b/common/src/main/java/com/yunbao/common/views/CustomDrawerPopupView.java index e111905c0..ab2199dbd 100644 --- a/common/src/main/java/com/yunbao/common/views/CustomDrawerPopupView.java +++ b/common/src/main/java/com/yunbao/common/views/CustomDrawerPopupView.java @@ -127,7 +127,8 @@ public class CustomDrawerPopupView extends DrawerPopupView { ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.system_notice), new ViewClicksAntiShake.ViewClicksCallBack() { @Override public void onViewClicks() { - dismiss(); +// dismiss(); + } diff --git a/common/src/main/java/com/yunbao/common/views/InputCustomPopup.java b/common/src/main/java/com/yunbao/common/views/InputCustomPopup.java new file mode 100644 index 000000000..8ad8f995a --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/InputCustomPopup.java @@ -0,0 +1,92 @@ +package com.yunbao.common.views; + +import android.content.Context; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; + +import androidx.annotation.NonNull; + +import com.lxj.xpopup.animator.PopupAnimator; +import com.lxj.xpopup.core.CenterPopupView; +import com.yunbao.common.R; +import com.yunbao.common.utils.ToastUtil; + +/** + * 输入弹窗 + */ +public class InputCustomPopup extends CenterPopupView { + private String message = ""; + + public InputCustomPopup(@NonNull Context context, String message) { + super(context); + this.message = message; + } + + public InputCustomPopup(@NonNull Context context) { + super(context); + } + + // 返回自定义弹窗的布局 + @Override + protected int getImplLayoutId() { + return R.layout.input_custom_popup; + } + + // 执行初始化操作,比如:findView,设置点击,或者任何你弹窗内的业务逻辑 + @Override + protected void onCreate() { + super.onCreate(); + EditText content = findViewById(R.id.content); + content.setText(message); + findViewById(R.id.btn_cancel).setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + dismiss(); // 关闭弹窗 + } + }); + findViewById(R.id.btn_confirm).setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + String textContent = content.getText().toString(); + if (TextUtils.isEmpty(textContent)) { + ToastUtil.show("输入内容不可为空"); + return; + } + if (listener != null) { + listener.onConfirm(textContent); + } + dismiss(); // 关闭弹窗 + } + }); + } + + // 设置最大宽度,看需要而定, + @Override + protected int getMaxWidth() { + return super.getMaxWidth(); + } + + // 设置最大高度,看需要而定 + @Override + protected int getMaxHeight() { + return super.getMaxHeight(); + } + + // 设置自定义动画器,看需要而定 + @Override + protected PopupAnimator getPopupAnimator() { + return super.getPopupAnimator(); + } + + public interface InputCustomListener { + void onConfirm(String text); + } + + private InputCustomListener listener; + + public InputCustomPopup setListener(InputCustomListener listener) { + this.listener = listener; + return this; + } +} diff --git a/common/src/main/java/com/yunbao/common/views/LiveRobotMessageCustomPopup.java b/common/src/main/java/com/yunbao/common/views/LiveRobotMessageCustomPopup.java new file mode 100644 index 000000000..953e9c7fe --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/LiveRobotMessageCustomPopup.java @@ -0,0 +1,181 @@ +package com.yunbao.common.views; + +import android.content.Context; +import android.util.Log; +import android.view.KeyEvent; +import android.view.View; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.lxj.xpopup.XPopup; +import com.lxj.xpopup.core.BottomPopupView; +import com.yunbao.common.R; +import com.yunbao.common.adapter.RobotMessageAdapter; +import com.yunbao.common.bean.HttpCallbackModel; +import com.yunbao.common.bean.LiveAiRobotBean; +import com.yunbao.common.event.LiveRobotMessageEvent; +import com.yunbao.common.http.base.HttpCallback; +import com.yunbao.common.http.live.LiveNetManager; +import com.yunbao.common.utils.Bus; +import com.yunbao.common.utils.ToastUtil; + +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.List; + +public class LiveRobotMessageCustomPopup extends BottomPopupView { + private static String TAG = "AI机器人"; + private RecyclerView robotMessages; + private RobotMessageAdapter robotMessageAdapter; + + private EditText robotNameSetting; + private TextView robotTime; + private String robotTimeString = ""; + + public LiveRobotMessageCustomPopup(@NonNull Context context, String robotTime) { + super(context); + this.robotTimeString = robotTime; + } + + public LiveRobotMessageCustomPopup(@NonNull Context context) { + super(context); + } + + // 返回自定义弹窗的布局 + @Override + protected int getImplLayoutId() { + return R.layout.dialog_live_robot_message; + } + + // 执行初始化操作,比如:findView,设置点击,或者任何你弹窗内的业务逻辑 + @Override + protected void onCreate() { + super.onCreate(); + Bus.getOn(this); + initView(); + initDate(); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onLiveRobotMessageEvent(LiveRobotMessageEvent event) { + if (event.getIndex() > 0) { + robotMessageAdapter.removeData(event.getIndex()); + } else { + initDate(); + } + + } + + @Override + public void onDestroy() { + super.onDestroy(); + Bus.getOff(this); + } + + + private void initView() { + robotMessages = (RecyclerView) findViewById(R.id.robot_messages); + robotNameSetting = findViewById(R.id.robot_name_setting); + robotTime = findViewById(R.id.robot_time); + robotMessageAdapter = new RobotMessageAdapter(); + robotMessages.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)); + robotMessages.setAdapter(robotMessageAdapter); + robotTime.setText(robotTimeString); + findViewById(R.id.bt_cancel).setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + dismiss(); + } + }); + robotTime.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + robotTime.setVisibility(GONE); + robotNameSetting.setVisibility(VISIBLE); + robotNameSetting.setText(robotTime.getText().toString()); + //输入框,获取焦点 不然无法弹出键盘 + robotNameSetting.requestFocus(); + //键盘输入法管理器 + InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + imm.showSoftInput(robotNameSetting, 0); + } + }); + robotNameSetting.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (actionId == EditorInfo.IME_ACTION_DONE) { + // 修改助手名字 + LiveNetManager.get(getContext()) + .setAiRobotDate("ai_time", robotNameSetting.getText().toString(), new HttpCallback() { + @Override + public void onSuccess(HttpCallbackModel data) { + robotNameSetting.setVisibility(GONE); + robotTime.setVisibility(VISIBLE); + robotTime.setText(robotNameSetting.getText().toString()); + } + + @Override + public void onError(String error) { + ToastUtil.show(error); + } + }); + + } + return false; + } + }); + //添加消息语 + findViewById(R.id.robot_add_content).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + new XPopup.Builder(getContext()) + .asCustom(new InputCustomPopup(getContext()).setListener(new InputCustomPopup.InputCustomListener() { + @Override + public void onConfirm(String text) { + //添加消息语 + LiveNetManager.get(getContext()) + .addAiRobotBody(LiveAiRobotBean.Message.TYPE_FOLLOW, text, new HttpCallback() { + @Override + public void onSuccess(HttpCallbackModel data) { + initDate(); + } + + @Override + public void onError(String error) { + ToastUtil.show(error); + } + }); + } + })) + .show(); + } + }); + } + + private void initDate() { + + LiveNetManager.get(getContext()) + .getAiRobotBody(LiveAiRobotBean.Message.TYPE_FOLLOW, new HttpCallback>() { + @Override + public void onSuccess(List data) { + Log.i(TAG, "onSuccess: " + data.size()); + for (LiveAiRobotBean.Message message : data) { + Log.i(TAG, "onSuccess: message=" + message.toString()); + } + robotMessageAdapter.setDataAll(data); + } + + @Override + public void onError(String error) { + + } + }); + } +} diff --git a/common/src/main/java/com/yunbao/common/views/LiveRobotSayHelloCustomPopup.java b/common/src/main/java/com/yunbao/common/views/LiveRobotSayHelloCustomPopup.java new file mode 100644 index 000000000..93e61f37c --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/LiveRobotSayHelloCustomPopup.java @@ -0,0 +1,128 @@ +package com.yunbao.common.views; + +import android.content.Context; +import android.util.Log; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.lxj.xpopup.XPopup; +import com.lxj.xpopup.core.BottomPopupView; +import com.yunbao.common.R; +import com.yunbao.common.adapter.RobotSayHelloAdapter; +import com.yunbao.common.bean.HttpCallbackModel; +import com.yunbao.common.bean.LiveAiRobotBean; +import com.yunbao.common.event.LiveRobotSayHelloEvent; +import com.yunbao.common.http.base.HttpCallback; +import com.yunbao.common.http.live.LiveNetManager; +import com.yunbao.common.utils.Bus; +import com.yunbao.common.utils.ToastUtil; + +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.List; + +public class LiveRobotSayHelloCustomPopup extends BottomPopupView { + private RecyclerView robotMessages; + private RobotSayHelloAdapter robotMessageAdapter; + private static String TAG = "AI机器人"; + + public LiveRobotSayHelloCustomPopup(@NonNull Context context) { + super(context); + } + + + // 返回自定义弹窗的布局 + @Override + protected int getImplLayoutId() { + return R.layout.dialog_live_robot_say_hello; + } + + // 执行初始化操作,比如:findView,设置点击,或者任何你弹窗内的业务逻辑 + @Override + protected void onCreate() { + super.onCreate(); + Bus.getOn(this); + initView(); + initDate(); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onLiveRobotSayHelloEvent(LiveRobotSayHelloEvent event) { + if (event.getIndex() > 0) { + robotMessageAdapter.removeData(event.getIndex()); + } else { + initDate(); + } + + } + + @Override + public void onDestroy() { + super.onDestroy(); + Bus.getOff(this); + } + + private void initView() { + robotMessages = (RecyclerView) findViewById(R.id.robot_messages); + robotMessageAdapter = new RobotSayHelloAdapter(); + robotMessages.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)); + robotMessages.setAdapter(robotMessageAdapter); + findViewById(R.id.bt_cancel).setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + dismiss(); + } + }); + //添加消息语 + findViewById(R.id.robot_add_content).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + new XPopup.Builder(getContext()) + .asCustom(new InputCustomPopup(getContext()).setListener(new InputCustomPopup.InputCustomListener() { + @Override + public void onConfirm(String text) { + //添加消息语 + LiveNetManager.get(getContext()) + .addAiRobotBody(LiveAiRobotBean.Message.TYPE_SAY_HI, text, new HttpCallback() { + @Override + public void onSuccess(HttpCallbackModel data) { + initDate(); + } + + @Override + public void onError(String error) { + ToastUtil.show(error); + } + }); + } + })) + .show(); + } + }); + } + + + private void initDate() { + LiveNetManager.get(getContext()) + .getAiRobotBody(LiveAiRobotBean.Message.TYPE_SAY_HI, new HttpCallback>() { + @Override + public void onSuccess(List data) { + Log.i(TAG, "onSuccess 自动打招呼 : " + data.size()); + for (LiveAiRobotBean.Message message : data) { + Log.i(TAG, "onSuccess: message=" + message.toString()); + } + robotMessageAdapter.setDataAll(data); + + } + + @Override + public void onError(String error) { + + } + }); + } +} diff --git a/common/src/main/java/com/yunbao/common/views/LiveRobotSettingCustomPopup.java b/common/src/main/java/com/yunbao/common/views/LiveRobotSettingCustomPopup.java new file mode 100644 index 000000000..f954a8ce7 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/LiveRobotSettingCustomPopup.java @@ -0,0 +1,269 @@ +package com.yunbao.common.views; + +import android.content.Context; +import android.util.Log; +import android.view.KeyEvent; +import android.view.View; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.appcompat.widget.AppCompatTextView; + +import com.lxj.xpopup.XPopup; +import com.lxj.xpopup.core.BasePopupView; +import com.lxj.xpopup.core.BottomPopupView; +import com.lxj.xpopup.interfaces.XPopupCallback; +import com.yunbao.common.R; +import com.yunbao.common.bean.HttpCallbackModel; +import com.yunbao.common.bean.LiveAiRobotBean; +import com.yunbao.common.http.base.HttpCallback; +import com.yunbao.common.http.live.LiveNetManager; +import com.yunbao.common.utils.ToastUtil; + +import java.util.List; + +public class LiveRobotSettingCustomPopup extends BottomPopupView implements View.OnClickListener { + private static String TAG = "AI机器人"; + private EditText robotNameSetting; + private AppCompatTextView automaticGreetingNumber, automaticMessageNumber; + private TextView robotNameText; + private String time = ""; + private ImageView robotState; + + private int robotStateInt = 1; + + public LiveRobotSettingCustomPopup(@NonNull Context context) { + super(context); + } + + // 返回自定义弹窗的布局 + @Override + protected int getImplLayoutId() { + return R.layout.dialog_live_robot_setting; + } + + // 执行初始化操作,比如:findView,设置点击,或者任何你弹窗内的业务逻辑 + @Override + protected void onCreate() { + super.onCreate(); + intiView(); + initDate(); + } + + private void intiView() { + robotNameSetting = findViewById(R.id.robot_name_setting); + robotNameText = findViewById(R.id.robot_name_text); + robotState = findViewById(R.id.robot_state); + automaticGreetingNumber = findViewById(R.id.automatic_greeting_number); + automaticMessageNumber = findViewById(R.id.automatic_message_number); + findViewById(R.id.automatic_message_sending).setOnClickListener(this); + findViewById(R.id.automatic_greeting_setting).setOnClickListener(this); + robotNameText.setOnClickListener(this); + robotState.setOnClickListener(this); + + robotNameSetting.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (actionId == EditorInfo.IME_ACTION_DONE) { + // 修改助手名字 + LiveNetManager.get(getContext()) + .setAiRobotDate("ai_name", robotNameSetting.getText().toString(), new HttpCallback() { + @Override + public void onSuccess(HttpCallbackModel data) { + robotNameSetting.setVisibility(GONE); + robotNameText.setVisibility(VISIBLE); + robotNameText.setText(robotNameSetting.getText().toString()); + } + + @Override + public void onError(String error) { + ToastUtil.show(error); + } + }); + + } + return false; + } + }); + } + + @Override + public void onClick(View v) { + int viewID = v.getId(); + if (viewID == R.id.automatic_message_sending) { + new XPopup.Builder(getContext()) + .setPopupCallback(new XPopupCallback() { + @Override + public void onCreated(BasePopupView popupView) { + + } + + @Override + public void beforeShow(BasePopupView popupView) { + + } + + @Override + public void onShow(BasePopupView popupView) { + + } + + @Override + public void onDismiss(BasePopupView popupView) { + initDate(); + } + + @Override + public void beforeDismiss(BasePopupView popupView) { + + } + + @Override + public boolean onBackPressed(BasePopupView popupView) { + return false; + } + + @Override + public void onKeyBoardStateChanged(BasePopupView popupView, int height) { + + } + + @Override + public void onDrag(BasePopupView popupView, int value, float percent, boolean upOrLeft) { + + } + + @Override + public void onClickOutside(BasePopupView popupView) { + + } + }) + .asCustom(new LiveRobotMessageCustomPopup(getContext(), time)) + .show(); + } else if (viewID == R.id.robot_name_text) { + robotNameText.setVisibility(GONE); + robotNameSetting.setVisibility(VISIBLE); + robotNameSetting.setText(robotNameText.getText().toString()); + //输入框,获取焦点 不然无法弹出键盘 + robotNameSetting.requestFocus(); + //键盘输入法管理器 + InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + imm.showSoftInput(robotNameSetting, 0); + } else if (viewID == R.id.robot_state) { + int state = 0; + if (robotStateInt == 1) { + state = 0; + } else { + state = 1; + } + // 修改助手名字 + int finalState = state; + LiveNetManager.get(getContext()) + .setAiRobotDate("ai_state", String.valueOf(state), new HttpCallback() { + @Override + public void onSuccess(HttpCallbackModel data) { + if (finalState == 1) { + robotState.setImageResource(R.mipmap.special_icon_on); + robotStateInt = 1; + } else { + robotState.setImageResource(R.mipmap.special_icon_off); + robotStateInt = 0; + } + } + + @Override + public void onError(String error) { + ToastUtil.show(error); + } + }); + } else if (viewID == R.id.automatic_greeting_setting) { + new XPopup.Builder(getContext()) + .setPopupCallback(new XPopupCallback() { + @Override + public void onCreated(BasePopupView popupView) { + + } + + @Override + public void beforeShow(BasePopupView popupView) { + + } + + @Override + public void onShow(BasePopupView popupView) { + + } + + @Override + public void onDismiss(BasePopupView popupView) { + initDate(); + } + + @Override + public void beforeDismiss(BasePopupView popupView) { + + } + + @Override + public boolean onBackPressed(BasePopupView popupView) { + return false; + } + + @Override + public void onKeyBoardStateChanged(BasePopupView popupView, int height) { + + } + + @Override + public void onDrag(BasePopupView popupView, int value, float percent, boolean upOrLeft) { + + } + + @Override + public void onClickOutside(BasePopupView popupView) { + + } + }) + .asCustom(new LiveRobotSayHelloCustomPopup(getContext())) + .show(); + } + } + + private void initDate() { + LiveNetManager.get(getContext()) + .getAiRobotStatus(new com.yunbao.common.http.base.HttpCallback() { + @Override + public void onSuccess(LiveAiRobotBean data) { + robotNameText.setText(data.getName()); + automaticGreetingNumber.setText(String.valueOf(data.getAutoSeyHiNumber())); + automaticMessageNumber.setText(String.valueOf(data.getAutoRequestFollowNumber())); + time = String.valueOf(data.getTime()); + robotStateInt = data.getStatus(); + if (data.getStatus() == 1) { + robotState.setImageResource(R.mipmap.special_icon_on); + } + } + + @Override + public void onError(String error) { + ToastUtil.show(error); + } + }); + + initListType1(); + initListType2(); + } + + + private void initListType1() { + + } + + private void initListType2() { + + } +} diff --git a/common/src/main/java/com/yunbao/common/views/RobotMessageViewHolder.java b/common/src/main/java/com/yunbao/common/views/RobotMessageViewHolder.java new file mode 100644 index 000000000..f182a0c12 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/RobotMessageViewHolder.java @@ -0,0 +1,77 @@ +package com.yunbao.common.views; + +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.lxj.xpopup.XPopup; +import com.yunbao.common.R; +import com.yunbao.common.bean.HttpCallbackModel; +import com.yunbao.common.bean.LiveAiRobotBean; +import com.yunbao.common.event.LiveRobotMessageEvent; +import com.yunbao.common.http.base.HttpCallback; +import com.yunbao.common.http.live.LiveNetManager; +import com.yunbao.common.utils.Bus; +import com.yunbao.common.utils.ToastUtil; + + +public class RobotMessageViewHolder extends RecyclerView.ViewHolder { + private TextView serialNumber, messageText; + private ImageView btnDelete; + + public RobotMessageViewHolder(@NonNull View itemView) { + super(itemView); + serialNumber = itemView.findViewById(R.id.serial_number); + messageText = itemView.findViewById(R.id.message_text); + btnDelete = itemView.findViewById(R.id.btn_delete); + } + + public void setData(LiveAiRobotBean.Message message, int index) { + serialNumber.setText(String.valueOf(index)); + messageText.setText(message.getContent()); + btnDelete.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + LiveNetManager.get(itemView.getContext()) + .delAiRobotBody(LiveAiRobotBean.Message.TYPE_FOLLOW, message.getId(), new HttpCallback() { + @Override + public void onSuccess(HttpCallbackModel data) { + Bus.get().post(new LiveRobotMessageEvent().setIndex(index - 1)); + } + + @Override + public void onError(String error) { + ToastUtil.show(error); + } + }); + } + }); + messageText.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + new XPopup.Builder(itemView.getContext()) + .asCustom(new InputCustomPopup(itemView.getContext(), message.getContent()).setListener(new InputCustomPopup.InputCustomListener() { + @Override + public void onConfirm(String text) { + LiveNetManager.get(itemView.getContext()) + .updateAiRobotBody(LiveAiRobotBean.Message.TYPE_FOLLOW, message.getId(), text, new HttpCallback() { + @Override + public void onSuccess(HttpCallbackModel data) { + Bus.get().post(new LiveRobotMessageEvent()); + } + + @Override + public void onError(String error) { + ToastUtil.show(error); + } + }); + } + })) + .show(); + } + }); + } +} diff --git a/common/src/main/java/com/yunbao/common/views/RobotSayHelloViewHoler.java b/common/src/main/java/com/yunbao/common/views/RobotSayHelloViewHoler.java new file mode 100644 index 000000000..359f7ba1a --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/RobotSayHelloViewHoler.java @@ -0,0 +1,77 @@ +package com.yunbao.common.views; + +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.lxj.xpopup.XPopup; +import com.yunbao.common.R; +import com.yunbao.common.bean.HttpCallbackModel; +import com.yunbao.common.bean.LiveAiRobotBean; +import com.yunbao.common.event.LiveRobotSayHelloEvent; +import com.yunbao.common.http.base.HttpCallback; +import com.yunbao.common.http.live.LiveNetManager; +import com.yunbao.common.utils.Bus; +import com.yunbao.common.utils.ToastUtil; + +public class RobotSayHelloViewHoler extends RecyclerView.ViewHolder { + private TextView serialNumber, messageText; + private ImageView btnDelete; + + public RobotSayHelloViewHoler(@NonNull View itemView) { + super(itemView); + serialNumber = itemView.findViewById(R.id.serial_number); + messageText = itemView.findViewById(R.id.message_text); + btnDelete = itemView.findViewById(R.id.btn_delete); + } + + + public void setData(LiveAiRobotBean.Message message, int index) { + serialNumber.setText(String.valueOf(index)); + messageText.setText(message.getContent()); + btnDelete.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + LiveNetManager.get(itemView.getContext()) + .delAiRobotBody(LiveAiRobotBean.Message.TYPE_SAY_HI, message.getId(), new HttpCallback() { + @Override + public void onSuccess(HttpCallbackModel data) { + Bus.get().post(new LiveRobotSayHelloEvent().setIndex(index - 1)); + } + + @Override + public void onError(String error) { + ToastUtil.show(error); + } + }); + } + }); + messageText.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + new XPopup.Builder(itemView.getContext()) + .asCustom(new InputCustomPopup(itemView.getContext(), message.getContent()).setListener(new InputCustomPopup.InputCustomListener() { + @Override + public void onConfirm(String text) { + LiveNetManager.get(itemView.getContext()) + .updateAiRobotBody(LiveAiRobotBean.Message.TYPE_SAY_HI, message.getId(), text, new HttpCallback() { + @Override + public void onSuccess(HttpCallbackModel data) { + Bus.get().post(new LiveRobotSayHelloEvent()); + } + + @Override + public void onError(String error) { + ToastUtil.show(error); + } + }); + } + })) + .show(); + } + }); + } +} diff --git a/common/src/main/res/drawable/background_81c16d.xml b/common/src/main/res/drawable/background_81c16d.xml new file mode 100644 index 000000000..c089906d7 --- /dev/null +++ b/common/src/main/res/drawable/background_81c16d.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/live/src/main/res/drawable/bg_prank_coin.xml b/common/src/main/res/drawable/bg_prank_coin.xml similarity index 100% rename from live/src/main/res/drawable/bg_prank_coin.xml rename to common/src/main/res/drawable/bg_prank_coin.xml diff --git a/common/src/main/res/drawable/bg_robot_shape.xml b/common/src/main/res/drawable/bg_robot_shape.xml new file mode 100644 index 000000000..24885134c --- /dev/null +++ b/common/src/main/res/drawable/bg_robot_shape.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/icon_robot.png b/common/src/main/res/drawable/icon_robot.png new file mode 100644 index 000000000..aa0d8b457 Binary files /dev/null and b/common/src/main/res/drawable/icon_robot.png differ diff --git a/common/src/main/res/layout/custom_drawer_popup.xml b/common/src/main/res/layout/custom_drawer_popup.xml index d80a71d15..bd90dcbb5 100644 --- a/common/src/main/res/layout/custom_drawer_popup.xml +++ b/common/src/main/res/layout/custom_drawer_popup.xml @@ -108,7 +108,7 @@ + + + + + + + diff --git a/common/src/main/res/layout/dialog_live_robot_message.xml b/common/src/main/res/layout/dialog_live_robot_message.xml new file mode 100644 index 000000000..ef60a75bc --- /dev/null +++ b/common/src/main/res/layout/dialog_live_robot_message.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/dialog_live_robot_say_hello.xml b/common/src/main/res/layout/dialog_live_robot_say_hello.xml new file mode 100644 index 000000000..0dc1bda30 --- /dev/null +++ b/common/src/main/res/layout/dialog_live_robot_say_hello.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/dialog_live_robot_setting.xml b/common/src/main/res/layout/dialog_live_robot_setting.xml new file mode 100644 index 000000000..0cedd53b9 --- /dev/null +++ b/common/src/main/res/layout/dialog_live_robot_setting.xml @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/input_custom_popup.xml b/common/src/main/res/layout/input_custom_popup.xml new file mode 100644 index 000000000..a7d7aeabb --- /dev/null +++ b/common/src/main/res/layout/input_custom_popup.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/view_robot_message.xml b/common/src/main/res/layout/view_robot_message.xml new file mode 100644 index 000000000..7a85c2a32 --- /dev/null +++ b/common/src/main/res/layout/view_robot_message.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/mipmap-xxhdpi/icon_close.png b/common/src/main/res/mipmap-xxhdpi/icon_close.png new file mode 100644 index 000000000..7842d906a Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/icon_close.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/icon_robot.png b/common/src/main/res/mipmap-xxhdpi/icon_robot.png new file mode 100644 index 000000000..aa0d8b457 Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/icon_robot.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/icon_tip.png b/common/src/main/res/mipmap-xxhdpi/icon_tip.png new file mode 100644 index 000000000..d5b68983e Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/icon_tip.png differ diff --git a/common/src/main/res/mipmap-xxhdpi/live_more_icon_robot.png b/common/src/main/res/mipmap-xxhdpi/live_more_icon_robot.png new file mode 100644 index 000000000..bba2b0662 Binary files /dev/null and b/common/src/main/res/mipmap-xxhdpi/live_more_icon_robot.png differ diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index 2e408f8e0..b0b723181 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -978,4 +978,22 @@ 拒绝 坚持拒绝 随机PK提示 + + 自動發言機器人設置 + 機器人開關 + 機器人名字設置 + 字數限制2-8個字 + 自動打招呼設置 + 已配置條數 + 自動發消息設置 + 前往設置 + 感謝送禮、PK開始、PK結束的自動機器人消息,\n暫不支持自定義。 + 添加內容 + 每隔一段時間,機器人自動隨機以下一句話發出。 + 填寫內容推薦,如:求送心願單、加粉絲團等 + 自動發言間隔時間(分鐘) + 最少間隔5分鐘1次 + 當有用戶進入直播間時,機器人會@該用戶並自動 + 隨機以下一句話。最少設置1條,最多20條。 + 機器人設置 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 ae79b5bb8..8a46d8030 100644 --- a/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java +++ b/live/src/main/java/com/yunbao/live/activity/LiveRyAnchorActivity.java @@ -34,6 +34,7 @@ import com.alibaba.fastjson.JSONObject; import com.bumptech.glide.Glide; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; +import com.lxj.xpopup.XPopup; import com.opensource.svgaplayer.SVGAImageView; import com.tencent.trtc.TRTCCloudDef; import com.yunbao.common.CommonAppConfig; @@ -66,13 +67,13 @@ import com.yunbao.common.utils.ScreenDimenUtil; import com.yunbao.common.utils.StringUtil; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.utils.WordUtil; +import com.yunbao.common.views.LiveRobotSettingCustomPopup; import com.yunbao.faceunity.FaceManager; import com.yunbao.live.R; import com.yunbao.live.bean.LiveGuardInfo; import com.yunbao.live.bean.LiveKsyConfigBean; import com.yunbao.live.bean.LiveReceiveGiftBean; import com.yunbao.live.dialog.FreePkDialogFragment; -import com.yunbao.live.dialog.LiveLinkMicListDialogFragment; import com.yunbao.live.dialog.LiveNewFunctionDialogFragment; import com.yunbao.live.dialog.LiveNewWishListDialogFragment; import com.yunbao.live.dialog.LivePrankDialogFragment; @@ -281,6 +282,11 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl @Override public void onClick(int functionID) { switch (functionID) { + case Constants.LIVE_ROBOT: + new XPopup.Builder(mContext) + .asCustom(new LiveRobotSettingCustomPopup(mContext)) + .show(); + break; case Constants.LIVE_FUNC_ZG://zg // ToastUtil.show("開發中,敬請期待"); LivePrankDialogFragment fragment = new LivePrankDialogFragment(); diff --git a/live/src/main/java/com/yunbao/live/adapter/LiveChatAdapter.java b/live/src/main/java/com/yunbao/live/adapter/LiveChatAdapter.java index d0020fde6..27341f9d0 100644 --- a/live/src/main/java/com/yunbao/live/adapter/LiveChatAdapter.java +++ b/live/src/main/java/com/yunbao/live/adapter/LiveChatAdapter.java @@ -47,6 +47,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Set; /** * Created by cxf on 2018/10/10. @@ -127,7 +128,7 @@ public class LiveChatAdapter extends RecyclerView.Adapter { @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); - if (isSlideToBottom(recyclerView)) return; + if (isSlideToBottom(recyclerView) || dy == 0) return; mRecyclerViewScrolledDy = dy; } }); @@ -379,16 +380,23 @@ public class LiveChatAdapter extends RecyclerView.Adapter { @SuppressLint("NotifyDataSetChanged") public void insertItem(LiveChatBean bean) { - if (bean == null) { return; } + // Log.i(TAG, "insertItem: " + bean.getContent()); int size = mList.size(); //设置最大展示99条消息 if (size == 100) { - mList.remove(0); + mList.subList(0, 50).clear(); + notifyItemRangeRemoved(0, 50); } mList.add(bean); + if (getItemCount() == 1) { + notifyDataSetChanged(); + } else { + notifyItemInserted(getItemCount()); + } + size = mList.size(); if (isSlideToBottom(mRecyclerView) || mRecyclerViewScrolledDy == 0) { scrollToBottom(); } else { @@ -401,11 +409,7 @@ public class LiveChatAdapter extends RecyclerView.Adapter { mPosition = size; } } - if (getItemCount() == 1) { - notifyDataSetChanged(); - } else { - notifyItemInserted(getItemCount()); - } + } @@ -447,6 +451,7 @@ public class LiveChatAdapter extends RecyclerView.Adapter { } public void scrollToBottom() { + mRecyclerViewScrolledDy = 0; if (mList.size() > 0) { mRecyclerView.smoothScrollToPosition(getItemCount() - 1); } diff --git a/live/src/main/java/com/yunbao/live/adapter/LiveChatRecyclerViewLayoutManager.java b/live/src/main/java/com/yunbao/live/adapter/LiveChatRecyclerViewLayoutManager.java new file mode 100644 index 000000000..fdd546e65 --- /dev/null +++ b/live/src/main/java/com/yunbao/live/adapter/LiveChatRecyclerViewLayoutManager.java @@ -0,0 +1,40 @@ +package com.yunbao.live.adapter; + +import android.content.Context; +import android.graphics.PointF; +import android.util.DisplayMetrics; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.LinearSmoothScroller; +import androidx.recyclerview.widget.RecyclerView; + +public class LiveChatRecyclerViewLayoutManager extends LinearLayoutManager { + private static final float MILLISECONDS_PER_INCH = 200f; + public LiveChatRecyclerViewLayoutManager(Context context) { + super(context); + } + + @Override + public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { + // super.smoothScrollToPosition(recyclerView, state, position); + LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) + { + + @Nullable + @Override + public PointF computeScrollVectorForPosition(int targetPosition) { + return LiveChatRecyclerViewLayoutManager.this.computeScrollVectorForPosition(targetPosition); + } + + @Override + protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { + // System.out.println("----->自定义滑动 = "+MILLISECONDS_PER_INCH+" > "+( MILLISECONDS_PER_INCH / displayMetrics.densityDpi)); + return MILLISECONDS_PER_INCH / displayMetrics.densityDpi; + } + + }; + linearSmoothScroller.setTargetPosition(position); + startSmoothScroll(linearSmoothScroller); + } +} 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 364ea23fd..48e7168ef 100644 --- a/live/src/main/java/com/yunbao/live/dialog/LiveNewFunctionDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/LiveNewFunctionDialogFragment.java @@ -92,6 +92,7 @@ public class LiveNewFunctionDialogFragment extends AbsDialogFragment implements mMultiPkView.setOnClickListener(this); mMicView.setOnClickListener(this); mRandomPk.setOnClickListener(this); + findViewById(R.id.live_tool_robot).setOnClickListener(this); if (leave == 0) { ((ImageView) mLeaveView.findViewById(R.id.live_tool_leave_img)).setImageResource(R.mipmap.icon_leave); @@ -145,6 +146,9 @@ 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){ + mFunctionClickListener.onClick(LIVE_ROBOT); + dismiss(); } } } diff --git a/live/src/main/java/com/yunbao/live/dialog/LiveRobotSettingDialogFragment.java b/live/src/main/java/com/yunbao/live/dialog/LiveRobotSettingDialogFragment.java index 13eeae167..05c020c6a 100644 --- a/live/src/main/java/com/yunbao/live/dialog/LiveRobotSettingDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/LiveRobotSettingDialogFragment.java @@ -3,21 +3,18 @@ package com.yunbao.live.dialog; import android.app.ActionBar; import android.os.Bundle; import android.view.Gravity; -import android.view.View; import android.view.Window; import android.view.WindowManager; -import com.yunbao.common.dialog.AbsDialogFragment; -import com.yunbao.common.utils.DpUtil; -import com.yunbao.live.R; - import androidx.annotation.Nullable; +import com.yunbao.common.dialog.AbsDialogFragment; +import com.yunbao.live.R; + /** * 机器人设置 */ -public class LiveRobotSettingDialogFragment extends AbsDialogFragment implements View.OnClickListener { - +public class LiveRobotSettingDialogFragment extends AbsDialogFragment { @Override @@ -39,24 +36,15 @@ public class LiveRobotSettingDialogFragment extends AbsDialogFragment implements protected void setWindowAttributes(Window window) { WindowManager.LayoutParams params = window.getAttributes(); params.width = ActionBar.LayoutParams.MATCH_PARENT; - params.height = DpUtil.dp2px(460); + params.height = ActionBar.LayoutParams.WRAP_CONTENT; params.gravity = Gravity.BOTTOM; window.setAttributes(params); } + @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - Bundle bundle = getArguments(); - if (bundle == null) { - return; - } - - } - - @Override - public void onClick(View 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 ecdbdcd42..57be40428 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveNewReadyRyViewHolder.java @@ -2,7 +2,6 @@ package com.yunbao.live.views; import android.app.Dialog; import android.content.Context; -import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; @@ -17,13 +16,13 @@ import android.widget.TextView; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.core.content.ContextCompat; +import com.lxj.xpopup.XPopup; import com.yunbao.common.CommonAppConfig; import com.yunbao.common.Constants; import com.yunbao.common.bean.LiveClassBean; import com.yunbao.common.bean.UserBean; import com.yunbao.common.glide.ImgLoader; import com.yunbao.common.http.HttpCallback; -import com.yunbao.common.interfaces.ActivityResultCallback; import com.yunbao.common.interfaces.CommonCallback; import com.yunbao.common.interfaces.ImageResultCallback; import com.yunbao.common.utils.DialogUitl; @@ -33,9 +32,9 @@ import com.yunbao.common.utils.StringUtil; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.utils.WordUtil; import com.yunbao.common.views.AbsViewHolder; +import com.yunbao.common.views.LiveRobotSettingCustomPopup; import com.yunbao.faceunity.FaceManager; import com.yunbao.live.R; -import com.yunbao.live.activity.Beauty360Activity3; import com.yunbao.live.activity.LiveActivity; import com.yunbao.live.activity.LiveRyAnchorActivity; import com.yunbao.live.bean.LiveRoomTypeBean; @@ -160,6 +159,7 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl findViewById(R.id.btn_live_class).setOnClickListener(this); findViewById(R.id.btn_close).setOnClickListener(this); findViewById(R.id.btn_beauty).setOnClickListener(this); + findViewById(R.id.btn_robot).setOnClickListener(this); findViewById(R.id.btn_start_live).setOnClickListener(this); findViewById(R.id.btn_wishlist).setOnClickListener(this); findViewById(R.id.btn_horizontally).setOnClickListener(this); @@ -218,6 +218,10 @@ public class LiveNewReadyRyViewHolder extends AbsViewHolder implements View.OnCl } else if (i == R.id.btn_horizontally) { RCRTCCameraOutputStream cameraStream = RCRTCEngine.getInstance().getDefaultVideoStream(); cameraStream.setPreviewMirror(!cameraStream.isPreviewMirror()); + } else if (i == R.id.btn_robot) { + new XPopup.Builder(mContext) + .asCustom(new LiveRobotSettingCustomPopup(mContext)) + .show(); } } diff --git a/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java index 4bb78c38c..8ec1f59c2 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveRoomViewHolder.java @@ -36,6 +36,7 @@ import androidx.annotation.Nullable; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.SimpleItemAnimator; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; @@ -115,6 +116,7 @@ import com.yunbao.live.activity.LiveAudienceActivity; import com.yunbao.live.activity.LiveRyAnchorActivity; import com.yunbao.live.activity.ZhuangBanActivity; import com.yunbao.live.adapter.LiveChatAdapter; +import com.yunbao.live.adapter.LiveChatRecyclerViewLayoutManager; import com.yunbao.live.adapter.LiveRoomFastMessageRecyclerViewAdapter; import com.yunbao.live.adapter.LiveUserAdapter; import com.yunbao.live.bean.DrPkbean; @@ -867,11 +869,54 @@ public class LiveRoomViewHolder extends AbsViewHolder implements View.OnClickLis mChatRecyclerView.setLayoutParams(params1); mChatRecyclerView.setHasFixedSize(true); - LinearLayoutManager layoutManager = new LinearLayoutManager(mContext); + LinearLayoutManager layoutManager = new LiveChatRecyclerViewLayoutManager(mContext); layoutManager.setStackFromEnd(true); mChatRecyclerView.setLayoutManager(layoutManager); mChatRecyclerView.addItemDecoration(new TopGradual()); mChatRecyclerView.setItemViewCacheSize(10); + mChatRecyclerView.setItemAnimator(new SimpleItemAnimator() { + @Override + public boolean animateRemove(RecyclerView.ViewHolder holder) { + return false; + } + + @Override + public boolean animateAdd(RecyclerView.ViewHolder holder) { + Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.live_chat_msg_in); + holder.itemView.startAnimation(animation); + return false; + } + + @Override + public boolean animateMove(RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) { + return false; + } + + @Override + public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, int fromLeft, int fromTop, int toLeft, int toTop) { + return false; + } + + @Override + public void runPendingAnimations() { + + } + + @Override + public void endAnimation(@NonNull RecyclerView.ViewHolder item) { + + } + + @Override + public void endAnimations() { + + } + + @Override + public boolean isRunning() { + return false; + } + }); mLiveChatAdapter = new LiveChatAdapter(mContext); mChatRecyclerView.setAdapter(mLiveChatAdapter); mLiveChatAdapter.setOnItemClickListener(new OnItemClickListener() { @@ -927,6 +972,39 @@ public class LiveRoomViewHolder extends AbsViewHolder implements View.OnClickLis mViewMedal.setOnClickListener(this); findViewById(R.id.btn_close).setOnClickListener(this); mAvatar.setOnClickListener(this); + /*//点击侧边消息按钮,自动发消息,测试用的 + msg.setOnClickListener(new View.OnClickListener() { + long index = 0; + + public TimerTask createTask() { + return new TimerTask() { + @Override + public void run() { + LiveChatBean bean = new LiveChatBean(); + bean.setContent("test msg = " + index++); + bean.setUserNiceName("auto"); + handler.post(() -> mLiveChatAdapter.insertItem(bean)); + } + }; + } + + Handler handler = new Handler(Looper.getMainLooper()); + private TimerTask task; + + @Override + public void onClick(View v) { + if (task == null) { + task = createTask(); + new Timer().schedule(task, 0, 1000); + } else { + task.cancel(); + task = null; + } + } + }); + userMore.setOnClickListener(v -> { + mLiveChatAdapter.scrollToBottom(); + });*/ findViewById(R.id.btn_votes).setOnClickListener(this); findViewById(R.id.btn_medal_rank).setOnClickListener(this); findViewById(R.id.btn_noble).setOnClickListener(this); @@ -3721,6 +3799,7 @@ public class LiveRoomViewHolder extends AbsViewHolder implements View.OnClickLis * 展示新消息提示 */ public void showNewMessage() { + if (newMessage.getVisibility() == View.VISIBLE) return; Locale locale = mContext.getResources().getConfiguration().locale; String language = locale.getLanguage(); ImgLoader.display(mContext, TextUtils.equals(language, "zh") ? R.mipmap.new_message_cn : R.mipmap.new_message_en, newMessage); diff --git a/live/src/main/res/anim/live_chat_msg_in.xml b/live/src/main/res/anim/live_chat_msg_in.xml new file mode 100644 index 000000000..8042381e2 --- /dev/null +++ b/live/src/main/res/anim/live_chat_msg_in.xml @@ -0,0 +1,16 @@ + + + + + \ No newline at end of file diff --git a/live/src/main/res/layout/dialog_live_robot_setting.xml b/live/src/main/res/layout/dialog_live_robot_setting.xml deleted file mode 100644 index d7ba7721e..000000000 --- a/live/src/main/res/layout/dialog_live_robot_setting.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - \ 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 9d2a0de5d..98af6cebf 100644 --- a/live/src/main/res/layout/view_new_live_ready.xml +++ b/live/src/main/res/layout/view_new_live_ready.xml @@ -1,8 +1,6 @@ - @@ -254,13 +252,23 @@ android:id="@+id/faceTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textColor="#FFFFFF" - android:visibility="gone" - android:textSize="16sp" android:text="" + android:textColor="#FFFFFF" + android:textSize="16sp" + android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + \ No newline at end of file diff --git a/live/src/main/res/mipmap-xxxhdpi/icon_back.png b/live/src/main/res/mipmap-xxxhdpi/icon_back.png new file mode 100644 index 000000000..a55b3ebf7 Binary files /dev/null and b/live/src/main/res/mipmap-xxxhdpi/icon_back.png differ