This commit is contained in:
18401019693 2022-07-21 11:24:15 +08:00
parent 42138777e3
commit e1dbc9d38c
64 changed files with 4785 additions and 915 deletions

View File

@ -112,18 +112,6 @@
<meta-data
android:name="TencentMapSDK"
android:value="${txMapAppKey}" />
<!-- <meta-data-->
<!-- android:name="TencentMapAppSecret"-->
<!-- android:value="${txMapAppSecret}" /> &lt;!&ndash; 腾讯bugly &ndash;&gt;-->
<!-- <meta-data-->
<!-- android:name="BUGLY_APPID"-->
<!-- android:value="${buglyAppId}" />-->
<!-- <meta-data-->
<!-- android:name="BUGLY_APP_CHANNEL"-->
<!-- android:value="com.chihu.phonelive" />-->
<!-- <meta-data-->
<!-- android:name="BUGLY_ENABLE_DEBUG"-->
<!-- android:value="true" /> &lt;!&ndash; 腾讯bugly end &ndash;&gt;-->
<!-- 百度语音识别 -->
<meta-data
android:name="com.baidu.speech.APP_ID"
@ -135,16 +123,6 @@
android:name="com.baidu.speech.SECRET_KEY"
android:value="${baiduAppSecretKey}" />
<!-- <service-->
<!-- android:name="com.baidu.speech.VoiceRecognitionService"-->
<!-- android:exported="false" /> &lt;!&ndash; 百度语音识别end &ndash;&gt;-->
<!-- 友盟统计 -->
<!-- <meta-data-->
<!-- android:name="UMENG_APPKEY"-->
<!-- android:value="${umengAppKey}" />-->
<!-- <meta-data-->
<!-- android:name="UMENG_CHANNEL"-->
<!-- android:value="com.chihu.phonelive" /> &lt;!&ndash; 友盟统计 end &ndash;&gt;-->
<!-- 服务器地址 -->
<meta-data
android:name="SERVER_HOST"

View File

@ -26,20 +26,15 @@ import com.tencent.imsdk.v2.V2TIMUserInfo;
import com.yunbao.common.BuildConfig;
import com.yunbao.common.CommonAppContext;
import com.yunbao.common.Constants;
import com.yunbao.common.manager.imrongcloud.RongcloudIMManager;
import com.yunbao.common.http.CommonHttpUtil;
import com.yunbao.common.http.HttpCallback;
import com.yunbao.common.utils.L;
import com.yunbao.live.socket.SocketRyClient;
import com.yunbao.live.utils.LiveImDeletUtil;
import java.io.File;
import java.io.IOException;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.Conversation;
import io.rong.message.TextMessage;
import static com.adjust.sdk.AdjustConfig.ENVIRONMENT_PRODUCTION;
import static com.yunbao.live.socket.SocketClient.mSocketHandler;
//import cn.tillusory.sdk.TiSDK;
@ -151,85 +146,12 @@ public class AppContext extends CommonAppContext {
//初始化 AndroidUtilCode
Utils.init(this);
liveImDeletUtil = new LiveImDeletUtil();
// 融云
RongIMClient.getInstance().setOnReceiveMessageListener(new RongIMClient.OnReceiveMessageWrapperListener() {
/**
* 接收实时或者离线消息
* 注意:
* 1. 针对接收离线消息时服务端会将 200 条消息打成一个包发到客户端客户端对这包数据进行解析
* 2. hasPackage 标识是否还有剩余的消息包left 标识这包消息解析完逐条抛送给 App 层后剩余多少条
* 如何判断离线消息收完
* 1. hasPackage left 都为 0
* 2. hasPackage 0 标识当前正在接收最后一包200条消息left 0 标识最后一包的最后一条消息也已接收完毕
*
* @param message 接收到的消息对象
* @param left 每个数据包数据逐条上抛后还剩余的条数
* @param hasPackage 是否在服务端还存在未下发的消息包
* @param offline 消息是否离线消息
* @return 是否处理消息 如果 App 处理了此消息返回 true; 否则返回 false SDK 处理
*/
@Override
public boolean onReceived(io.rong.imlib.model.Message message, int left, boolean hasPackage, boolean offline) {
Log.e("rytest", message.getContent() + "");
if (message.getConversationType() == Conversation.ConversationType.CHATROOM) {
//群聊
Message msg = Message.obtain();
msg.what = Constants.SOCKET_WHAT_BROADCAST;
if (!"".equals(message.getContent()) && message.getContent() != null) {
if (message.getObjectName().equals("RC:TxtMsg")) {
TextMessage content = (TextMessage) message.getContent();
msg.obj = content.getContent();
if (SocketRyClient.mSocketHandler != null && Ingroup == 1) {
SocketRyClient.mSocketHandler.sendMessage(msg);
}
TextMessage rongMsg = (TextMessage) message.getContent();
String firstIndexRM = "";
if (rongMsg.getContent().length() > 4) {
firstIndexRM = rongMsg.getContent().substring(0, 5);
}
String firstIndexRM2 = "";
if (rongMsg.getContent().length() > 9) {
firstIndexRM2 = rongMsg.getContent().substring(0, 10);
}
if ("{\"msg".equals(firstIndexRM) || "{\"retcode\"".equals(firstIndexRM2)) {
liveImDeletUtil.deleteMessages(message.getTargetId(), message.getMessageId());
}
}
}
} else {
//私聊
Message msg = Message.obtain();
msg.what = Constants.SOCKET_WHAT_BROADCAST;
if (!"".equals(message.getContent()) && message.getContent() != null) {
if (message.getObjectName().equals("RC:TxtMsg")) {
TextMessage content = (TextMessage) message.getContent();
msg.obj = content.getContent();
if (content.getContent().contains("_method_")) {
if (SocketRyClient.mSocketHandler != null) {
CommonAppContext.Ingroup = 1;
SocketRyClient.mSocketHandler.sendMessage(msg);
}
}
TextMessage rongMsg = (TextMessage) message.getContent();
String firstIndexRM = "";
if (rongMsg.getContent().length() > 4) {
firstIndexRM = rongMsg.getContent().substring(0, 5);
}
String firstIndexRM2 = "";
if (rongMsg.getContent().length() > 9) {
firstIndexRM2 = rongMsg.getContent().substring(0, 10);
}
if ("{\"msg".equals(firstIndexRM) || "{\"retcode\"".equals(firstIndexRM2)) {
liveImDeletUtil.deleteMessages(message.getTargetId(), message.getMessageId());
}
}
}
}
return false;
}
//
RongcloudIMManager.addRongcloudIMOnReceiveMessageListener();
//初始化融云
RongcloudIMManager.initRongIM(this);
//添加融云连接状态监听
RongcloudIMManager.setIMStatusListener();
});
@ -275,4 +197,9 @@ public class AppContext extends CommonAppContext {
return false;
}
@Override
public void onTerminate() {
RongcloudIMManager.removeRongcloudIMOnReceiveMessageListener();
super.onTerminate();
}
}

View File

@ -6,8 +6,10 @@ import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.Gravity;
@ -32,12 +34,15 @@ import com.tencent.ugc.TXUGCBase;
import com.yunbao.common.CommonAppConfig;
import com.yunbao.common.bean.AdBean;
import com.yunbao.common.bean.ConfigBean;
import com.yunbao.common.bean.IMLoginModel;
import com.yunbao.common.bean.UserBean;
import com.yunbao.common.custom.CircleProgress;
import com.yunbao.common.glide.ImgLoader;
import com.yunbao.common.http.CommonHttpConsts;
import com.yunbao.common.http.CommonHttpUtil;
import com.yunbao.common.interfaces.CommonCallback;
import com.yunbao.common.manager.IMLoginManager;
import com.yunbao.common.manager.imrongcloud.RongcloudIMManager;
import com.yunbao.common.utils.DownloadUtil;
import com.yunbao.common.utils.L;
import com.yunbao.common.utils.MD5Util;
@ -94,10 +99,6 @@ public class LauncherActivity extends AppCompatActivity implements View.OnClickL
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStatusBar();
// if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
// finish();
// return;
// }
setContentView(R.layout.activity_launcher);
//开屏
AdjustEvent adjustEvent = new AdjustEvent("vjqk8g");
@ -230,20 +231,11 @@ public class LauncherActivity extends AppCompatActivity implements View.OnClickL
mHandler.removeCallbacksAndMessages(null);
mHandler = null;
}
String[] uidAndToken = SpUtil.getInstance().getMultiStringValue(
new String[]{SpUtil.UID, SpUtil.TOKEN});
final String uid = uidAndToken[0];
final String token = uidAndToken[1];
if (!TextUtils.isEmpty(uid) && !TextUtils.isEmpty(token)) {
MainHttpUtil.getBaseInfo(uid, token, new CommonCallback<UserBean>() {
@Override
public void callback(UserBean bean) {
if (bean != null) {
CommonAppConfig.getInstance().setLoginInfo(uid, token, false);
forwardMainActivity();
}
}
});
IMLoginModel model = IMLoginManager.get(this).getUserInfo();
if (model != null) {
//融云连接服务器
RongcloudIMManager.connectIM(this);
forwardMainActivity();
} else {
releaseVideo();
this.startActivity(new Intent(this, EntryActivity.class));
@ -258,7 +250,6 @@ public class LauncherActivity extends AppCompatActivity implements View.OnClickL
private void forwardMainActivity() {
releaseVideo();
MainActivity.forward(mContext);
// this.startActivity(new Intent(this, TestActivity.class));
finish();
}

View File

@ -152,8 +152,8 @@ dependencies {
api 'com.google.code.gson:gson:2.8.8'
api 'cn.rongcloud.sdk:rtc_lib:5.2.0' //
// 5.1.2
api 'cn.rongcloud.sdk:im_lib:5.2.0.2'
api 'cn.rongcloud.sdk:im_lib:5.1.3.10' //
api 'cn.rongcloud.sdk:im_kit:5.1.3.10' // UI
api 'com.facebook.android:facebook-login:8.2.0'
api 'com.facebook.android:facebook-android-sdk:[5,6)'

View File

@ -13,23 +13,24 @@ import android.os.Bundle;
import android.os.Environment;
import android.os.Parcelable;
import android.provider.MediaStore;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.loader.app.LoaderManager;
import androidx.core.content.ContextCompat;
import androidx.loader.content.CursorLoader;
import androidx.core.content.FileProvider;
import androidx.loader.content.Loader;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.CursorLoader;
import androidx.loader.content.Loader;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.yunbao.common.R;
import com.yunbao.common.adapter.ImageAdapter;
import com.yunbao.common.adapter.ImageFolderAdapter;
@ -62,17 +63,11 @@ public class SelectImageActivity extends AbsActivity implements ImageFolderView.
public static int MAX_SIZE = 5;
private static final int PERMISSION_REQUEST_CODE = 88;
private static final int TAKE_PHOTO = 99;
// @BindView(R.id.tv_back)
TextView mTvBack;
// @BindView(R.id.tv_ok)
TextView mTvSelectCount;
// @BindView(R.id.rv)
RecyclerView mRvImage;
// @BindView(R.id.tv_photo)
TextView mTvPhoto;
// @BindView(R.id.tv_preview)
TextView mTvPreview;
// @BindView(R.id.image_folder_view)
ImageFolderView mImageFolderView;
View v_back;
@ -180,33 +175,6 @@ public class SelectImageActivity extends AbsActivity implements ImageFolderView.
}
}
// @OnClick({R.id.tv_back, R.id.tv_ok, R.id.tv_photo, R.id.tv_preview})
// public void onViewClicked(View view) {
// switch (view.getId()) {
// case R.id.tv_back:
// finish();
// break;
// case R.id.tv_ok:
// Intent intent = new Intent();
// intent.putParcelableArrayListExtra(EXTRA_RESULT, (ArrayList<? extends Parcelable>) mSelectedImages);
// setResult(RESULT_OK, intent);
// finish();
// break;
// case R.id.tv_photo:
// if (mImageFolderView.isShowing()) {
// mImageFolderView.hide();
// } else {
// mImageFolderView.show();
// }
// break;
// case R.id.tv_preview:
// Intent previewIntent = new Intent(this, PreviewImageActivity.class);
// previewIntent.putParcelableArrayListExtra("preview_images", (ArrayList<? extends Parcelable>) mSelectedImages);
// startActivity(previewIntent);
// break;
// }
// }
private void addImageFoldersToAdapter() {
if (mImageFolderAdapter == null) {
mImageFolderAdapter = new ImageFolderAdapter(this, mImageFolders, R.layout.item_list_folder);
@ -460,12 +428,6 @@ public class SelectImageActivity extends AbsActivity implements ImageFolderView.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == TAKE_PHOTO) {
//缩略图信息是储存在返回的intent中的Bundle中的对应Bundle中的键为data因此从Intent中取出 Bundle再根据data取出来Bitmap即可
// Bundle extras = data.getExtras();
// Bitmap bitmap = (Bitmap) extras.get("data");
// BitmapFactory.decodeFile(this.getContentResolver().)
// galleryAddPictures(mImageUri);
// getSupportLoaderManager().restartLoader(0, null, mLoaderCallbacks);
galleryAddPictures();
try {
Bitmap bitmap = BitmapFactory.decodeStream(this.getContentResolver().openInputStream(mImageUri));

View File

@ -0,0 +1,9 @@
package com.yunbao.common.bean;
import java.io.Serializable;
/**
* 数据类基类实现序列化
*/
public class BaseModel implements Serializable {
}

View File

@ -0,0 +1,9 @@
package com.yunbao.common.bean;
/**
* 聊天备注信息
*/
public class ChatRemarkModel extends BaseModel {
private String userId;
private String remarks;
}

View File

@ -0,0 +1,437 @@
package com.yunbao.common.bean;
import com.google.gson.annotations.SerializedName;
/**
* 登录账号的数据类型和com.yunbao.common.bean.UserBean重复分别单独使用后续优化去掉其中一个
*/
public class IMLoginModel extends BaseModel {
/**
* avatar : https://napi.yaoulive.com/default.jpg
* avatar_thumb : https://napi.yaoulive.com/default_thumb.jpg
* birthday :
* city :
* coin : 0
* consumption : 10200
* front_task : 0
* gold : 1020
* goldsumption : 0
* goodnum :
* id : 146267
* issuper : 0
* langue : chinese
* level : 6
* level_anchor : 1
* liang : {"name":"0"}
* location :
* medal_level : 0
* medal_name :
* noble_id : 0
* province :
* sex : 1
* signature : 这家伙很懒什么都没留下
* token : 857706071fb09255b370eaf18d152d69
* token_rong : PT2F9Czs6EdhMRnO1KKIZx0w4VLHhDYtXuIXO7PWfrA=@xln2.sg.rongnav.com;xln2.sg.rongcfg.com
* user_nicename : 测试03
* user_status : 1
* vip : {"type":"0"}
* votestotal : 0
*/
//用户头像
@SerializedName("avatar")
private String avatar = "";
//头像缩略图
@SerializedName("avatar_thumb")
private String avatarThumb = "";
//用户生日
@SerializedName("birthday")
private String birthday = "";
//用户城市
@SerializedName("city")
private String city = "";
//
@SerializedName("coin")
private long coin = 0;
//
@SerializedName("consumption")
private long consumption = 0;
//
@SerializedName("front_task")
private long frontTask = 0;
//
@SerializedName("gold")
private long gold = 0;
//
@SerializedName("goldsumption")
private long goldsumption = 0;
//
@SerializedName("goodnum")
private String goodnum = "";
//用户ID唯一识别标志
@SerializedName("id")
private long id = 0;
//
@SerializedName("issuper")
private long issuper = 0;
//
@SerializedName("langue")
private String langue = "";
//
@SerializedName("level")
private String level = "";
//
@SerializedName("level_anchor")
private String levelAnchor = "";
//
@SerializedName("liang")
private LiangModel liang = new LiangModel();
//
@SerializedName("location")
private String location = "";
//
@SerializedName("medal_level")
private String medalLevel = "";
//
@SerializedName("medal_name")
private String medalName = "";
//
@SerializedName("noble_id")
private long nobleId = 0;
//
@SerializedName("province")
private String province = "";
//性别
@SerializedName("sex")
private long sex = 0;
//
@SerializedName("signature")
private String signature = "";
//平台token
@SerializedName("token")
private String token = "";
//融云token由服务器维护
@SerializedName("token_rong")
private String tokenRong = "";
//昵称
@SerializedName("user_nicename")
private String userNicename = "";
//
@SerializedName("user_status")
private long userStatus = 0;
//
@SerializedName("vip")
private VipModel vip = new VipModel();
//
@SerializedName("votestotal")
private long votestotal = 0;
//是否首次登录
@SerializedName("first_login")
private long firstLogin = 0;
//
@SerializedName("isagent")
private long isagent = 0;
//未读消息数只在MessageIMManager中使用
@SerializedName("num")
private String num = "";
//是否是管理员
@SerializedName("is_admin")
private String isAdmin = "";
public String getIsAdmin() {
return isAdmin;
}
public IMLoginModel setIsAdmin(String isAdmin) {
this.isAdmin = isAdmin;
return this;
}
public String getNum() {
return num;
}
public IMLoginModel setNum(String num) {
this.num = num;
return this;
}
public long getFirstLogin() {
return firstLogin;
}
public IMLoginModel setFirstLogin(long firstLogin) {
this.firstLogin = firstLogin;
return this;
}
public long getIsagent() {
return isagent;
}
public IMLoginModel setIsagent(long isagent) {
this.isagent = isagent;
return this;
}
public String getAvatar() {
return avatar;
}
public IMLoginModel setAvatar(String avatar) {
this.avatar = avatar;
return this;
}
public String getAvatarThumb() {
return avatarThumb;
}
public IMLoginModel setAvatarThumb(String avatarThumb) {
this.avatarThumb = avatarThumb;
return this;
}
public String getBirthday() {
return birthday;
}
public IMLoginModel setBirthday(String birthday) {
this.birthday = birthday;
return this;
}
public String getCity() {
return city;
}
public IMLoginModel setCity(String city) {
this.city = city;
return this;
}
public long getCoin() {
return coin;
}
public IMLoginModel setCoin(long coin) {
this.coin = coin;
return this;
}
public long getConsumption() {
return consumption;
}
public IMLoginModel setConsumption(long consumption) {
this.consumption = consumption;
return this;
}
public long getFrontTask() {
return frontTask;
}
public IMLoginModel setFrontTask(long frontTask) {
this.frontTask = frontTask;
return this;
}
public long getGold() {
return gold;
}
public IMLoginModel setGold(long gold) {
this.gold = gold;
return this;
}
public long getGoldsumption() {
return goldsumption;
}
public IMLoginModel setGoldsumption(long goldsumption) {
this.goldsumption = goldsumption;
return this;
}
public String getGoodnum() {
return goodnum;
}
public IMLoginModel setGoodnum(String goodnum) {
this.goodnum = goodnum;
return this;
}
public long getId() {
return id;
}
public IMLoginModel setId(long id) {
this.id = id;
return this;
}
public long getIssuper() {
return issuper;
}
public IMLoginModel setIssuper(long issuper) {
this.issuper = issuper;
return this;
}
public String getLangue() {
return langue;
}
public IMLoginModel setLangue(String langue) {
this.langue = langue;
return this;
}
public String getLevel() {
return level;
}
public IMLoginModel setLevel(String level) {
this.level = level;
return this;
}
public String getLevelAnchor() {
return levelAnchor;
}
public IMLoginModel setLevelAnchor(String levelAnchor) {
this.levelAnchor = levelAnchor;
return this;
}
public LiangModel getLiang() {
return liang;
}
public IMLoginModel setLiang(LiangModel liang) {
this.liang = liang;
return this;
}
public String getLocation() {
return location;
}
public IMLoginModel setLocation(String location) {
this.location = location;
return this;
}
public String getMedalLevel() {
return medalLevel;
}
public IMLoginModel setMedalLevel(String medalLevel) {
this.medalLevel = medalLevel;
return this;
}
public String getMedalName() {
return medalName;
}
public IMLoginModel setMedalName(String medalName) {
this.medalName = medalName;
return this;
}
public long getNobleId() {
return nobleId;
}
public IMLoginModel setNobleId(long nobleId) {
this.nobleId = nobleId;
return this;
}
public String getProvince() {
return province;
}
public IMLoginModel setProvince(String province) {
this.province = province;
return this;
}
public long getSex() {
return sex;
}
public IMLoginModel setSex(long sex) {
this.sex = sex;
return this;
}
public String getSignature() {
return signature;
}
public IMLoginModel setSignature(String signature) {
this.signature = signature;
return this;
}
public String getToken() {
return token;
}
public IMLoginModel setToken(String token) {
this.token = token;
return this;
}
public String getTokenRong() {
return tokenRong;
}
public IMLoginModel setTokenRong(String tokenRong) {
this.tokenRong = tokenRong;
return this;
}
public String getUserNicename() {
return userNicename;
}
public IMLoginModel setUserNicename(String userNicename) {
this.userNicename = userNicename;
return this;
}
public long getUserStatus() {
return userStatus;
}
public IMLoginModel setUserStatus(long userStatus) {
this.userStatus = userStatus;
return this;
}
public VipModel getVip() {
return vip;
}
public IMLoginModel setVip(VipModel vip) {
this.vip = vip;
return this;
}
public long getVotestotal() {
return votestotal;
}
public IMLoginModel setVotestotal(long votestotal) {
this.votestotal = votestotal;
return this;
}
}

View File

@ -0,0 +1,21 @@
package com.yunbao.common.bean;
import com.google.gson.annotations.SerializedName;
public class LiangModel extends BaseModel {
/**
* name : 0
*/
@SerializedName("name")
private String name = "";
public String getName() {
return name;
}
public LiangModel setName(String name) {
this.name = name;
return this;
}
}

View File

@ -0,0 +1,21 @@
package com.yunbao.common.bean;
import com.google.gson.annotations.SerializedName;
public class VipModel extends BaseModel {
/**
* type : 0
*/
@SerializedName("type")
private String type = "";
public String getType() {
return type;
}
public VipModel setType(String type) {
this.type = type;
return this;
}
}

View File

@ -1,8 +1,10 @@
package com.yunbao.common.custom;
import android.content.Context;
import androidx.annotation.Nullable;
import androidx.viewpager.widget.ViewPager;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
@ -54,7 +56,6 @@ public class TabButtonGroup extends LinearLayout implements View.OnClickListener
public void setCurPosition(int position) {
//点击事件切换
if (position == mCurPosition) {
// return;
long curTime = System.currentTimeMillis();
if (curTime - mLastClickBackTime <= 500) {
if (position != 2 && position != 3) {
@ -80,6 +81,9 @@ public class TabButtonGroup extends LinearLayout implements View.OnClickListener
Object tag = v.getTag();
if (tag != null) {
setCurPosition((int) tag);
if (listener != null) {
listener.onPageSelected(v, (int) tag);
}
}
}
@ -92,11 +96,19 @@ public class TabButtonGroup extends LinearLayout implements View.OnClickListener
for (TabButton tbn : mTabButtons) {
if (tbn != null) {
tbn.cancelAnim();
}
}
}
}
public interface TabButtonGroupChangeListener {
void onPageSelected(View view, int index);
}
private TabButtonGroupChangeListener listener = null;
public void addTabButtonGroupChangeListener(TabButtonGroupChangeListener mListener) {
listener = mListener;
}
}

View File

@ -0,0 +1,19 @@
package com.yunbao.common.event;
import com.yunbao.common.bean.BaseModel;
/**
* 未读消息整合
*/
public class MessageIMEvent extends BaseModel {
private int number = 0;
public int getNumber() {
return number;
}
public MessageIMEvent setNumber(int number) {
this.number = number;
return this;
}
}

View File

@ -0,0 +1,73 @@
package com.yunbao.common.manager;
import android.content.Context;
import androidx.annotation.NonNull;
import com.google.gson.Gson;
import com.yunbao.common.bean.IMLoginModel;
import com.yunbao.common.manager.base.BaseCacheManager;
/**
* 登录者信息管理
*/
public class IMLoginManager extends BaseCacheManager {
private final static String KEY_USER_INFO = "keyUserInfo";
private static IMLoginManager manager;
private IMLoginModel userInfo;
private IMLoginManager(Context context) {
super(context);
}
/**
* 获取单利
*
* @return
*/
public static IMLoginManager get(Context context) {
if (null == manager) {
manager = new IMLoginManager(context);
}
return manager;
}
/**
* 获取用户信息
*
* @return
*/
public IMLoginModel getUserInfo() {
if (null == userInfo) {
userInfo = new Gson().fromJson(
getString(KEY_USER_INFO), IMLoginModel.class);
}
return userInfo;
}
/**
* 设置已登录的用户信息
*
* @param model
*/
public void setupLoginUser(@NonNull IMLoginModel model) {
put(KEY_USER_INFO, new Gson().toJson(model));
this.userInfo = model;
}
/**
* 退出登录
*/
public void logout() {
//删除用户登录信息
deleteByKey(KEY_USER_INFO);
//用户对象置空
userInfo=null;
manager = null;
}
}

View File

@ -0,0 +1,858 @@
/**
* Copyright (c) 2012-2013, Michael Yang 杨福海 (www.yangfuhai.com).
* <p/>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p/>
* http://www.apache.org/licenses/LICENSE-2.0
* <p/>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.yunbao.common.manager.base;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.RandomAccessFile;
import java.io.Serializable;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
/**
* android轻量级缓存框架
*/
public class ACache {
public static final int TIME_HOUR = 60 * 60;
public static final int TIME_DAY = TIME_HOUR * 24;
private static final int MAX_SIZE = 1000 * 1000 * 50; // 50 mb
private static final int MAX_COUNT = Integer.MAX_VALUE; // 不限制存放数据的数量
private static Map<String, ACache> mInstanceMap = new HashMap<>();
private ACacheManager mCache;
public static ACache get(Context ctx) {
return get(ctx, "ACache");
}
public static ACache get(Context ctx, String cacheName) {
File f = new File(ctx.getCacheDir(), cacheName);
return get(f, MAX_SIZE, MAX_COUNT);
}
public static ACache get(File cacheDir) {
return get(cacheDir, MAX_SIZE, MAX_COUNT);
}
public static ACache get(Context ctx, long max_zise, int max_count) {
File f = new File(ctx.getCacheDir(), "ACache");
return get(f, max_zise, max_count);
}
public static ACache get(File cacheDir, long max_zise, int max_count) {
ACache manager = mInstanceMap.get(cacheDir.getAbsoluteFile() + myPid());
if (manager == null) {
manager = new ACache(cacheDir, max_zise, max_count);
mInstanceMap.put(cacheDir.getAbsolutePath() + myPid(), manager);
}
return manager;
}
private static String myPid() {
return "_" + android.os.Process.myPid();
}
private ACache(File cacheDir, long max_size, int max_count) {
if (!cacheDir.exists() && !cacheDir.mkdirs()) {
throw new RuntimeException("can't make dirs in "
+ cacheDir.getAbsolutePath());
}
mCache = new ACacheManager(cacheDir, max_size, max_count);
}
// =======================================
// ============ String数据 读写 ==============
// =======================================
/**
* 保存 String数据 缓存中
*
* @param key 保存的key
* @param value 保存的String数据
*/
public void put(String key, String value) {
File file = mCache.newFile(key);
BufferedWriter out = null;
try {
out = new BufferedWriter(new FileWriter(file), 1024);
out.write(value);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
mCache.put(file);
}
}
/**
* 保存 String数据 缓存中
*
* @param key 保存的key
* @param value 保存的String数据
* @param saveTime 保存的时间单位
*/
public void put(String key, String value, int saveTime) {
if (saveTime != -1) {
put(key, Utils.newStringWithDateInfo(saveTime, value));
} else {
put(key, value);
}
}
/**
* 读取 String数据
*
* @param key
* @return String 数据
*/
public String getAsString(String key) {
File file = mCache.get(key);
if (!file.exists())
return null;
boolean removeFile = false;
BufferedReader in = null;
try {
in = new BufferedReader(new FileReader(file));
String readString = "";
String currentLine;
while ((currentLine = in.readLine()) != null) {
readString += currentLine;
}
if (!Utils.isDue(readString)) {
return Utils.clearDateInfo(readString);
} else {
removeFile = true;
return null;
}
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (removeFile)
remove(key);
}
}
// =======================================
// ============= JSONObject 数据 读写 ==============
// =======================================
/**
* 保存 JSONObject数据 缓存中
*
* @param key 保存的key
* @param value 保存的JSON数据
*/
public void put(String key, JSONObject value) {
put(key, value.toString());
}
/**
* 保存 JSONObject数据 缓存中
*
* @param key 保存的key
* @param value 保存的JSONObject数据
* @param saveTime 保存的时间单位
*/
public void put(String key, JSONObject value, int saveTime) {
if (saveTime != -1) {
put(key, value.toString(), saveTime);
} else {
put(key, value.toString());
}
}
/**
* 读取JSONObject数据
*
* @param key
* @return JSONObject数据
*/
public JSONObject getAsJSONObject(String key) {
String JSONString = getAsString(key);
try {
JSONObject obj = new JSONObject(JSONString);
return obj;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
// =======================================
// ============ JSONArray 数据 读写 =============
// =======================================
/**
* 保存 JSONArray数据 缓存中
*
* @param key 保存的key
* @param value 保存的JSONArray数据
*/
public void put(String key, JSONArray value) {
put(key, value.toString());
}
/**
* 保存 JSONArray数据 缓存中
*
* @param key 保存的key
* @param value 保存的JSONArray数据
* @param saveTime 保存的时间单位
*/
public void put(String key, JSONArray value, int saveTime) {
if (saveTime != -1) {
put(key, value.toString(), saveTime);
} else {
put(key, value.toString());
}
}
/**
* 读取JSONArray数据
*
* @param key
* @return JSONArray数据
*/
public JSONArray getAsJSONArray(String key) {
String JSONString = getAsString(key);
try {
JSONArray obj = new JSONArray(JSONString);
return obj;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
// =======================================
// ============== byte 数据 读写 =============
// =======================================
/**
* 保存 byte数据 缓存中
*
* @param key 保存的key
* @param value 保存的数据
*/
public void put(String key, byte[] value) {
File file = mCache.newFile(key);
FileOutputStream out = null;
try {
out = new FileOutputStream(file);
out.write(value);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
mCache.put(file);
}
}
/**
* 保存 byte数据 缓存中
*
* @param key 保存的key
* @param value 保存的数据
* @param saveTime 保存的时间单位
*/
public void put(String key, byte[] value, int saveTime) {
if (saveTime != -1) {
put(key, Utils.newByteArrayWithDateInfo(saveTime, value));
} else {
put(key, value);
}
}
/**
* 获取 byte 数据
*
* @param key
* @return byte 数据
*/
public byte[] getAsBinary(String key) {
RandomAccessFile RAFile = null;
boolean removeFile = false;
try {
File file = mCache.get(key);
if (!file.exists())
return null;
RAFile = new RandomAccessFile(file, "r");
byte[] byteArray = new byte[(int) RAFile.length()];
RAFile.read(byteArray);
if (!Utils.isDue(byteArray)) {
return Utils.clearDateInfo(byteArray);
} else {
removeFile = true;
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (RAFile != null) {
try {
RAFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (removeFile)
remove(key);
}
}
// =======================================
// ============= 序列化 数据 读写 ===============
// =======================================
/**
* 保存 Serializable数据 缓存中
*
* @param key 保存的key
* @param value 保存的value
*/
public void put(String key, Serializable value) {
put(key, value, -1);
}
/**
* 保存 Serializable数据到 缓存中
*
* @param key 保存的key
* @param value 保存的value
* @param saveTime 保存的时间单位
*/
public void put(String key, Serializable value, int saveTime) {
ByteArrayOutputStream baos = null;
ObjectOutputStream oos = null;
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(value);
byte[] data = baos.toByteArray();
if (saveTime != -1) {
put(key, data, saveTime);
} else {
put(key, data);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
oos.close();
} catch (IOException e) {
}
}
}
/**
* 读取 Serializable数据
*
* @param key key
* @return Serializable 数据
*/
public Object getAsObject(String key) {
byte[] data = getAsBinary(key);
if (data != null) {
ByteArrayInputStream bais = null;
ObjectInputStream ois = null;
try {
bais = new ByteArrayInputStream(data);
ois = new ObjectInputStream(bais);
Object reObject = ois.readObject();
return reObject;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
if (bais != null)
bais.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (ois != null)
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
// =======================================
// ============== bitmap 数据 读写 =============
// =======================================
/**
* 保存 bitmap 缓存中
*
* @param key 保存的key
* @param value 保存的bitmap数据
*/
public void put(String key, Bitmap value) {
put(key, Utils.Bitmap2Bytes(value));
}
/**
* 保存 bitmap 缓存中
*
* @param key 保存的key
* @param value 保存的 bitmap 数据
* @param saveTime 保存的时间单位
*/
public void put(String key, Bitmap value, int saveTime) {
put(key, Utils.Bitmap2Bytes(value), saveTime);
}
/**
* 读取 bitmap 数据
*
* @param key key
* @return bitmap 数据
*/
public Bitmap getAsBitmap(String key) {
if (getAsBinary(key) == null) {
return null;
}
return Utils.Bytes2Bimap(getAsBinary(key));
}
// =======================================
// ============= drawable 数据 读写 =============
// =======================================
/**
* 保存 drawable 缓存中
*
* @param key 保存的key
* @param value 保存的drawable数据
*/
public void put(String key, Drawable value) {
put(key, Utils.drawable2Bitmap(value));
}
/**
* 保存 drawable 缓存中
*
* @param key 保存的key
* @param value 保存的 drawable 数据
* @param saveTime 保存的时间单位
*/
public void put(String key, Drawable value, int saveTime) {
put(key, Utils.drawable2Bitmap(value), saveTime);
}
/**
* 读取 Drawable 数据
*
* @param key key
* @return Drawable 数据
*/
public Drawable getAsDrawable(String key) {
if (getAsBinary(key) == null) {
return null;
}
return Utils.bitmap2Drawable(Utils.Bytes2Bimap(getAsBinary(key)));
}
/**
* 获取缓存文件
*
* @param key key
* @return value 缓存的文件
*/
public File file(String key) {
File f = mCache.newFile(key);
if (f.exists())
return f;
return null;
}
/**
* 移除某个key
*
* @param key key
* @return 是否移除成功
*/
public boolean remove(String key) {
return mCache.remove(key);
}
/**
* 清除所有数据
*/
public void clear() {
mCache.clear();
}
/**
* @author 杨福海michael www.yangfuhai.com
* @version 1.0
*/
public class ACacheManager {
private final AtomicLong cacheSize;
private final AtomicInteger cacheCount;
private final long sizeLimit;
private final int countLimit;
private final Map<File, Long> lastUsageDates = Collections
.synchronizedMap(new HashMap<File, Long>());
protected File cacheDir;
private ACacheManager(File cacheDir, long sizeLimit, int countLimit) {
this.cacheDir = cacheDir;
this.sizeLimit = sizeLimit;
this.countLimit = countLimit;
cacheSize = new AtomicLong();
cacheCount = new AtomicInteger();
calculateCacheSizeAndCacheCount();
}
/**
* 计算 cacheSize和cacheCount
*/
private void calculateCacheSizeAndCacheCount() {
new Thread(new Runnable() {
@Override
public void run() {
int size = 0;
int count = 0;
File[] cachedFiles = cacheDir.listFiles();
if (cachedFiles != null) {
for (File cachedFile : cachedFiles) {
size += calculateSize(cachedFile);
count += 1;
lastUsageDates.put(cachedFile,
cachedFile.lastModified());
}
cacheSize.set(size);
cacheCount.set(count);
}
}
}).start();
}
private void put(File file) {
int curCacheCount = cacheCount.get();
while (curCacheCount + 1 > countLimit) {
long freedSize = removeNext();
cacheSize.addAndGet(-freedSize);
curCacheCount = cacheCount.addAndGet(-1);
}
cacheCount.addAndGet(1);
long valueSize = calculateSize(file);
long curCacheSize = cacheSize.get();
while (curCacheSize + valueSize > sizeLimit) {
long freedSize = removeNext();
curCacheSize = cacheSize.addAndGet(-freedSize);
}
cacheSize.addAndGet(valueSize);
Long currentTime = System.currentTimeMillis();
file.setLastModified(currentTime);
lastUsageDates.put(file, currentTime);
}
private File get(String key) {
File file = newFile(key);
Long currentTime = System.currentTimeMillis();
file.setLastModified(currentTime);
lastUsageDates.put(file, currentTime);
return file;
}
private File newFile(String key) {
return new File(cacheDir, key.hashCode() + "");
}
private boolean remove(String key) {
File image = get(key);
return image.delete();
}
private void clear() {
lastUsageDates.clear();
cacheSize.set(0);
File[] files = cacheDir.listFiles();
if (files != null) {
for (File f : files) {
f.delete();
}
}
}
/**
* 移除旧的文件
*
* @return
*/
private long removeNext() {
if (lastUsageDates.isEmpty()) {
return 0;
}
Long oldestUsage = null;
File mostLongUsedFile = null;
Set<Entry<File, Long>> entries = lastUsageDates.entrySet();
synchronized (lastUsageDates) {
for (Entry<File, Long> entry : entries) {
if (mostLongUsedFile == null) {
mostLongUsedFile = entry.getKey();
oldestUsage = entry.getValue();
} else {
Long lastValueUsage = entry.getValue();
if (lastValueUsage < oldestUsage) {
oldestUsage = lastValueUsage;
mostLongUsedFile = entry.getKey();
}
}
}
}
long fileSize = calculateSize(mostLongUsedFile);
if (mostLongUsedFile.delete()) {
lastUsageDates.remove(mostLongUsedFile);
}
return fileSize;
}
private long calculateSize(File file) {
return file.length();
}
}
/**
* @author 杨福海michael www.yangfuhai.com
* @version 1.0
* @title 时间计算工具类
*/
private static class Utils {
/**
* 判断缓存的String数据是否到期
*
* @param str key
* @return true到期了 false还没有到期
*/
private static boolean isDue(String str) {
return isDue(str.getBytes());
}
/**
* 判断缓存的byte数据是否到期
*
* @param data 数据集合
* @return true到期了 false还没有到期
*/
private static boolean isDue(byte[] data) {
String[] strs = getDateInfoFromDate(data);
if (strs != null && strs.length == 2) {
String saveTimeStr = strs[0];
while (saveTimeStr.startsWith("0")) {
saveTimeStr = saveTimeStr
.substring(1, saveTimeStr.length());
}
long saveTime = Long.valueOf(saveTimeStr);
long deleteAfter = Long.valueOf(strs[1]);
if (System.currentTimeMillis() > saveTime + deleteAfter * 1000) {
return true;
}
}
return false;
}
private static String newStringWithDateInfo(int second, String strInfo) {
return createDateInfo(second) + strInfo;
}
private static byte[] newByteArrayWithDateInfo(int second, byte[] data2) {
byte[] data1 = createDateInfo(second).getBytes();
byte[] retdata = new byte[data1.length + data2.length];
System.arraycopy(data1, 0, retdata, 0, data1.length);
System.arraycopy(data2, 0, retdata, data1.length, data2.length);
return retdata;
}
private static String clearDateInfo(String strInfo) {
if (strInfo != null && hasDateInfo(strInfo.getBytes())) {
strInfo = strInfo.substring(strInfo.indexOf(mSeparator) + 1,
strInfo.length());
}
return strInfo;
}
private static byte[] clearDateInfo(byte[] data) {
if (hasDateInfo(data)) {
return copyOfRange(data, indexOf(data, mSeparator) + 1,
data.length);
}
return data;
}
private static boolean hasDateInfo(byte[] data) {
return data != null && data.length > 15 && data[13] == '-'
&& indexOf(data, mSeparator) > 14;
}
private static String[] getDateInfoFromDate(byte[] data) {
if (hasDateInfo(data)) {
String saveDate = new String(copyOfRange(data, 0, 13));
String deleteAfter = new String(copyOfRange(data, 14,
indexOf(data, mSeparator)));
return new String[]{saveDate, deleteAfter};
}
return null;
}
private static int indexOf(byte[] data, char c) {
for (int i = 0; i < data.length; i++) {
if (data[i] == c) {
return i;
}
}
return -1;
}
private static byte[] copyOfRange(byte[] original, int from, int to) {
int newLength = to - from;
if (newLength < 0)
throw new IllegalArgumentException(from + " > " + to);
byte[] copy = new byte[newLength];
System.arraycopy(original, from, copy, 0,
Math.min(original.length - from, newLength));
return copy;
}
private static final char mSeparator = ' ';
private static String createDateInfo(int second) {
String currentTime = System.currentTimeMillis() + "";
while (currentTime.length() < 13) {
currentTime = "0" + currentTime;
}
return currentTime + "-" + second + mSeparator;
}
/*
* Bitmap byte[]
*/
private static byte[] Bitmap2Bytes(Bitmap bm) {
if (bm == null) {
return null;
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
return baos.toByteArray();
}
/*
* byte[] Bitmap
*/
private static Bitmap Bytes2Bimap(byte[] b) {
if (b.length == 0) {
return null;
}
return BitmapFactory.decodeByteArray(b, 0, b.length);
}
/*
* Drawable Bitmap
*/
private static Bitmap drawable2Bitmap(Drawable drawable) {
if (drawable == null) {
return null;
}
// drawable 的长宽
int w = drawable.getIntrinsicWidth();
int h = drawable.getIntrinsicHeight();
// drawable 的颜色格式
Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
: Bitmap.Config.RGB_565;
// 建立对应 bitmap
Bitmap bitmap = Bitmap.createBitmap(w, h, config);
// 建立对应 bitmap 的画布
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, w, h);
// drawable 内容画到画布中
drawable.draw(canvas);
return bitmap;
}
/*
* Bitmap Drawable
*/
@SuppressWarnings("deprecation")
private static Drawable bitmap2Drawable(Bitmap bm) {
if (bm == null) {
return null;
}
return new BitmapDrawable(bm);
}
}
}

View File

@ -0,0 +1,406 @@
package com.yunbao.common.manager.base;
import android.content.Context;
import android.content.SharedPreferences;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import com.google.gson.Gson;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.Serializable;
import java.lang.reflect.Type;
import java.util.List;
/**
* 缓存管理基类
*/
public class BaseCacheManager {
private int mode;
private Gson gson;
private ACache aCache;
private Context context;
private SharedPreferences sharedPreferences;
public BaseCacheManager(Context context) {
this(context, Context.MODE_PRIVATE);
}
public BaseCacheManager(Context context, int mode) {
this.context = context;
this.mode = mode;
}
/**
* 懒加载acache对象
*
* @return 当前类对象
*/
private ACache getACache() {
if (null == aCache) {
this.aCache = ACache.get(context, getCacheName());
}
return aCache;
}
/**
* 懒加载SharedPreferences对象
*
* @return sp对象
*/
private SharedPreferences getSharedPreferences() {
if (null == sharedPreferences) {
this.sharedPreferences = context.getSharedPreferences(getCacheName(), mode);
}
return sharedPreferences;
}
/**
* 懒加载Gson对象
*
* @return gson对象
*/
private Gson getGson() {
if (null == gson) {//首次获取gson
this.gson = getCustomizeGson();
if (null == gson) {//为空则创建默认gson
this.gson = new Gson();
}
}
return gson;
}
/**
* 插入byte[]类型
*
* @param key
* @param value
*/
public void put(String key, Byte[] value) {
put(key, value, -1);
}
/**
* 插入byte[]类型
*
* @param key
* @param value
* @param saveTime 存储时间
*/
public void put(String key, Byte[] value, int saveTime) {
getACache().put(key, value, saveTime);
}
/**
* 插入string类型
*
* @param key
* @param value
*/
public void put(String key, String value) {
put(key, value, -1);
}
/**
* 插入string类型
*
* @param key
* @param value
* @param saveTime 存储时间
*/
public void put(String key, String value, int saveTime) {
getACache().put(key, value, saveTime);
}
/**
* 插入实现了serializable接口的对象
*
* @param key
* @param value
* @param <D> 泛型
*/
public <D extends Serializable> void put(String key, D value) {
put(key, value, -1);
}
/**
* 插入实现了serializable接口的对象
*
* @param key
* @param value
* @param <D> 泛型
* @param saveTime 存储时间
*/
public <D extends Serializable> void put(String key, D value, int saveTime) {
getACache().put(key, value, saveTime);
}
/**
* 插入jsonobject对象
*
* @param key
* @param value
*/
public void put(String key, JSONObject value) {
put(key, value, -1);
}
/**
* 插入jsonobject对象
*
* @param key
* @param value
* @param saveTime 存储时间
*/
public void put(String key, JSONObject value, int saveTime) {
getACache().put(key, value, saveTime);
}
/**
* 插入jsonarray对象
*
* @param key
* @param value
*/
public void put(String key, JSONArray value) {
put(key, value, -1);
}
/**
* 插入jsonarray对象
*
* @param key
* @param value
* @param saveTime 存储时间
*/
public void put(String key, JSONArray value, int saveTime) {
getACache().put(key, value, saveTime);
}
/**
* 插入一个集合
*
* @param key
* @param values
* @param <D> 泛型
* @return 是否插入成功
*/
public <D> boolean put(String key, List<D> values) {
return put(key, values, -1);
}
/**
* 插入一个集合,使用gson解析为jsonarray进行存储可能会出现很多对象不兼容的问题
*
* @param key
* @param values
* @param saveTime 存储时间
* @param <D> 泛型
* @return 是否存储成功
*/
public <D> boolean put(String key, List<D> values, int saveTime) {
String json = getGson().toJson(values);
if (!TextUtils.isEmpty(json)) {
getACache().put(key, json, saveTime);
}
return false;
}
/**
* 插入int类型数据
*
* @param key
* @param value
* @return 是否存储成功
*/
public boolean put(String key, int value) {
return getSharedPreferences()
.edit()
.putInt(key, value)
.commit();
}
/**
* 插入boolean类型数据
*
* @param key
* @param value
* @return 是否存储成功
*/
public boolean put(String key, boolean value) {
return getSharedPreferences()
.edit()
.putBoolean(key, value)
.commit();
}
/**
* 插入float类型
*
* @param key
* @param value
* @return 是否存储成功
*/
public boolean put(String key, float value) {
return getSharedPreferences()
.edit()
.putFloat(key, value)
.commit();
}
/**
* 插入long类型
*
* @param key
* @param value
* @return 是否存储成功
*/
public boolean put(String key, long value) {
return getSharedPreferences()
.edit()
.putLong(key, value)
.commit();
}
/**
* 根据key删除文件
*
* @param key
* @return 是否删除成功
*/
public boolean deleteByKey(@NonNull String key) {
return getACache().remove(key) || getSharedPreferences()
.edit()
.remove(key)
.commit();
}
/**
* 查byte[]类型
*
* @param key
* @return 获取byte数组
*/
public byte[] getBinary(@NonNull String key) {
return getACache().getAsBinary(key);
}
/**
* 差String类型
*
* @param key
* @return 获取存储的string 类型值
*/
public String getString(@NonNull String key) {
return getACache().getAsString(key);
}
/**
* 查询实现了Serializable的对象
*
* @param key
* @param <R> 泛型
* @return 序列化的对象
*/
public <R extends Serializable> R getSerializable(@NonNull String key) {
return (R) getACache().getAsObject(key);
}
/**
* 查询jsonobject
*
* @param key
* @return jsonobject对象
*/
public JSONObject getJsonObject(@NonNull String key) {
return getACache().getAsJSONObject(key);
}
/**
* 查询jsonarray
*
* @param key
* @return jsonarray集合
*/
public JSONArray getJsonArray(@NonNull String key) {
return getACache().getAsJSONArray(key);
}
/**
* 获取一个集合
*
* @param key
* @param typeOfT 类别
* @param <D> 泛型
* @return 集合
*/
public <D> List<D> getList(@NonNull String key, Type typeOfT) {
JSONArray jsonArray = getJsonArray(key);
return getGson().fromJson(null != jsonArray ? jsonArray.toString() : "[]", typeOfT);
}
/**
* 查询int
*
* @param key
* @param defValut 默认值
* @return int值
*/
public int getInt(@NonNull String key, int defValut) {
return getSharedPreferences().getInt(key, defValut);
}
/**
* 查询boolean
*
* @param key
* @param defValue 默认值
* @return 布尔值
*/
public boolean getBoolean(@NonNull String key, boolean defValue) {
return getSharedPreferences().getBoolean(key, defValue);
}
/**
* 查询float
*
* @param key
* @param defValue 默认值
* @return float值
*/
public float getFloat(@NonNull String key, float defValue) {
return getSharedPreferences().getFloat(key, defValue);
}
/**
* 查询long
*
* @param key
* @param defVlaue 默认值
* @return long值
*/
public long getLong(@NonNull String key, long defVlaue) {
return getSharedPreferences().getLong(key, defVlaue);
}
/**
* 获取缓存路径名
*
* @return 获取存储路径名
*/
public String getCacheName() {
return "jtechCache";
}
/**
* 获取定制gson,使用者可以重写,不为空则会使用当前返回
*
* @return 获取自定义的gson
*/
public Gson getCustomizeGson() {
return new Gson();
}
}

View File

@ -0,0 +1,154 @@
package com.yunbao.common.manager.imrongcloud;
import android.content.Context;
import android.os.Handler;
import android.text.TextUtils;
import com.alibaba.fastjson.JSON;
import com.yunbao.common.bean.IMLoginModel;
import com.yunbao.common.event.MessageIMEvent;
import com.yunbao.common.http.HttpCallback;
import com.yunbao.common.http.HttpClient;
import com.yunbao.common.manager.IMLoginManager;
import org.greenrobot.eventbus.EventBus;
import java.util.Arrays;
import java.util.List;
import io.rong.imkit.manager.UnReadMessageManager;
import io.rong.imlib.model.Conversation;
/**
* 消息的监听管理
*/
public class MessageIMManager {
private static MessageIMManager manager;
private Context mContext;
//Handler统一管理系统和融云的未读消息
private Handler unreadMessagesHandler = new Handler();
private int number = 0, imNumber = 0, systemNumber = 0;
public MessageIMManager(Context mContext) {
this.mContext = mContext;
number = 0;
}
/**
* 获取单利
*/
public static MessageIMManager get(Context context) {
if (null == manager) {
manager = new MessageIMManager(context);
}
return manager;
}
/**
* 添加融云消息监听
*/
public void addImRongCloudObserver() {
// //只监听私聊消息
Conversation.ConversationType[] conversationTypes = {Conversation.ConversationType.PRIVATE};
UnReadMessageManager.getInstance().addObserver(conversationTypes, new UnReadMessageManager.IUnReadMessageObserver() {
@Override
public void onCountChanged(int integer) {
imNumber = integer;
//发送通知
unreadMessagesHandler.post(essagesRunnable);
}
});
}
/**
* 获取系统消息有未读数展示红点
*/
public void getSystemMessages() {
IMLoginModel userInfo = IMLoginManager.get(mContext).getUserInfo();
HttpClient.getInstance().get("Message.getLists", "getImUserInfo")
.params("uid", userInfo.getId())
.params("token", userInfo.getToken())
.execute(new HttpCallback() {
@Override
public void onSuccess(int code, String msg, String[] info) {
if (code == 0) {
List<IMLoginModel> listUserBean = JSON.parseArray(Arrays.toString(info), IMLoginModel.class);
if (listUserBean != null && listUserBean.size() >= 2) {
//目前就三条消息需求判断前两条消息是否有未读消息
for (int i = 0; i < listUserBean.size() - 2; i++) {
//消息对象
IMLoginModel userBean = listUserBean.get(i);
//未读消息数
String number = userBean.getNum();
//未读消息不为空并且大于0
try {
if (!TextUtils.isEmpty(number) && Integer.parseInt(number) > 0) {
systemNumber = Integer.parseInt(number);
}
} catch (NumberFormatException e) {
systemNumber = 0;
}
}
//发送通知
unreadMessagesHandler.post(essagesRunnable);
}
}
}
});
}
/**
* 获取系统消息有未读数展示红点
*/
public void getSystemMessages(SystemMessagesHttpCallback callback) {
IMLoginModel userInfo = IMLoginManager.get(mContext).getUserInfo();
HttpClient.getInstance().get("Message.getLists", "getImUserInfo")
.params("uid", userInfo.getId())
.params("token", userInfo.getToken())
.execute(new HttpCallback() {
@Override
public void onSuccess(int code, String msg, String[] info) {
if (callback != null) {
callback.onSuccess(code, msg, info);
}
if (code == 0) {
List<IMLoginModel> listUserBean = JSON.parseArray(Arrays.toString(info), IMLoginModel.class);
if (listUserBean != null && listUserBean.size() >= 2) {
//目前就三条消息需求判断前两条消息是否有未读消息
for (int i = 0; i < listUserBean.size() - 2; i++) {
//消息对象
IMLoginModel userBean = listUserBean.get(i);
//未读消息数
String number = userBean.getNum();
//未读消息不为空并且大于0
try {
if (!TextUtils.isEmpty(number) && Integer.parseInt(number) > 0) {
systemNumber = Integer.parseInt(number);
}
} catch (NumberFormatException e) {
systemNumber = 0;
}
}
//发送通知
unreadMessagesHandler.post(essagesRunnable);
}
}
}
});
}
/**
* 系统消息的数据回传接口
*/
public interface SystemMessagesHttpCallback {
void onSuccess(int code, String msg, String[] info);
}
//整合未读消息数目并且发送出去
private final Runnable essagesRunnable = () -> {
number = imNumber + systemNumber;
EventBus.getDefault().postSticky(new MessageIMEvent().setNumber(number));
};
}

View File

@ -0,0 +1,200 @@
package com.yunbao.common.manager.imrongcloud;
import android.app.Application;
import android.content.Context;
import android.util.Log;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.CircleCrop;
import com.bumptech.glide.request.RequestOptions;
import com.yunbao.common.bean.IMLoginModel;
import com.yunbao.common.manager.IMLoginManager;
import io.rong.imkit.GlideKitImageEngine;
import io.rong.imkit.IMCenter;
import io.rong.imkit.RongIM;
import io.rong.imkit.config.RongConfigCenter;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.Conversation;
import io.rong.imlib.model.Message;
/**
* 会话列表
* 融云即时通讯的管理类
*/
public class RongcloudIMManager {
//融云开发者平台注册app唯一识别符
private static final String RONG_IM_KEY = "uwd1c0sxu1p71";
private static final String CLASSNAME = "RongcloudIMManager";
/**
* 融云初始化
*
* @param application 应用上下文
*/
public static void initRongIM(Application application) {
//第三个参数代表是否开启推送
RongIM.init(application, RONG_IM_KEY, true);
Log.e(CLASSNAME, "initRongIM:");
initPhotoGlide();
}
private static RongIMClient.OnReceiveMessageWrapperListener listener = new RongIMClient.OnReceiveMessageWrapperListener() {
@Override
public boolean onReceived(Message message, int left, boolean hasPackage, boolean offline) {
return false;
}
};
/**
* 设置消息接受监听器
*/
public static void addRongcloudIMOnReceiveMessageListener() {
IMCenter.getInstance().addOnReceiveMessageListener(listener);
}
/**
* 移除消息接受监听器
*/
public static void removeRongcloudIMOnReceiveMessageListener() {
IMCenter.getInstance().removeOnReceiveMessageListener(listener);
}
/**
* 修改聊天列表头像为圆形
*/
private static void initPhotoGlide() {
RongConfigCenter.featureConfig().setKitImageEngine(new GlideKitImageEngine() {
@Override
public void loadConversationListPortrait(@NonNull Context context,
@NonNull String url,
@NonNull ImageView imageView,
Conversation conversation) {
Glide.with(imageView).load(url)
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
.into(imageView);
}
@Override
public void loadConversationPortrait(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView, Message message) {
Glide.with(imageView).load(url)
.apply(RequestOptions.bitmapTransform(new CircleCrop()))
.into(imageView);
}
});
}
/**
* 连接融云服务器
*
* @param context
*/
public static void connectIM(Context context) {
MessageIMManager.get(context).addImRongCloudObserver();
MessageIMManager.get(context).getSystemMessages();
IMLoginModel userInfo = IMLoginManager.get(context).getUserInfo();
String IMToken = userInfo.getTokenRong();
Log.e(CLASSNAME, "connectIM:" + IMToken);
//参数注解IMToken 从服务端获取的 Token
//timeLimit 超时时间超时后不再重连取值 <=0 则将一直连接直到连接成功或者发生业务错误
//connectCallback 连接回调
RongIM.connect(IMToken, 0, new RongIMClient.ConnectCallback() {
@Override
public void onSuccess(String s) {
//连接成功如果 onDatabaseOpened() 时没有页面跳转也可在此时进行跳转
Log.e(CLASSNAME, "onSuccess:" + s);
}
@Override
public void onError(RongIMClient.ConnectionErrorCode connectionErrorCode) {
if (connectionErrorCode.equals(RongIMClient.ConnectionErrorCode.RC_CONN_TOKEN_EXPIRE)) {
// APP 服务请求新 token获取到新 token 后重新 connect()
Log.e(CLASSNAME, "onError:(从 APP 服务请求新 token" + RongIMClient.ConnectionErrorCode.RC_CONN_TOKEN_EXPIRE);
} else if (connectionErrorCode.equals(RongIMClient.ConnectionErrorCode.RC_CONNECT_TIMEOUT)) {
//连接超时弹出提示可以引导用户等待网络正常的时候再次点击进行连接
Log.e(CLASSNAME, "onError:(连接超时)" + RongIMClient.ConnectionErrorCode.RC_CONNECT_TIMEOUT);
} else {
//其它业务错误码请根据相应的错误码作出对应处理
Log.e(CLASSNAME, "onError:(其它业务错误码)" + connectionErrorCode);
}
}
@Override
public void onDatabaseOpened(RongIMClient.DatabaseOpenStatus databaseOpenStatus) {
if (RongIMClient.DatabaseOpenStatus.DATABASE_OPEN_SUCCESS.equals(databaseOpenStatus)) {
//本地数据库打开跳转到会话列表页面
Log.e(CLASSNAME, "onDatabaseOpened:(本地数据库打开)" + databaseOpenStatus);
} else {
//数据库打开失败可以弹出 toast 提示
Log.e(CLASSNAME, "onDatabaseOpened:(数据库打开失败)" + databaseOpenStatus);
}
}
});
}
/**
* 设置监听 IM 连接状态
* 建议在应用生命周期中设置
*/
public static void setIMStatusListener() {
RongIM.setConnectionStatusListener(connectionStatusListener);
}
/**
* 监听 IM 连接状态可根据连接状态进行不同业务处理
*/
private static RongIMClient.ConnectionStatusListener connectionStatusListener = new RongIMClient.ConnectionStatusListener() {
@Override
public void onChanged(ConnectionStatus status) {
Log.e(CLASSNAME, "ConnectionStatusListener:(登录状态监听)" + status.getMessage());
//开发者需要根据连接状态码进行不同业务处理
switch (status) {
//用户主动断开连接的状态见断开连接
case SIGN_OUT:
break;
//用户账号在其它设备登录此设备被踢下线
case KICKED_OFFLINE_BY_OTHER_CLIENT:
break;
//连接暂时挂起多是由于网络问题导致SDK 会在合适时机进行自动重连
case SUSPEND:
break;
//连接成功
case CONNECTED:
break;
//连接超时SDK 将停止连接用户需要做超时处理再自行调用连接接口进行连接
case TIMEOUT:
break;
//连接中
case CONNECTING:
break;
// 网络不可用
case NETWORK_UNAVAILABLE:
break;
//未连接状态即应用没有调用过连接方法
case UNCONNECTED:
break;
//Token 过期时触发此状态
case TOKEN_INCORRECT:
break;
//用户被开发者后台封禁
case CONN_USER_BLOCKED:
break;
}
}
};
/**
* 注销登录信息有新消息时不再收到任何通知提醒
*/
public static void logoutIM() {
RongIM.getInstance().logout();
}
}

View File

@ -29,5 +29,16 @@
android:src="@mipmap/icon_back"
android:tint="@color/textColor" />
<ImageView
android:id="@+id/img_more"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:padding="9dp"
android:src="@mipmap/btn_more_black"
android:tint="@color/textColor"
android:visibility="gone" />
</RelativeLayout>
</FrameLayout>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -4,6 +4,7 @@
<application
android:allowBackup="true"
android:theme="@style/AppTheme">
<activity android:name=".activity.LiveTRTCAnchorActivity"></activity>
<activity
@ -78,6 +79,18 @@
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
<activity
android:name=".activity.PDLiveConversationActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize">
</activity>
<activity
android:name=".activity.PDLIiveChatActivity"
android:screenOrientation="portrait"
android:theme="@style/DialogActivity"
android:windowSoftInputMode="stateHidden|adjustResize">
</activity>
</application>
</manifest>

View File

@ -6,7 +6,9 @@ import android.content.ClipboardManager;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import androidx.fragment.app.DialogFragment;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
@ -16,6 +18,7 @@ import android.widget.TextView;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.tencent.imsdk.conversation.ConversationManager;
import com.yunbao.common.CommonAppConfig;
import com.yunbao.common.Constants;
import com.yunbao.common.activity.AbsActivity;
@ -88,6 +91,8 @@ import org.greenrobot.eventbus.ThreadMode;
import java.util.HashSet;
import java.util.List;
import io.rong.imkit.utils.RouteUtils;
/**
* Created by cxf on 2018/10/7.
*/
@ -108,9 +113,6 @@ public abstract class LiveActivity extends AbsActivity implements SocketMessageL
protected LiveLinkMicAnchorPresenter mLiveLinkMicAnchorPresenter;//主播与主播连麦逻辑
protected LiveLinkMicPkPresenter mLiveLinkMicPkPresenter;//主播与主播PK逻辑
public static LiveRyLinkMicPkPresenter mLiveRyLinkMicPkPresenter;//主播与主播PK逻辑
// public static LiveLinkMicDrPkPresenter liveLinkMicDrPkPresenter;//多人PK
// protected GamePresenter mGamePresenter;
public static SocketClient mSocketClient;
public static SocketRyClient mSocketRyClient;
@ -129,7 +131,6 @@ public abstract class LiveActivity extends AbsActivity implements SocketMessageL
protected KeyBoardHeightUtil2 mKeyBoardHeightUtil;
protected int mChatLevel;//发言等级限制
protected int mDanMuLevel;//弹幕等级限制
// private MobShareUtil mMobShareUtil;
private ProcessImageUtil mImageUtil;
private boolean mFirstConnectSocket;//是否是第一次连接成功socket
private boolean mGamePlaying;//是否在游戏中
@ -301,16 +302,6 @@ public abstract class LiveActivity extends AbsActivity implements SocketMessageL
*/
@Override
public void onSendGift(LiveReceiveGiftBean bean) {
// if (bean.isAllServerNotify()){
// if (!mIsAnchor){
// if (mLiveRoomViewHolder != null) {
// //全服通知时不显示聊天列表里面的 送礼 消息
// //mLiveRoomViewHolder.insertChat(bean.getLiveChatBean());
// mLiveRoomViewHolder.showGiftMessage(bean);
// }
// }
// }
// else
//购买守护
if (bean.ismTypeBuyGuard()) {
@ -867,16 +858,10 @@ public abstract class LiveActivity extends AbsActivity implements SocketMessageL
@Override
public void onGameNz(JSONObject obj) {
// if (mGamePresenter != null) {
// mGamePresenter.onGameNzSocket(obj);
// }
}
@Override
public void onGameEbb(JSONObject obj) {
// if (mGamePresenter != null) {
// mGamePresenter.onGameEbbSocket(obj);
// }
}
/**
@ -898,7 +883,6 @@ public abstract class LiveActivity extends AbsActivity implements SocketMessageL
fragment.setArguments(bundle);
fragment.show(getSupportFragmentManager(), "LiveInputDialogFragment");
} else {
// ToastUtil.show(getResources().getString(R.string.live_issend));
showTaskDialog();
}
}
@ -934,40 +918,12 @@ public abstract class LiveActivity extends AbsActivity implements SocketMessageL
* 打开私信列表窗口
*/
public void openChatListWindow() {
LiveChatListDialogFragment fragment = new LiveChatListDialogFragment();
if (!mIsAnchor) {
Bundle bundle = new Bundle();
bundle.putString(Constants.LIVE_UID, mLiveUid);
fragment.setArguments(bundle);
}
fragment.show(getSupportFragmentManager(), "LiveChatListDialogFragment");
RouteUtils.registerActivity(RouteUtils.RongActivityType.ConversationActivity, PDLIiveChatActivity.class);
Intent intent = new Intent(mContext, PDLIiveChatActivity.class);
mContext.startActivity(intent);
}
/**
* 打开私信聊天窗口
*/
public void openChatRoomWindow(UserBean userBean, boolean following) {
ConfigBean configBean = CommonAppConfig.getInstance().getConfig();
if (configBean == null) {
return;
}
int letterSwitch = configBean.getPriMsgSwitch();
if (letterSwitch == 0) {
ToastUtil.show("私信功能暂不可用");
return;
}
if (mKeyBoardHeightUtil == null) {
mKeyBoardHeightUtil = new KeyBoardHeightUtil2(mContext, super.findViewById(android.R.id.content), this);
mKeyBoardHeightUtil.start();
}
LiveChatRoomDialogFragment fragment = new LiveChatRoomDialogFragment();
fragment.setImageUtil(mImageUtil);
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.USER_BEAN, userBean);
bundle.putBoolean(Constants.FOLLOW, following);
fragment.setArguments(bundle);
fragment.show(getSupportFragmentManager(), "LiveChatRoomDialogFragment");
}
/**
* 弹幕 消息
@ -1041,14 +997,6 @@ public abstract class LiveActivity extends AbsActivity implements SocketMessageL
// }
}
/**
* 送礼物 消息
*/
// public void sendGiftMessage(LiveGiftBean giftBean, String giftToken) {
// int guardType = mLiveGuardInfo != null ? mLiveGuardInfo.getMyGuardType() : Constants.GUARD_TYPE_NONE;
//
// SocketChatUtil.sendGiftMessage(giftBean.getType(), giftToken, mLiveUid,guardType,"0");
// }
/**
* 送礼物 消息 增加主播名字
@ -1286,28 +1234,6 @@ public abstract class LiveActivity extends AbsActivity implements SocketMessageL
}
/**
* 分享直播间
*/
// public void shareLive(String type, MobCallback callback) {
// ConfigBean configBean = CommonAppConfig.getInstance().getConfig();
// if (configBean == null) {
// return;
// }
// if (mMobShareUtil == null) {
// mMobShareUtil = new MobShareUtil();
// }
// ShareData data = new ShareData();
// data.setTitle(configBean.getLiveShareTitle());
// data.setDes(mLiveBean.getUserNiceName() + configBean.getLiveShareDes());
// data.setImgUrl(mLiveBean.getAvatarThumb());
// String webUrl = configBean.getDownloadApkUrl();
// if (Constants.MOB_WX.equals(type) || Constants.MOB_WX_PYQ.equals(type)) {
// webUrl = configBean.getLiveWxShareUrl() + mLiveUid;
// }
// data.setWebUrl(webUrl);
// mMobShareUtil.execute(type, data, callback);
// }
/**
* 监听关注变化事件
@ -1321,23 +1247,6 @@ public abstract class LiveActivity extends AbsActivity implements SocketMessageL
}
}
/**
* 监听私信未读消息数变化事件
*/
// @Subscribe(threadMode = ThreadMode.MAIN)
// public void onImUnReadCountEvent(ImUnReadCountEvent e) {
// String unReadCount = e.getUnReadCount();
// if (!TextUtils.isEmpty(unReadCount) && mLiveBottomViewHolder != null) {
// mLiveBottomViewHolder.setUnReadCount(unReadCount);
// }
// }
/**
* 获取私信未读消息数量
*/
// protected String getImUnReadCount() {
// return ImMessageUtil.getInstance().getAllUnReadMsgCount();
// }
/**
* 监听钻石数量变化事件
@ -1351,9 +1260,6 @@ public abstract class LiveActivity extends AbsActivity implements SocketMessageL
}
public void onCoinChanged(String coin) {
// if (mGamePresenter != null) {
// mGamePresenter.setLastCoin(coin);
// }
}
/**
@ -1388,20 +1294,6 @@ public abstract class LiveActivity extends AbsActivity implements SocketMessageL
fragment.show(getSupportFragmentManager(), "LiveGuardDialogFragment");
}
/**
* 打開在线粉絲團
*/
public void openFansListWindow() {
LiveFansFragment fragment = new LiveFansFragment();
Bundle bundle = new Bundle();
//粉絲團粉絲團
//不是粉絲
bundle.putString(Constants.URL, CommonAppConfig.HOST + "/h5/live/fansRank.html" + "?uid=" + CommonAppConfig.getInstance().getUid() + "&token=" + CommonAppConfig.getInstance().getToken() + "&anchorUid=" + mLiveUid);
fragment.setArguments(bundle);
fragment.show(getSupportFragmentManager(), "LiveGuardDialogFragment");
}
/**
* 打开观看列表弹窗
@ -1496,19 +1388,9 @@ public abstract class LiveActivity extends AbsActivity implements SocketMessageL
* 打开幸运礼物说明
*/
public void openLuckGiftTip() {
// if (mLiveLuckGiftTipViewHolder == null) {
UserBean u = CommonAppConfig.getInstance().getUserBean();
String url = CommonAppConfig.HOST + "/h5/Nobility.html?nickname=" + u.getUserNiceName() + "&usernobId=" + u.getNoble_id() + "&token=" + CommonAppConfig.getInstance().getToken() + "&uid=" + CommonAppConfig.getInstance().getUid() + "&anchorUid=" + mLiveUid + "&anchorName=" + mAncherName;
startActivity(new Intent(this, ZhuangBanActivity.class).putExtra("url", url));
Log.e("aaa", url);
// mLiveLuckGiftTipViewHolder = new LiveWebViewHolder(mContext, mPageContainer,url);
// mLiveLuckGiftTipViewHolder.subscribeActivityLifeCycle();
// mLiveLuckGiftTipViewHolder.addToParent();
// }
// mLiveLuckGiftTipViewHolder.show();
// if (CommonAppConfig.LIVE_ROOM_SCROLL && !mIsAnchor) {
// ((LiveAudienceActivity) this).setScrollFrozen(true);
// }
}
/**
@ -1621,15 +1503,9 @@ public abstract class LiveActivity extends AbsActivity implements SocketMessageL
if (mLiveLuckGiftTipViewHolder != null) {
mLiveLuckGiftTipViewHolder.release();
}
// if (mMobShareUtil != null) {
// mMobShareUtil.release();
// }
if (mImageUtil != null) {
mImageUtil.release();
}
// if (mGamePresenter != null) {
// mGamePresenter.release();
// }
if (mLiveRoomViewHolder.mHandler != null) {
mLiveRoomViewHolder.mHandler.removeCallbacksAndMessages(null);
}

View File

@ -1182,17 +1182,9 @@ public class LiveAudienceActivity extends LiveActivity {
@Override
protected void onResume() {
super.onResume();
if (mLiveAudienceViewHolder != null) {
mLiveAudienceViewHolder.getChatPoint();
}
}
//红点(消息中心)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onUpdateFieldEvent(UpdateTablePoint updateTablePoint) {
if (mLiveAudienceViewHolder != null) {
mLiveAudienceViewHolder.getChatPoint();
}
}
}

View File

@ -8,11 +8,6 @@ import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.text.TextUtils;
import android.util.Log;
import android.view.Gravity;
@ -23,6 +18,12 @@ import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.cardview.widget.CardView;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.adjust.sdk.Adjust;
import com.adjust.sdk.AdjustEvent;
import com.alibaba.fastjson.JSON;
@ -57,12 +58,9 @@ import java.util.Collections;
import java.util.Date;
import java.util.List;
import io.rong.imlib.RongCoreClient;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.listener.OnReceiveMessageWrapperListener;
import io.rong.imlib.model.Conversation;
import io.rong.imlib.model.Message;
import io.rong.imlib.model.ReceivedProfile;
import io.rong.message.RecallNotificationMessage;
import io.rong.message.TextMessage;
@ -156,8 +154,6 @@ public class MyTUIConversationFragment extends Fragment {
ImHttpUtil.cancel(ImHttpConsts.GET_SYSTEM_MESSAGE_LIST);
ImHttpUtil.cancel(ImHttpConsts.GET_IM_USER_INFO);
RongCoreClient.removeOnReceiveMessageListener(listener);
listener = null;
}
private void initView() {
@ -172,14 +168,14 @@ public class MyTUIConversationFragment extends Fragment {
mAdapter.setActionListener(new ImListAdapter.ActionListener() {
@Override
public void onItemClick(ImUserBean bean) {
if(bean.getContent().equals("在線客服")){
if (bean.getContent().equals("在線客服")) {
mFirebaseAnalytics.logEvent("FS_customer_service", null);
logger.logEvent("FB_customer_service");
AdjustEvent adjustEvent1 = new AdjustEvent("ww5z2p");
Adjust.trackEvent(adjustEvent1);
}else if(bean.getContent().equals("新手指導員")){
} else if (bean.getContent().equals("新手指導員")) {
mFirebaseAnalytics.logEvent("FS_guide", null);
logger.logEvent("FB_guide", null);
AdjustEvent adjustEvent1 = new AdjustEvent("m0nfpn");
@ -209,7 +205,6 @@ public class MyTUIConversationFragment extends Fragment {
});
mRecyclerView.setAdapter(mAdapter);
RongCoreClient.addOnReceiveMessageListener(listener);
RongIMClient.setOnRecallMessageListener(listenerBack);
Constants.nowId = "";
@ -298,35 +293,6 @@ public class MyTUIConversationFragment extends Fragment {
});
}
//获取新信息
OnReceiveMessageWrapperListener listener = new OnReceiveMessageWrapperListener() {
@Override
public void onReceivedMessage(Message message, ReceivedProfile profile) {
Log.d("刷新消息", "message=" + message);
Log.i("Log", "message=" + message);
if (message.getTargetId() != null && !"".endsWith(message.getTargetId())) {
String firstIndex = message.getTargetId().substring(0, 1);
if (!"g".endsWith(firstIndex) && !"__system__".endsWith(message.getTargetId())) {
String firstIndexRM = "";
String firstIndexRM2 = "";
if (message.getObjectName().equals("RC:TxtMsg")) {
TextMessage rongMsg = (TextMessage) message.getContent();
if (rongMsg.getContent().length() > 4) {
firstIndexRM = rongMsg.getContent().substring(0, 5);
}
if (rongMsg.getContent().length() > 9) {
firstIndexRM2 = rongMsg.getContent().substring(0, 10);
}
}
if (!"{\"msg".equals(firstIndexRM) && !"{\"retcode\"".equals(firstIndexRM2)) {
//切换回主线程做UI操作
mHandler.sendEmptyMessage(runOnUI);
messageHandler = message;
}
}
}
}
};
//撤回消息
RongIMClient.OnRecallMessageListener listenerBack = new RongIMClient.OnRecallMessageListener() {

View File

@ -0,0 +1,63 @@
package com.yunbao.live.activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Window;
import android.view.WindowManager;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import com.yunbao.common.activity.AbsActivity;
import com.yunbao.live.R;
import io.rong.imkit.conversationlist.ConversationListFragment;
/**
* 直播页面聊天列表
*/
public class PDLIiveChatActivity extends AbsActivity {
@Override
protected int getLayoutId() {
return R.layout.activity_pd_chat;
}
@Override
protected void main(Bundle savedInstanceState) {
super.main(savedInstanceState);
windowColor();
initView();
}
public void windowColor() {
Window window = getWindow();
//取消设置Window半透明的Flag
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//添加Flag把状态栏设为可绘制模式
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//设置状态栏为透明/或者需要的颜色
window.setStatusBarColor(getResources().getColor(R.color.transparent));
getWindow().setGravity(Gravity.BOTTOM);//设置显示在底部 默认在中间
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.width = WindowManager.LayoutParams.MATCH_PARENT;//设置宽度满屏
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
getWindow().setAttributes(lp);
setFinishOnTouchOutside(true);//允许点击空白处关闭
}
/**
* 初始化控件
*/
private void initView() {
//展示会话列表
ConversationListFragment conversationListFragment = new ConversationListFragment();
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.container, conversationListFragment);
transaction.commit();
//自定义空数据背景View
conversationListFragment.setEmptyView(com.yunbao.live.R.layout.view_layout_msg);
}
}

View File

@ -0,0 +1,183 @@
package com.yunbao.live.activity;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import com.blankj.utilcode.util.GsonUtils;
import com.yunbao.common.activity.AbsActivity;
import com.yunbao.common.activity.SelectImageActivity;
import com.yunbao.common.bean.IMLoginModel;
import com.yunbao.common.bean.ImageEntity;
import com.yunbao.common.manager.IMLoginManager;
import com.yunbao.live.R;
import com.yunbao.live.bean.SearchUserBean;
import com.yunbao.live.dialog.MenuPopuwWindow;
import com.yunbao.live.views.InputPanelViewHolder;
import java.util.ArrayList;
import io.rong.imkit.conversation.ConversationFragment;
import io.rong.imkit.userinfo.RongUserInfoManager;
import io.rong.imlib.model.UserInfo;
/**
* 聊天会话界面
*/
public class PDLiveConversationActivity extends AbsActivity implements View.OnClickListener {
private ConversationFragment conversationFragment;
private PDLiveConversationActivity mContext;
private InputPanelViewHolder inputPanel;
private TextView titleView;
private ImageView imgMore, imBack;
private boolean isAdmin = false;
private final int PERMISSION_REQUEST_CODE = 0;
private final int SELECT_VIDEO_REQUEST = 0x0002;
private final int SELECT_IMAGE_REQUEST = 0x0001;
private ArrayList<ImageEntity> mSelectImages = new ArrayList<>();
private String targetId = "";
@Override
protected int getLayoutId() {
return R.layout.activity_conversation;
}
@Override
protected void main() {
super.main();
mContext = this;
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
initView();
initData();
}
/**
* 数据的设置
*/
private void initData() {
targetId = getIntent().getStringExtra("targetId");
//绑定聊天用户id
inputPanel.setTargetId(targetId);
//获取用户信息
UserInfo userInfo = RongUserInfoManager.getInstance().getUserInfo(targetId);
titleView.setText(userInfo.getName());
if (!TextUtils.isEmpty(userInfo.getExtra())) {
SearchUserBean userBean = GsonUtils.fromJson(userInfo.getExtra(), SearchUserBean.class);
//新手指导员
if (TextUtils.isEmpty(userBean.getIs_admin()) && TextUtils.equals(userBean.getIs_admin(), "1")) {
isAdmin = true;
} else {//非指导员
isAdmin = false;
}
Log.e("PDLiveConversation", userInfo.getExtra());
}
}
/**
* 初始化布局
*/
private void initView() {
// 添加会话界面
conversationFragment = new ConversationFragment();
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.container, conversationFragment);
transaction.commit();
inputPanel = findViewById(R.id.input_panel);
titleView = findViewById(R.id.titleView);
imgMore = findViewById(R.id.img_more);
imBack = findViewById(R.id.btn_back);
imgMore.setOnClickListener(this);
imBack.setOnClickListener(this);
findViewById(R.id.container).setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
InputMethodManager imm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
return false;
}
});
inputPanel.addMediaMessageCallback(new InputPanelViewHolder.MediaMessageCallback() {
@Override
public void choosePic(int intoIndex) {
jumpPic(intoIndex);
}
});
}
@Override
public void onClick(View v) {
int id = v.getId();
//菜单
if (id == R.id.img_more) {
IMLoginModel model = IMLoginManager.get(mContext).getUserInfo();
new MenuPopuwWindow(mContext).setIsAdmin(model.getIsAdmin(), targetId).show(imgMore);
} else if (id == R.id.btn_back) {//返回
onBackPressed();
}
}
//intoIndex 1=调用相机,2=照片选取,3=视频选取
public void jumpPic(int intoIndex) {
//选择图片
int isPermission1 = ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_EXTERNAL_STORAGE);
int isPermission2 = ContextCompat.checkSelfPermission(mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (isPermission1 == PackageManager.PERMISSION_GRANTED && isPermission2 == PackageManager.PERMISSION_GRANTED) {
startActivity(intoIndex);
} else {
//申请权限
ActivityCompat.requestPermissions(mContext, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
}
}
private void startActivity(int intoIndex) {
mSelectImages.clear();
Intent intent = new Intent(mContext, SelectImageActivity.class);
intent.putParcelableArrayListExtra("selected_images", mSelectImages);
intent.putExtra("intoIndex", intoIndex);
if (intoIndex == 3) {
startActivityForResult(intent, SELECT_VIDEO_REQUEST);
} else {
startActivityForResult(intent, SELECT_IMAGE_REQUEST);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == SELECT_IMAGE_REQUEST && data != null) {
ArrayList<ImageEntity> selectImages = data.getParcelableArrayListExtra(SelectImageActivity.EXTRA_RESULT);
for (ImageEntity entity : selectImages) {
inputPanel.sendImageFile(entity.getPath());
}
} else if (requestCode == SELECT_VIDEO_REQUEST && data != null) {
ArrayList<ImageEntity> selectImages = data.getParcelableArrayListExtra(SelectImageActivity.EXTRA_RESULT);
for (ImageEntity entity : selectImages) {
inputPanel.sendVideoFile(entity.getPath());
}
}
}
}
}

View File

@ -16,13 +16,9 @@ import com.yunbao.live.views.SystemMessageViewHolder;
import java.util.ArrayList;
import java.util.Date;
import io.rong.imlib.RongCoreClient;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.listener.OnReceiveMessageWrapperListener;
import io.rong.imlib.model.Conversation;
import io.rong.imlib.model.Message;
import io.rong.imlib.model.ReceivedProfile;
import io.rong.message.TextMessage;
/**
* Created by cxf on 2018/11/24.
@ -58,7 +54,6 @@ public class SystemMessageActivity extends AbsActivity {
if ("-2".equals(type)) {
type = "-1";
type2 = "-2";
RongCoreClient.addOnReceiveMessageListener(listener);
} else {
type2 = "0";
}
@ -110,7 +105,6 @@ public class SystemMessageActivity extends AbsActivity {
Constants.remarks = "";
Constants.isAdmin = "";
if ("-2".equals(type2)) {
RongCoreClient.removeOnReceiveMessageListener(listener);
}
super.onDestroy();
}
@ -142,40 +136,6 @@ public class SystemMessageActivity extends AbsActivity {
}
}
//获取新信息
private OnReceiveMessageWrapperListener listener = new OnReceiveMessageWrapperListener() {
@Override
public void onReceivedMessage(Message message, ReceivedProfile profile) {
Log.i("Log", "message=" + message);
if (message.getTargetId() != null && !"".endsWith(message.getTargetId())) {
String firstIndex = message.getTargetId().substring(0, 1);
if (!"g".endsWith(firstIndex) && !"__system__".endsWith(message.getTargetId())) {
String firstIndexRM = "";
String firstIndexRM2 = "";
if (message.getObjectName().equals("RC:TxtMsg")) {
TextMessage rongMsg = (TextMessage) message.getContent();
if (rongMsg.getContent().length() > 4) {
firstIndexRM = rongMsg.getContent().substring(0, 5);
}
if (rongMsg.getContent().length() > 9) {
firstIndexRM2 = rongMsg.getContent().substring(0, 10);
}
}
if (!"{\"msg".equals(firstIndexRM) && !"{\"retcode\"".equals(firstIndexRM2)) {
if (message.getObjectName().equals("RC:TxtMsg")) {
getNewMsg(message);
} else if (message.getObjectName().equals("RC:ImgMsg")) {
getNewMsg(message);
} else if (message.getObjectName().equals("RC:SightMsg")) {
getNewMsg(message);
}
cleanMessage(message.getTargetId());
}
}
}
}
};
//清除指定会话未读数
private void cleanMessage(String toId) {

View File

@ -90,4 +90,5 @@ public class SystemMessageAdapter extends RefreshAdapter<SystemMessageBean> {
}
}
}
}

View File

@ -2,10 +2,14 @@ package com.yunbao.live.bean;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import com.alibaba.fastjson.annotation.JSONField;
import com.yunbao.common.bean.UserBean;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by cxf on 2017/8/14.
* IM 聊天用户 实体类
@ -112,4 +116,23 @@ public class ImUserBean {
public void setUserId(String userId) {
this.userId = userId;
}
/**
* 会话列表展示时间
*/
public String getLastDate() {
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 "";
}
}
}

View File

@ -3,14 +3,8 @@ package com.yunbao.live.dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.drawable.BitmapDrawable;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.text.TextUtils;
import android.util.Log;
import android.view.Gravity;
@ -24,6 +18,10 @@ import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
@ -56,12 +54,9 @@ import java.util.Collections;
import java.util.Date;
import java.util.List;
import io.rong.imlib.RongCoreClient;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.listener.OnReceiveMessageWrapperListener;
import io.rong.imlib.model.Conversation;
import io.rong.imlib.model.Message;
import io.rong.imlib.model.ReceivedProfile;
import io.rong.message.RecallNotificationMessage;
import io.rong.message.TextMessage;
@ -162,7 +157,6 @@ public class LiveChatListDialogFragment extends AbsDialogFragment {
ImHttpUtil.cancel(ImHttpConsts.GET_SYSTEM_MESSAGE_LIST);
ImHttpUtil.cancel(ImHttpConsts.GET_IM_USER_INFO);
Constants.isShowLiveDialog = false;
RongCoreClient.removeOnReceiveMessageListener(listener);
}
private void initView() {
@ -209,7 +203,6 @@ public class LiveChatListDialogFragment extends AbsDialogFragment {
});
mRecyclerView.setAdapter(mAdapter);
RongCoreClient.addOnReceiveMessageListener(listener);
RongIMClient.setOnRecallMessageListener(listenerBack);
Constants.nowId = "";
@ -299,59 +292,6 @@ public class LiveChatListDialogFragment extends AbsDialogFragment {
});
}
//获取新信息
OnReceiveMessageWrapperListener listener = new OnReceiveMessageWrapperListener() {
@Override
public void onReceivedMessage(Message message, ReceivedProfile profile) {
Log.i("Log", "message=" + message);
if (message.getTargetId() != null && !"".endsWith(message.getTargetId())) {
String firstIndex = message.getTargetId().substring(0, 1);
if (!"g".endsWith(firstIndex) && !"__system__".endsWith(message.getTargetId())) {
String firstIndexRM = "";
String firstIndexRM2 = "";
if (message.getObjectName().equals("RC:TxtMsg")) {
TextMessage rongMsg = (TextMessage) message.getContent();
if (rongMsg.getContent().length() > 4) {
firstIndexRM = rongMsg.getContent().substring(0, 5);
}
if (rongMsg.getContent().length() > 9) {
firstIndexRM2 = rongMsg.getContent().substring(0, 10);
}
}
if (!"{\"msg".equals(firstIndexRM) && !"{\"retcode\"".equals(firstIndexRM2)) {
if (lt_nodata_msg.getVisibility() == View.VISIBLE) {
lt_nodata_msg.setVisibility(View.GONE);
}
if (systemMessageActivity != null && !Constants.nowId.equals("")) {
if (Constants.isShowLiveDialog) {//直播间单聊插入消息
if (message.getObjectName().equals("RC:TxtMsg")) {
systemMessageActivity.getNewMsg(message);
} else if (message.getObjectName().equals("RC:ImgMsg")) {
systemMessageActivity.getNewMsg(message);
} else if (message.getObjectName().equals("RC:SightMsg")) {
systemMessageActivity.getNewMsg(message);
}
cleanMessage(null, message.getTargetId());
}
} else {
if (systemMessageActivity.nowUid != null && !message.getTargetId().equals(systemMessageActivity.nowUid)) {
//新信息提示
try {
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone r = RingtoneManager.getRingtone(getActivity(), notification);
r.play();
} catch (Exception e) {
e.getMessage();
}
}
getChatPoint();
getOneUserChat(message.getTargetId());
}
}
}
}
}
};
//撤回消息
RongIMClient.OnRecallMessageListener listenerBack = new RongIMClient.OnRecallMessageListener() {

View File

@ -0,0 +1,138 @@
package com.yunbao.live.dialog;
import android.app.Activity;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import com.yunbao.common.utils.ToastUtil;
import com.yunbao.live.R;
import io.rong.imlib.RongIMClient;
/**
* 聊天菜单弹窗
*/
public class MenuPopuwWindow implements View.OnClickListener {
private Activity mContext;
private String userId;
private View popupView;
private TextView tvBlack, tvBlackMove;
private LinearLayout ltRemarks;
private PopupWindow popupWindow;
public MenuPopuwWindow(Activity context) {
this.mContext = context;
popupView = LayoutInflater.from(mContext).inflate(R.layout.popwindow_chat_more, null);
initView();
}
public MenuPopuwWindow setIsAdmin(String isAdmin, String userId) {
this.userId = userId;
if (TextUtils.equals(isAdmin, "1")) {
tvBlack.setVisibility(View.GONE);
tvBlackMove.setVisibility(View.GONE);
ltRemarks.setVisibility(View.VISIBLE);
} else {
ltRemarks.setVisibility(View.GONE);
RongIMClient.getInstance().getBlacklistStatus(userId, new RongIMClient.ResultCallback<RongIMClient.BlacklistStatus>() {
@Override
public void onSuccess(RongIMClient.BlacklistStatus blacklistStatus) {
if (blacklistStatus == RongIMClient.BlacklistStatus.IN_BLACK_LIST) {
tvBlackMove.setVisibility(View.VISIBLE);
tvBlack.setVisibility(View.GONE);
} else {
tvBlack.setVisibility(View.VISIBLE);
tvBlackMove.setVisibility(View.GONE);
}
}
@Override
public void onError(RongIMClient.ErrorCode errorCode) {
}
});
}
return this;
}
/**
* 初始化组件
*/
private void initView() {
tvBlack = popupView.findViewById(R.id.tv_black);
tvBlackMove = popupView.findViewById(R.id.tv_black_move);
ltRemarks = popupView.findViewById(R.id.lt_remarks);
tvBlack.setOnClickListener(this);
tvBlackMove.setOnClickListener(this);
ltRemarks.setOnClickListener(this);
}
/**
* 展示弹窗
*
* @param view 显示在什么组件的下面
* @return
*/
public void show(View view) {
popupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);
popupWindow.showAsDropDown(view);
WindowManager.LayoutParams lp = mContext.getWindow().getAttributes();
lp.alpha = 0.8f;
mContext.getWindow().setAttributes(lp);
popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
lp.alpha = 1f;
mContext.getWindow().setAttributes(lp);
}
});
}
@Override
public void onClick(View v) {
int id = v.getId();
//拉黑
if (id == R.id.tv_black) {
RongIMClient.getInstance().addToBlacklist(userId, new RongIMClient.OperationCallback() {
@Override
public void onSuccess() {
ToastUtil.show(mContext.getResources().getString(R.string.black_succer));
popupWindow.dismiss();
tvBlack.setVisibility(View.VISIBLE);
tvBlackMove.setVisibility(View.GONE);
}
@Override
public void onError(RongIMClient.ErrorCode errorCode) {
ToastUtil.show(errorCode.msg);
popupWindow.dismiss();
}
});
} else if (id == R.id.tv_black_move) {//移出黑名单
RongIMClient.getInstance().removeFromBlacklist(userId, new RongIMClient.OperationCallback() {
@Override
public void onSuccess() {
ToastUtil.show(mContext.getResources().getString(R.string.black_succer_more));
popupWindow.dismiss();
tvBlackMove.setVisibility(View.VISIBLE);
tvBlack.setVisibility(View.GONE);
}
@Override
public void onError(RongIMClient.ErrorCode errorCode) {
ToastUtil.show(errorCode.msg);
popupWindow.dismiss();
}
});
} else if (id == R.id.lt_remarks) {//添加备注
}
}
}

View File

@ -0,0 +1,155 @@
package com.yunbao.live.utils;
import android.util.Log;
import java.io.File;
import java.io.FileInputStream;
import java.text.DecimalFormat;
public class FileSizeUtil {
public static final int SIZETYPE_B = 1;//获取文件大小单位为B的double值
public static final int SIZETYPE_KB = 2;//获取文件大小单位为KB的double值
public static final int SIZETYPE_MB = 3;//获取文件大小单位为MB的double值
public static final int SIZETYPE_GB = 4;//获取文件大小单位为GB的double值
/**
* 获取文件指定文件的指定单位的大小
*
* @param filePath 文件路径
* @param sizeType 获取大小的类型1为B2为KB3为MB4为GB
* @return double值的大小
*/
public static double getFileOrFilesSize(String filePath, int sizeType) {
File file = new File(filePath);
long blockSize = 0;
try {
if (file.isDirectory()) {
blockSize = getFileSizes(file);
} else {
blockSize = getFileSize(file);
}
} catch (Exception e) {
e.printStackTrace();
Log.e("获取文件大小", "获取失败!");
}
return FormetFileSize(blockSize, sizeType);
}
/**
* 调用此方法自动计算指定文件或指定文件夹的大小
*
* @param filePath 文件路径
* @return 计算好的带BKBMBGB的字符串
*/
public static String getAutoFileOrFilesSize(String filePath) {
File file = new File(filePath);
long blockSize = 0;
try {
if (file.isDirectory()) {
blockSize = getFileSizes(file);
} else {
blockSize = getFileSize(file);
}
} catch (Exception e) {
e.printStackTrace();
Log.e("获取文件大小", "获取失败!");
}
return FormetFileSize(blockSize);
}
/**
* 获取指定文件大小
*
* @param file
* @return
* @throws Exception
*/
private static long getFileSize(File file) throws Exception {
long size = 0;
if (file.exists()) {
FileInputStream fis = null;
fis = new FileInputStream(file);
size = fis.available();
} else {
file.createNewFile();
Log.e("获取文件大小", "文件不存在!");
}
return size;
}
/**
* 获取指定文件夹
*
* @param f
* @return
* @throws Exception
*/
private static long getFileSizes(File f) throws Exception {
long size = 0;
File flist[] = f.listFiles();
for (int i = 0; i < flist.length; i++) {
if (flist[i].isDirectory()) {
size = size + getFileSizes(flist[i]);
} else {
size = size + getFileSize(flist[i]);
}
}
return size;
}
/**
* 转换文件大小
*
* @param fileS
* @return
*/
private static String FormetFileSize(long fileS) {
DecimalFormat df = new DecimalFormat("#.00");
String fileSizeString = "";
String wrongSize = "0B";
if (fileS == 0) {
return wrongSize;
}
if (fileS < 1024) {
fileSizeString = df.format((double) fileS) + "B";
} else if (fileS < 1048576) {
fileSizeString = df.format((double) fileS / 1024) + "KB";
} else if (fileS < 1073741824) {
fileSizeString = df.format((double) fileS / 1048576) + "MB";
} else {
fileSizeString = df.format((double) fileS / 1073741824) + "GB";
}
return fileSizeString;
}
/**
* 转换文件大小,指定转换的类型
*
* @param fileS
* @param sizeType
* @return
*/
private static double FormetFileSize(long fileS, int sizeType) {
DecimalFormat df = new DecimalFormat("#.00");
double fileSizeLong = 0;
switch (sizeType) {
case SIZETYPE_B:
fileSizeLong = Double.valueOf(df.format((double) fileS));
break;
case SIZETYPE_KB:
fileSizeLong = Double.valueOf(df.format((double) fileS / 1024));
break;
case SIZETYPE_MB:
fileSizeLong = Double.valueOf(df.format((double) fileS / 1048576));
break;
case SIZETYPE_GB:
fileSizeLong = Double.valueOf(df.format((double) fileS / 1073741824));
break;
default:
break;
}
return fileSizeLong;
}
}

View File

@ -0,0 +1,293 @@
package com.yunbao.live.views;
import android.content.Context;
import android.net.Uri;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import androidx.annotation.Nullable;
import com.yunbao.common.utils.ToastUtil;
import com.yunbao.live.R;
import com.yunbao.live.utils.FileSizeUtil;
import io.rong.imkit.IMCenter;
import io.rong.imlib.IRongCallback;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.Conversation;
import io.rong.imlib.model.Message;
import io.rong.message.FileMessage;
import io.rong.message.ImageMessage;
import io.rong.message.TextMessage;
/**
* 自定义输入区
*/
public class InputPanelViewHolder extends LinearLayout implements View.OnClickListener {
private ImageView inputPanelAddBtn;
private EditText editBtn;
public Button inputPanelSendBtn;
//接收方的用户id
private String targetId;
//是否可以发送消息
private boolean isSend = false;
private LinearLayout pluginList;
/**
* 必传字段
*
* @param targetId 接收方的用户id
* @return
*/
public InputPanelViewHolder setTargetId(String targetId) {
this.targetId = targetId;
return this;
}
public InputPanelViewHolder(Context context) {
super(context);
}
public InputPanelViewHolder(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
View inputPanelView = View.inflate(context, R.layout.view_input_panel, this);
initView(inputPanelView);
}
/**
* 初始化布局
*/
private void initView(View inputPanelView) {
inputPanelAddBtn = inputPanelView.findViewById(R.id.input_panel_add_btn);
editBtn = inputPanelView.findViewById(R.id.edit_btn);
inputPanelSendBtn = inputPanelView.findViewById(R.id.input_panel_send_btn);
pluginList = inputPanelView.findViewById(R.id.plugin_list);
editBtn.addTextChangedListener(mEditTextWatcher);
inputPanelSendBtn.setOnClickListener(this);
inputPanelAddBtn.setOnClickListener(this);
editBtn.setOnClickListener(this);
inputPanelView.findViewById(R.id.lt_photo_button).setOnClickListener(this);
inputPanelView.findViewById(R.id.lt_choospic_button).setOnClickListener(this);
inputPanelView.findViewById(R.id.lt_video_button).setOnClickListener(this);
}
@Override
public void onClick(View v) {
int id = v.getId();
//点击加号拓展按钮
if (id == R.id.input_panel_add_btn) {
showPlugin();
//点击发送按钮
} else if (id == R.id.input_panel_send_btn) {
sendMessage();
} else if (id == R.id.edit_btn) {
if (pluginList.getVisibility() == VISIBLE) {
pluginList.setVisibility(GONE);
}
} else if (id == R.id.lt_photo_button) {
if (messageCallback != null) {
messageCallback.choosePic(1);
}
} else if (id == R.id.lt_choospic_button) {
if (messageCallback != null) {
messageCallback.choosePic(2);
}
} else if (id == R.id.lt_video_button) {
if (messageCallback != null) {
messageCallback.choosePic(3);
}
}
}
/**
* 展示拓展插件列表
*/
private void showPlugin() {
if (pluginList.getVisibility() == VISIBLE) {
pluginList.setVisibility(GONE);
} else {
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editBtn, InputMethodManager.SHOW_FORCED);
imm.hideSoftInputFromWindow(editBtn.getWindowToken(), 0); //强制隐藏键盘
pluginList.setVisibility(VISIBLE);
}
}
/**
* 发送文字消息
*/
private void sendMessage() {
if (!isSend) return;
if (!TextUtils.isEmpty(editBtn.getText()) && !TextUtils.isEmpty(editBtn.getText().toString().trim())) {
String text = editBtn.getText().toString();
editBtn.setText("");
Conversation.ConversationType conversationType = Conversation.ConversationType.PRIVATE;
TextMessage messageContent = TextMessage.obtain(text);
Message message = Message.obtain(targetId, conversationType, messageContent);
IMCenter.getInstance().sendMessage(message, null, null, new IRongCallback.ISendMessageCallback() {
@Override
public void onAttached(Message message) {
}
@Override
public void onSuccess(Message message) {
}
@Override
public void onError(Message message, RongIMClient.ErrorCode errorCode) {
}
});
} else {
ToastUtil.show("不可以发送空消息");
}
}
private TextWatcher mEditTextWatcher = new TextWatcher() {
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
//存入草稿
Conversation.ConversationType types = Conversation.ConversationType.PRIVATE;
if (s != null && s.length() != 0) {
isSend = true;
inputPanelSendBtn.setBackground(getResources().getDrawable(R.mipmap.btn_sand1));
} else {
isSend = false;
IMCenter.getInstance().saveTextMessageDraft(types, targetId, editBtn.getText().toString(), null);
inputPanelSendBtn.setBackground(getResources().getDrawable(R.mipmap.btn_sand));
}
int offset;
if (count == 0) {
int var10000 = start + before;
offset = -before;
} else {
offset = count;
}
if (offset != 0) {
RongIMClient.getInstance().sendTypingStatus(types, targetId, "RC:TxtMsg");
}
}
public void afterTextChanged(Editable s) {
}
};
/**
* 发送媒体消息
*
* @param imagePath
*/
public void sendImageFile(String imagePath) {
if (pluginList.getVisibility() == VISIBLE) {
pluginList.setVisibility(GONE);
}
Uri localUri = Uri.parse("file://" + imagePath);
ImageMessage imageMessage = ImageMessage.obtain(localUri, localUri);
Conversation.ConversationType conversationType = Conversation.ConversationType.PRIVATE;
Message message = Message.obtain(targetId, conversationType, imageMessage);
IMCenter.getInstance().sendMediaMessage(message, null, null, new IRongCallback.ISendMediaMessageCallback() {
@Override
public void onProgress(Message message, int i) {
}
@Override
public void onCanceled(Message message) {
}
@Override
public void onAttached(Message message) {
}
@Override
public void onSuccess(Message message) {
}
@Override
public void onError(final Message message, final RongIMClient.ErrorCode errorCode) {
}
});
}
public void sendVideoFile(String filePath) {
if (pluginList.getVisibility() == VISIBLE) {
pluginList.setVisibility(GONE);
}
Message message;
double fileSize = FileSizeUtil.getFileOrFilesSize(filePath, FileSizeUtil.SIZETYPE_MB);
Uri localUri = Uri.parse("file://" + filePath);
Conversation.ConversationType conversationType = Conversation.ConversationType.PRIVATE;
FileMessage videoMessage = FileMessage.obtain(getContext(), localUri);
message = Message.obtain(targetId, conversationType, videoMessage);
IMCenter.getInstance().sendMediaMessage(message, null, null, new IRongCallback.ISendMediaMessageCallback() {
@Override
public void onProgress(Message message, int i) {
}
@Override
public void onCanceled(Message message) {
}
@Override
public void onAttached(Message message) {
}
@Override
public void onSuccess(Message message) {
}
@Override
public void onError(final Message message, final RongIMClient.ErrorCode errorCode) {
ToastUtil.show(errorCode.msg);
}
});
}
/**
* 多媒体信息
*/
public interface MediaMessageCallback {
void choosePic(int intoIndex);
}
private MediaMessageCallback messageCallback;
public void addMediaMessageCallback(MediaMessageCallback callback) {
messageCallback = callback;
}
}

View File

@ -6,7 +6,6 @@ import android.content.Context;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
@ -14,35 +13,27 @@ import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.yunbao.common.CommonAppConfig;
import com.yunbao.common.Constants;
import com.yunbao.common.event.UpdateTablePoint;
import com.yunbao.common.http.HttpCallback;
import com.yunbao.common.http.HttpClient;
import com.yunbao.common.manager.imrongcloud.MessageIMManager;
import com.yunbao.common.utils.ToastUtil;
import com.yunbao.live.R;
import com.yunbao.live.activity.LiveActivity;
import com.yunbao.live.activity.LiveAudienceActivity;
import com.yunbao.live.bean.ImUserBean;
import com.yunbao.live.bean.LiveChatBean;
import com.yunbao.live.dialog.LiveHDDialogFragment;
import com.yunbao.live.dialog.LiveMicUserDialogFragment;
import com.yunbao.live.dialog.LivePromotionDialogFragment;
import com.yunbao.live.http.ImHttpUtil;
import com.yunbao.live.http.LiveHttpUtil;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.Arrays;
import java.util.List;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.Conversation;
/**
* Created by cxf on 2018/10/9.
* 观众直播间逻辑
@ -118,7 +109,7 @@ public class LiveAudienceViewHolder extends AbsLiveViewHolder {
v_msg_redpoint = (View) findViewById(R.id.v_msg_redpoint);
//获取系统未读消息
getSystemMessages();
MessageIMManager.get(context).getSystemMessages();
EventBus.getDefault().register(LiveAudienceViewHolder.this);
}
@ -363,73 +354,6 @@ public class LiveAudienceViewHolder extends AbsLiveViewHolder {
public void timeOver() {
}
public void getChatPoint() {
if (v_msg_redpoint.getVisibility() == View.GONE) {
Conversation.ConversationType[] conversationTypes = {Conversation.ConversationType.PRIVATE, Conversation.ConversationType.GROUP};
boolean containBlocked = true;
RongIMClient.getInstance().getUnreadCount(conversationTypes, containBlocked,
new RongIMClient.ResultCallback<Integer>() {
@Override
public void onSuccess(Integer unReadCount) {
//未读消息大于0更改红点状态
if (unReadCount > 0)
changeMessagePoint(unReadCount);
}
@Override
public void onError(RongIMClient.ErrorCode ErrorCode) {
changeMessagePoint(0);
}
});
}
}
/**
* 获取系统消息有未读数展示红点
*/
private void getSystemMessages() {
//获取系统消息列表
ImHttpUtil.getImUserInfo("", new HttpCallback() {
@Override
public void onSuccess(int code, String msg, String[] info) {
if (code == 0) {
//获取系统消息列表
List<ImUserBean> listUserBean = JSON.parseArray(Arrays.toString(info), ImUserBean.class);
if (listUserBean != null && listUserBean.size() >= 2) {
//目前就三条消息需求判断前两条消息是否有未读消息
for (int i = 0; i < listUserBean.size() - 2; i++) {
//消息对象
ImUserBean userBean = listUserBean.get(i);
//未读消息数
String number = userBean.getNum();
//未读消息不为空并且大于0
if (!TextUtils.isEmpty(number) && Integer.parseInt(number) > 0) {
context.runOnUiThread(() -> changeMessagePoint(Integer.parseInt(number)));
}
}
}
}
}
});
}
/**
* 更改消息红点的状态
*
* @param number 未读消息
*/
private void changeMessagePoint(int number) {
//发送通知更改菜单红点
EventBus.getDefault().post(new UpdateTablePoint(number));
if (v_msg_redpoint.getVisibility() == View.VISIBLE && number > 0) return;
if (number > 0) {
v_msg_redpoint.setVisibility(View.VISIBLE);
} else {
v_msg_redpoint.setVisibility(View.GONE);
}
}
//红点(直播页面)
@Subscribe(threadMode = ThreadMode.MAIN)

View File

@ -778,7 +778,6 @@ public class SystemMessageViewHolder extends AbsViewHolder implements View.OnCli
lt_remarks.setVisibility(View.GONE);
}
PopupWindow popupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);
// popupWindow.showAsDropDown(view, view.getWidth(), -view.getHeight());
popupWindow.showAsDropDown(view);
WindowManager.LayoutParams lp = nowActivity.getWindow().getAttributes();
lp.alpha = 0.8f;

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/view_title" />
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="@color/gray3" />
<com.yunbao.live.views.InputPanelViewHolder
android:id="@+id/input_panel"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<include layout="@layout/view_title" />
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="500dp"
android:background="@color/white"/>
</LinearLayout>

View File

@ -1,22 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rootView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
android:id="@+id/rootView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="72dp"
android:background="@color/white"
android:paddingTop="24dp"
>
android:paddingTop="24dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
>
android:layout_height="match_parent">
<TextView
android:id="@+id/titleView"
@ -26,8 +23,7 @@
android:gravity="center"
android:textColor="@color/textColor"
android:textSize="18sp"
android:textStyle="bold"
/>
android:textStyle="bold" />
<ImageView
android:id="@+id/btn_back"
@ -37,26 +33,25 @@
android:onClick="backClick"
android:padding="9dp"
android:src="@mipmap/icon_back"
android:tint="@color/textColor"
/>
android:tint="@color/textColor" />
<ImageView
android:layout_alignParentRight="true"
android:id="@+id/btn_question"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:onClick="questionClick"
android:padding="9dp"
android:src="@drawable/question_medal"
android:tint="@color/textColor"
/>
android:tint="@color/textColor" />
</RelativeLayout>
</FrameLayout>
<ProgressBar
android:id="@+id/progressbar"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="3dp"
android:progressDrawable="@drawable/bg_horizontal_progressbar"
/>
android:progressDrawable="@drawable/bg_horizontal_progressbar" />
</LinearLayout>

View File

@ -59,19 +59,11 @@
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:id="@+id/lt_nodata_msg"
<include
layout="@layout/view_layout_msg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:visibility="gone">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/img_no_new" />
</LinearLayout>
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
</ScrollView>

View File

@ -0,0 +1,144 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="true"
android:background="@color/white_85"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/input_panel_add_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginEnd="4dp"
android:src="@drawable/rc_ext_input_panel_add" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/rc_margin_size_10"
android:layout_toEndOf="@id/input_panel_add_btn"
android:orientation="horizontal">
<EditText
android:id="@+id/edit_btn"
style="@style/EditTextStyle.Alignment"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="6.5dp"
android:layout_marginEnd="5dp"
android:layout_marginBottom="6.5dp"
android:layout_weight="1"
android:background="@drawable/rc_ext_panel_editbox_background"
android:maxLines="4" />
<Button
android:id="@+id/input_panel_send_btn"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_gravity="center"
android:background="@mipmap/btn_sand"
android:textSize="@dimen/rc_font_text_third_size" />
</LinearLayout>
</RelativeLayout>
<LinearLayout
android:id="@+id/plugin_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="9dp"
android:layout_marginTop="9dp"
android:layout_marginRight="9dp"
android:layout_marginBottom="18dp"
android:gravity="center"
android:orientation="vertical"
android:visibility="gone">
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginBottom="9dp"
android:background="@color/gray_ededed"
android:visibility="gone" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp"
android:layout_weight="1"
android:gravity=""
android:orientation="horizontal">
<LinearLayout
android:id="@+id/lt_photo_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical">
<View
android:layout_width="54dp"
android:layout_height="54dp"
android:background="@mipmap/icon_camera" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:text="照片"
android:textSize="13sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/lt_choospic_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="21dp"
android:gravity="center"
android:orientation="vertical">
<View
android:layout_width="54dp"
android:layout_height="54dp"
android:background="@mipmap/icon_photo" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:text="相册"
android:textSize="13sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/lt_video_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="21dp"
android:gravity="center"
android:orientation="vertical">
<View
android:layout_width="54dp"
android:layout_height="54dp"
android:background="@mipmap/icon_video" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:text="视频"
android:textSize="13sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_marginTop="200dp"
android:layout_height="wrap_content">
<LinearLayout
android:id="@+id/lt_nodata_msg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:visibility="visible">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/img_no_new" />
</LinearLayout>
</RelativeLayout>

View File

@ -67,7 +67,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone">
android:visibility="visible">
<LinearLayout
android:layout_width="match_parent"
@ -135,7 +135,7 @@
android:layout_marginBottom="18dp"
android:gravity="center"
android:orientation="vertical"
android:visibility="gone">
android:visibility="visible">
<View
android:layout_width="match_parent"

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="DialogActivity" parent="@style/Theme.AppCompat.Dialog">
<item name="android:windowFrame">@android:color/transparent</item><!--边框-->
<item name="android:windowIsFloating">true</item><!--是否浮如今activity之上-->
<item name="android:windowIsTranslucent">true</item><!--半透明-->
<item name="android:windowNoTitle">true</item><!--无标题-->
<item name="android:windowBackground">@android:color/transparent</item><!--背景透明-->
<item name="android:backgroundDimAmount">0.3</item>
<item name="windowActionBar">false</item>
</style>
</resources>

View File

@ -46,7 +46,10 @@
<activity
android:name=".activity.MainActivity"
android:hardwareAccelerated="true"
android:screenOrientation="portrait" />
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:theme="@style/noAnimationStyle"
android:windowSoftInputMode="stateHidden|adjustResize" />
<activity
android:name=".activity.UserHomeActivity"
android:screenOrientation="portrait" />
@ -122,6 +125,14 @@
<activity
android:name=".activity.MyWebViewActivity2"
android:screenOrientation="portrait" />
<!--融云消息列表界面-->
<activity
android:name=".activity.PDLiveConversationListActivity"
android:hardwareAccelerated="true"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:theme="@style/noAnimationStyle"
android:windowSoftInputMode="stateHidden|adjustResize" />
</application>
</manifest>

View File

@ -31,6 +31,7 @@ import com.adjust.sdk.AdjustEvent;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.blankj.utilcode.util.DeviceUtils;
import com.blankj.utilcode.util.GsonUtils;
import com.facebook.AccessToken;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
@ -65,11 +66,14 @@ import com.yunbao.common.CommonAppConfig;
import com.yunbao.common.Constants;
import com.yunbao.common.HtmlConfig;
import com.yunbao.common.activity.WebViewActivity;
import com.yunbao.common.bean.IMLoginModel;
import com.yunbao.common.bean.LoginData;
import com.yunbao.common.bean.UserBean;
import com.yunbao.common.http.CommonHttpUtil;
import com.yunbao.common.http.HttpCallback;
import com.yunbao.common.interfaces.CommonCallback;
import com.yunbao.common.manager.IMLoginManager;
import com.yunbao.common.manager.imrongcloud.RongcloudIMManager;
import com.yunbao.common.utils.ToastUtil;
import com.yunbao.main.R;
import com.yunbao.main.dialog.LoginTipsDialog;
@ -712,8 +716,11 @@ public class EntryActivity extends AppCompatActivity {
mShowInvite = obj.getIntValue("isagent") == 1;
CommonAppConfig.getInstance().setLoginInfo(uid, token, true);
getBaseUserInfo();
//友盟统计登录
// MobclickAgent.onProfileSignIn(mLoginType, uid);
//设置登录信息
IMLoginModel model = GsonUtils.fromJson(info[0], IMLoginModel.class);
IMLoginManager.get(activity).setupLoginUser(model);
//融云连接服务器
RongcloudIMManager.connectIM(activity);
} else {
Contexts.startActivity(new Intent(Contexts, BindUserActivity.class).putExtra("uid", uid).putExtra("token", token));
}
@ -785,7 +792,6 @@ public class EntryActivity extends AppCompatActivity {
});
}
// RecommendActivity.forward(Contexts, mShowInvite);
if (CommonAppConfig.IS_GOOGLE_PLAY == true) {
EntryActivity.this.startActivity(new Intent(EntryActivity.this, OneLoginActivity.class));
}else{

View File

@ -6,6 +6,7 @@ import android.content.Context;
import android.content.Intent;
import androidx.recyclerview.widget.RecyclerView;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
@ -19,6 +20,7 @@ import com.adjust.sdk.AdjustEvent;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.blankj.utilcode.util.DeviceUtils;
import com.blankj.utilcode.util.GsonUtils;
import com.fm.openinstall.OpenInstall;
import com.fm.openinstall.listener.AppInstallAdapter;
import com.fm.openinstall.model.AppData;
@ -29,12 +31,15 @@ import com.yunbao.common.HtmlConfig;
import com.yunbao.common.activity.AbsActivity;
import com.yunbao.common.activity.WebViewActivity;
import com.yunbao.common.bean.ConfigBean;
import com.yunbao.common.bean.IMLoginModel;
import com.yunbao.common.bean.LoginData;
import com.yunbao.common.bean.UserBean;
import com.yunbao.common.http.CommonHttpConsts;
import com.yunbao.common.http.CommonHttpUtil;
import com.yunbao.common.http.HttpCallback;
import com.yunbao.common.interfaces.CommonCallback;
import com.yunbao.common.manager.IMLoginManager;
import com.yunbao.common.manager.imrongcloud.RongcloudIMManager;
import com.yunbao.common.utils.ToastUtil;
import com.yunbao.common.utils.WordUtil;
import com.yunbao.main.R;
@ -63,7 +68,7 @@ public class LoginActivity extends AbsActivity {
private EditText mEditPwd;
private View mBtnLogin;
private RecyclerView mRecyclerView;
// private MobLoginUtil mLoginUtil;
// private MobLoginUtil mLoginUtil;
private static boolean mFirstLogin;//是否是第一次登录
private static boolean mShowInvite;//显示邀请码弹窗
private static String mLoginType = Constants.MOB_PHONE;//登录方式
@ -134,19 +139,6 @@ public class LoginActivity extends AbsActivity {
mEditPwd.addTextChangedListener(textWatcher);
boolean otherLoginType = false;
ConfigBean configBean = CommonAppConfig.getInstance().getConfig();
// if (configBean != null) {
// List<MobBean> list = MobBean.getLoginTypeList(configBean.getLoginType());
// if (list != null && list.size() > 0) {
// mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
// mRecyclerView.setHasFixedSize(true);
// mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false));
// LoginTypeAdapter adapter = new LoginTypeAdapter(mContext, list);
// adapter.setOnItemClickListener(this);
// mRecyclerView.setAdapter(adapter);
// mLoginUtil = new MobLoginUtil();
// otherLoginType = true;
// }
// }
if (!otherLoginType) {
findViewById(R.id.other_login_tip).setVisibility(View.INVISIBLE);
}
@ -207,13 +199,6 @@ public class LoginActivity extends AbsActivity {
mEditPhone.requestFocus();
return;
}
//屏蔽原因国外手机号无法校验合法性
// if (!ValidatePhoneUtil.validateMobileNumber(phoneNum)) {
// mEditPhone.setError(WordUtil.getString(R.string.login_phone_error));
// mEditPhone.requestFocus();
// return;
// }
pwd = mEditPwd.getText().toString().trim();
if (TextUtils.isEmpty(pwd)) {
mEditPwd.setError(WordUtil.getString(R.string.login_input_pwd));
@ -248,7 +233,11 @@ public class LoginActivity extends AbsActivity {
getBaseUserInfo();
mFirebaseAnalytics.logEvent("FS_createdRole", null);
logger.logEvent("FB_createdRole");
//设置登录信息
IMLoginModel model = GsonUtils.fromJson(info[0], IMLoginModel.class);
IMLoginManager.get(activity).setupLoginUser(model);
//融云连接服务器
RongcloudIMManager.connectIM(activity);
//友盟统计登录
// MobclickAgent.onProfileSignIn(mLoginType, uid);
@ -264,17 +253,12 @@ public class LoginActivity extends AbsActivity {
MainHttpUtil.getBaseInfo(new CommonCallback<UserBean>() {
@Override
public void callback(UserBean bean) {
// if (mFirstLogin) {
// RecommendActivity.forward(Contexts, mShowInvite);
// } else {
//完成手机号密码登录
AdjustEvent adjustEvent1 = new AdjustEvent("4ncwlv");
mFirebaseAnalytics.logEvent("FS_login", null);
logger.logEvent("FB_login");
Adjust.trackEvent(adjustEvent1);
MainActivity.forward(Contexts, mShowInvite);
// }
EntryActivity.activity.finish();
activity.finish();
}

View File

@ -12,9 +12,6 @@ import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.viewpager.widget.ViewPager;
import android.text.TextUtils;
import android.util.Log;
import android.view.Display;
@ -22,6 +19,11 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.viewpager.widget.ViewPager;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
@ -45,7 +47,7 @@ import com.yunbao.common.bean.LiveSvgGiftBean;
import com.yunbao.common.bean.UpdataListBean;
import com.yunbao.common.bean.UserBean;
import com.yunbao.common.custom.TabButtonGroup;
import com.yunbao.common.event.UpdateTablePoint;
import com.yunbao.common.event.MessageIMEvent;
import com.yunbao.common.event.UpdateTablePointMe;
import com.yunbao.common.http.CommonHttpConsts;
import com.yunbao.common.http.HttpCallback;
@ -65,11 +67,8 @@ import com.yunbao.common.views.AbsMainViewHolder;
import com.yunbao.live.LiveConfig;
import com.yunbao.live.activity.LiveAnchorActivity;
import com.yunbao.live.activity.LiveRyAnchorActivity;
import com.yunbao.live.bean.ImUserBean;
import com.yunbao.live.bean.LiveBean;
import com.yunbao.live.bean.LiveKsyConfigBean;
import com.yunbao.live.bean.RongIMEvent;
import com.yunbao.live.http.ImHttpUtil;
import com.yunbao.live.http.LiveHttpConsts;
import com.yunbao.live.http.LiveHttpUtil;
import com.yunbao.live.utils.LiveStorge;
@ -77,10 +76,12 @@ import com.yunbao.live.views.ChatListViewHolder;
import com.yunbao.main.R;
import com.yunbao.main.dialog.MainStartDialogFragment;
import com.yunbao.main.dialog.SigninDialog;
import com.yunbao.main.event.PDLiveConversationListEvent;
import com.yunbao.main.http.MainHttpConsts;
import com.yunbao.main.http.MainHttpUtil;
import com.yunbao.main.interfaces.MainAppBarLayoutListener;
import com.yunbao.main.interfaces.MainStartChooseCallback;
import com.yunbao.main.manager.imrongcloud.ConversationIMListManager;
import com.yunbao.main.presenter.CheckLivePresenter;
import com.yunbao.main.utils.GenerateTestUserSig;
import com.yunbao.main.views.MainHomeCommunityViewHolder;
@ -103,17 +104,6 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
import cn.rongcloud.rtc.api.RCRTCConfig;
import cn.rongcloud.rtc.api.RCRTCEngine;
import io.rong.imlib.IRongCoreListener;
import io.rong.imlib.RongCoreClient;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.Conversation;
import io.rong.imlib.model.MessageContent;
import io.rong.message.SightMessage;
import static io.rong.imlib.IRongCoreListener.ConnectionStatusListener.ConnectionStatus.KICKED_OFFLINE_BY_OTHER_CLIENT;
public class MainActivity extends AbsActivity implements MainAppBarLayoutListener {
public static RelativeLayout rt_main_tab;
@ -127,7 +117,6 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene
private MainHomeVideoViewHolder mainHomeVideoViewHolder;
private MainHomeShopViewHolder mListShopViewHolder;
private ChatListViewHolder mChatListViewHolder;
// private MainHomeChatViewHolder mainHomeChatViewHolder;
private MainMeViewHolder mMeViewHolder;
private AbsMainViewHolder[] mViewHolders;
private View mBottom;
@ -145,7 +134,8 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene
private HttpCallback mGetLiveSdkCallback;
private String mUrlCsd;
private boolean isReady = false;
private View v_table_redpoint, v_table_redpoint_me;
private TextView v_table_redpoint;
private View v_table_redpoint_me;
String TAG = "GooglePay";
@ -153,9 +143,7 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene
private boolean isWebClose = false;
public static boolean isTabClose = false;
private boolean isFirstOpen = true;
private UserBean bean = null;
//判断融云是否初始化成功不成功在消息列表时重新请求
private boolean isInitRongIM = false;
private int messageNumber = 0, numberMe = 1;
@Override
protected int getLayoutId() {
@ -242,6 +230,7 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene
@Override
protected void main() {
ConversationIMListManager.get(this);
//谷歌支付
GoogleBillingUtil.setIsAutoAcknowledgePurchase(true);//设置自动确认购买
googleBillingUtil = GoogleBillingUtil.getInstance()
@ -250,7 +239,7 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene
rt_main_tab = (RelativeLayout) findViewById(R.id.rt_main_tab);
v_table_redpoint = (View) findViewById(R.id.v_table_redpoint);
v_table_redpoint = findViewById(R.id.v_table_redpoint);
v_table_redpoint_me = (View) findViewById(R.id.v_table_redpoint_me);
Display mDisplay = getWindowManager().getDefaultDisplay();
@ -341,171 +330,19 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene
}
checkVersion();
loginIM();
// ImPushUtil.getInstance().resumePush();
CommonAppConfig.getInstance().setLaunched(true);
mFristLoad = true;
ConfigBean configBean = CommonAppConfig.getInstance().getConfig();
mUrlCsd = configBean.getCustomerServerUrl();
getD();
init();
initTXIM();
mViewPager.setCurrentItem(0);
mTabButtonGroup.setCurPosition(0);
isInstructor();
//获取系统消息
if (v_table_redpoint.getVisibility() == View.GONE) {
getSystemMessages();
}
}
/**
* 获取系统消息有未读数展示红点
*/
private void getSystemMessages() {
//获取系统消息列表
ImHttpUtil.getImUserInfo("", new HttpCallback() {
@Override
public void onSuccess(int code, String msg, String[] info) {
if (code == 0) {
//获取系统消息列表
List<ImUserBean> listUserBean = JSON.parseArray(Arrays.toString(info), ImUserBean.class);
if (listUserBean != null && listUserBean.size() >= 2) {
//目前就三条消息需求判断前两条消息是否有未读消息
for (int i = 0; i < listUserBean.size() - 2; i++) {
//消息对象
ImUserBean userBean = listUserBean.get(i);
//未读消息数
String number = userBean.getNum();
//未读消息不为空并且大于0
if (!TextUtils.isEmpty(number) && Integer.parseInt(number) > 0) {
runOnUiThread(() -> changeTablePoint(Integer.parseInt(number)));
}
}
}
}
}
});
}
// private void getChatPoint() {
// RongIMClient.getInstance().getTotalUnreadCount(new RongIMClient.ResultCallback<Integer>() {
//
// @Override
// public void onSuccess(Integer unReadCount) {
// Log.e("ErrorCode", "sss" + unReadCount);
// if (unReadCount > 1) {
// v_table_redpoint.setVisibility(View.VISIBLE);
// } else {
// v_table_redpoint.setVisibility(View.GONE);
// }
// }
//
// @Override
// public void onError(RongIMClient.ErrorCode ErrorCode) {
// Log.e("ErrorCode", "错误" + ErrorCode.msg);
// v_table_redpoint.setVisibility(View.GONE);
// }
// });
// CommonAppConfig appConfig = CommonAppConfig.getInstance();
// UserBean u = appConfig.getUserBean();
// if ("0".equals(u.getFront_task())) {
// v_table_redpoint_me.setVisibility(View.VISIBLE);
// } else {
// v_table_redpoint_me.setVisibility(View.GONE);
// }
// }
//初始化im
private void initRongIM(UserBean bean) {
if (bean == null) {
//初始化融云服务
String[] uidAndToken = SpUtil.getInstance().getMultiStringValue(new String[]{SpUtil.UID, SpUtil.TOKEN});
final String uid = uidAndToken[0];
final String token = uidAndToken[1];
if (!TextUtils.isEmpty(uid) && !TextUtils.isEmpty(token)) {
MainHttpUtil.getBaseInfo(uid, token, new CommonCallback<UserBean>() {
@Override
public void callback(UserBean model) {
if (model != null) {
initRongIM(model);
}
}
});
}
return;
}
Log.i("ryyyy", bean.getToken_rong());
//测试服
// String appKey = "pvxdm17jpd3hr";
//正式服
String appKey = "uwd1c0sxu1p71";
// IMLib 初始化
RongIMClient.init(this, appKey);
// RTCLib 初始化
RCRTCConfig.Builder config = RCRTCConfig.Builder.create();
RCRTCEngine.getInstance().init(getApplicationContext(), RCRTCConfig.Builder.create().enableEncoderTexture(true).build());
RongIMClient.connect(bean.getToken_rong(), new RongIMClient.ConnectCallback() {
@Override
public void onSuccess(String s) {
Log.i("ryyyy", "链接成功");
isReady = true;
RongCoreClient.addConnectionStatusListener(new IRongCoreListener.ConnectionStatusListener() {
@Override
public void onChanged(ConnectionStatus status) {
if (status == KICKED_OFFLINE_BY_OTHER_CLIENT) {
ToastUtil.show("登錄過期,請重新登陸");
RCRTCEngine.getInstance().unInit();
RongIMClient.getInstance().logout();
RongCoreClient.removeConnectionStatusListener(null);
CommonAppConfig.getInstance().clearLoginInfo();
LoginActivity.forward();
}
}
});
CommonAppConfig appConfig = CommonAppConfig.getInstance();
appConfig.getAnchorLevel(bean.getLevelAnchor());
Constants.myUid = bean.getGoodnum();
Constants.myAvatar = bean.getAvatar();
//没有系统消息去查询融云未读消息
if (v_table_redpoint.getVisibility() == View.GONE) {
getChatPoint();
}
isInitRongIM = true;
EventBus.getDefault().postSticky(new RongIMEvent().setInitRongIM(true));
}
@Override
public void onError(RongIMClient.ConnectionErrorCode connectionErrorCode) {
//错误返回34001表示已连接直接获取未读消息否者继续调用连接接口
if (connectionErrorCode.getValue() == 34001) {
//没有系统消息去查询融云未读消息
if (v_table_redpoint.getVisibility() == View.GONE) {
getChatPoint();
}
} else {
initRongIM(null);
}
Log.i("ryyyy", "链接失败" + connectionErrorCode);
}
@Override
public void onDatabaseOpened(RongIMClient.DatabaseOpenStatus databaseOpenStatus) {
}
});
//视频注册
ArrayList<Class<? extends MessageContent>> myMessages = new ArrayList<>();
myMessages.add(SightMessage.class);
RongIMClient.registerMessageType(myMessages);
}
//初始化腾讯im
private void initTXIM() {
@ -615,15 +452,6 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene
} else if (i == R.id.btn_follow) {
//关注
FollowActivity.forward(mContext, CommonAppConfig.getInstance().getUid(), 0);
// } else if (i == R.id.btn_csd) {
// //客服
// WebViewActivity.forward(mContext,mUrlCsd);
// }else if (i == R.id.btn_recharge) {
// //充值
// RouteUtil.forwardMyCoin(mContext);
} else if (i == R.id.btn_msg) {
// ChatActivity.forward(mContext);
} else if (i == R.id.img_trophy) {
MainListActivity.forward(this, 0);
}
@ -818,31 +646,7 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene
mTabButtonGroup.setCurPosition(Constants.isShowPage);
}
Constants.isShowPage = -1;
//初始化融云服务
String[] uidAndToken = SpUtil.getInstance().getMultiStringValue(new String[]{SpUtil.UID, SpUtil.TOKEN});
final String uid = uidAndToken[0];
final String token = uidAndToken[1];
if (!TextUtils.isEmpty(uid) && !TextUtils.isEmpty(token)) {
MainHttpUtil.getBaseInfo(uid, token, new CommonCallback<UserBean>() {
@Override
public void callback(UserBean model) {
if (model != null) {
bean = model;
initRongIM(model);
}
}
});
} else {
MainHttpUtil.getBaseInfo(CommonAppConfig.getInstance().getUid(), CommonAppConfig.getInstance().getToken(), new CommonCallback<UserBean>() {
@Override
public void callback(UserBean model) {
if (model != null) {
bean = model;
initRongIM(model);
}
}
});
}
}
/**
@ -994,28 +798,6 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene
}
}
//红点(消息中心)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onUpdateFieldEvent(UpdateTablePoint updateTablePoint) {
//判断消息中心红点是否已经展示如果已经展示并且未读消息大于0则不再执行之后的逻辑
if (v_table_redpoint.getVisibility() == View.VISIBLE && updateTablePoint.getPoint() > 0)
return;
if (updateTablePoint.getPoint() > 0) {
v_table_redpoint.setVisibility(View.VISIBLE);
} else {
v_table_redpoint.setVisibility(View.GONE);
}
}
//红点(我的)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onUpdateFieldEvent(UpdateTablePointMe updateTablePointMe) {
if (updateTablePointMe.getPoint() == 0) {
v_table_redpoint_me.setVisibility(View.VISIBLE);
} else {
v_table_redpoint_me.setVisibility(View.GONE);
}
}
//
@Subscribe(threadMode = ThreadMode.MAIN)
@ -1062,15 +844,11 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene
mMainHomeCommunityViewHolder = new MainHomeCommunityViewHolder(mContext, parent, this);//社区
vh = mMainHomeCommunityViewHolder;
} else if (position == 2) {
if (!isInitRongIM) {
initRongIM(bean);
ToastUtil.show("消息列表正在初始化……");
return;
}
if (mChatListViewHolder == null) {
mChatListViewHolder = new ChatListViewHolder(mContext, parent, 1);
}
vh = mChatListViewHolder;
//跳转消息列表
Bundle bundle = new Bundle();
bundle.putInt(PDLiveConversationListActivity.MESSAGENUMBER, messageNumber);
bundle.putInt(PDLiveConversationListActivity.NUMBERME, numberMe);
ConversationIMListManager.get(this).jumpConversationList(bundle);
} else if (position == 3) {
mMeViewHolder = new MainMeViewHolder(mContext, parent);
vh = mMeViewHolder;
@ -1177,40 +955,6 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene
}
}
public void getChatPoint() {
Conversation.ConversationType[] conversationTypes = {Conversation.ConversationType.PRIVATE, Conversation.ConversationType.GROUP};
boolean containBlocked = true;
RongIMClient.getInstance().getUnreadCount(conversationTypes, containBlocked,
new RongIMClient.ResultCallback<Integer>() {
@Override
public void onSuccess(Integer unReadCount) {
runOnUiThread(new Runnable() {
@Override
public void run() {
changeTablePoint(unReadCount);
}
});
}
@Override
public void onError(RongIMClient.ErrorCode ErrorCode) {
runOnUiThread(new Runnable() {
@Override
public void run() {
changeTablePoint(0);
}
});
}
});
}
//未读数
private void changeTablePoint(int tabPoint) {
EventBus.getDefault().post(new UpdateTablePoint(tabPoint));
}
//是否管理员
public void isInstructor() {
@ -1256,7 +1000,6 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene
if (info != null && !"".equals(info[0])) {
List<ChatRemarksBean> remarksList = new ArrayList<>();
Map<String, String> map = JSON.parseObject(info[0], Map.class);
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
map.forEach((key, vlaue) -> {
ChatRemarksBean chatRemarksBean = new ChatRemarksBean();
chatRemarksBean.setUserId(key);
@ -1274,4 +1017,39 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene
}
});
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onPDLiveConversationListEvent(PDLiveConversationListEvent event) {
if (event.getPage() == 11) {
finish();
} else {
mViewPager.setCurrentItem(event.getPage());
mTabButtonGroup.setCurPosition(event.getPage());
}
}
//消息中心
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onMessageIMEvent(MessageIMEvent event) {
messageNumber = event.getNumber();
if (event.getNumber() > 0) {
v_table_redpoint.setVisibility(View.VISIBLE);
v_table_redpoint.setText(event.getNumber() + "");
} else {
v_table_redpoint.setVisibility(View.GONE);
v_table_redpoint.setText("");
}
}
//红点(我的)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onUpdateFieldEvent(UpdateTablePointMe updateTablePointMe) {
numberMe = updateTablePointMe.getPoint();
if (updateTablePointMe.getPoint() == 0) {
v_table_redpoint_me.setVisibility(View.VISIBLE);
} else {
v_table_redpoint_me.setVisibility(View.GONE);
}
}
}

View File

@ -8,7 +8,9 @@ import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.provider.MediaStore;
import androidx.annotation.RequiresApi;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
@ -60,6 +62,7 @@ import com.yunbao.live.presenter.LiveRoomCheckLivePresenter;
import com.yunbao.live.views.LiveRoomViewHolder;
import com.yunbao.main.dialog.EncourageDialog;
import com.yunbao.main.http.MainHttpUtil;
import com.yunbao.main.manager.imrongcloud.ConversationIMListManager;
import com.yunbao.video.activity.VideoPlayActivity;
import com.yunbao.video.bean.VideoBean;
import com.yunbao.video.utils.VideoStorge;
@ -93,6 +96,7 @@ public class MyWebViewActivity extends AbsActivity {
private String urlNow = "";
private ProcessImageUtil mImageUtil;
private boolean isUpdataUser = false;
private MyWebViewActivity mContext;
@Override
protected int getLayoutId() {
@ -101,6 +105,7 @@ public class MyWebViewActivity extends AbsActivity {
@Override
protected void main() {
mContext = this;
urlNow = getIntent().getStringExtra(Constants.URL);
Log.e("bb22", "1121212");
if (!"".endsWith(Constants.myUrl)) {
@ -289,7 +294,8 @@ public class MyWebViewActivity extends AbsActivity {
@JavascriptInterface
public void androidClickSayHiBack(String uid, String name, String img) {
Constants.firstInto = 0;
SystemMessageActivity.forward(mContext, "-2", uid, name, img);
// SystemMessageActivity.forward(mContext, "-2", uid, name, img);
ConversationIMListManager.get(mContext).jumpConversation(mContext, uid);
}
@JavascriptInterface

View File

@ -0,0 +1,222 @@
package com.yunbao.main.activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.alibaba.fastjson.JSON;
import com.yunbao.common.activity.AbsActivity;
import com.yunbao.common.custom.TabButtonGroup;
import com.yunbao.common.event.MessageIMEvent;
import com.yunbao.common.event.UpdateTablePointMe;
import com.yunbao.common.http.HttpCallback;
import com.yunbao.common.manager.imrongcloud.MessageIMManager;
import com.yunbao.common.utils.ToastUtil;
import com.yunbao.live.bean.ImUserBean;
import com.yunbao.live.http.ImHttpUtil;
import com.yunbao.main.R;
import com.yunbao.main.adapter.SystemMessageAdapter;
import com.yunbao.main.event.PDLiveConversationListEvent;
import com.yunbao.main.manager.imrongcloud.ConversationIMListManager;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import io.rong.imkit.conversationlist.ConversationListFragment;
/**
* pdlive消息中心
*/
public class PDLiveConversationListActivity extends AbsActivity {
//菜单
private TabButtonGroup mTabButtonGroup;
public static String CLASSNAME = "PDLiveConversationListActivity", MESSAGENUMBER = "messageNumber", NUMBERME = "numberMe";
private PDLiveConversationListActivity mContext;
private ConversationListFragment conversationListFragment;
private FrameLayout container;
private long mLastClickBackTime;//上次点击back键的时间
private TextView redPoint;
private View redpointMe;
@Override
protected int getLayoutId() {
return R.layout.activity_conversation_list;
}
@Override
protected void main() {
super.main();
EventBus.getDefault().register(this);
mContext = this;
initView();
initData();
}
/**
* 初始化控件
*/
private void initView() {
//菜单
mTabButtonGroup = findViewById(R.id.tab_group);
container = findViewById(R.id.container);
redPoint = findViewById(R.id.v_table_redpoint);
redpointMe = findViewById(R.id.v_table_redpoint_me);
mTabButtonGroup.setCurPosition(2);
//选中监听
mTabButtonGroup.addTabButtonGroupChangeListener((view, index) -> {
Log.e(CLASSNAME, "onPageSelected:" + index);
if (index != 2) {
//打开主页菜单关闭消息中心
EventBus.getDefault().post(new PDLiveConversationListEvent().setPage(index));
//防止重新加载多个
startActivity(new Intent(mContext, MainActivity.class));
}
});
}
/**
* 初始化数据
*/
private void initData() {
//获取系统消息列表
ImHttpUtil.getImUserInfo("", new HttpCallback() {
@Override
public void onSuccess(int code, String msg, String[] info) {
if (code == 0) {
container.post(new Runnable() {
@Override
public void run() {
List<ImUserBean> listUserBean = JSON.parseArray(Arrays.toString(info), ImUserBean.class);
addSystemMessagesView(listUserBean);
}
});
}
}
});
//刷新列表内用户信息
ConversationIMListManager.get(mContext).addUserInfoProvider();
//消息中心
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
int messageNumber = bundle.getInt(MESSAGENUMBER, 0);
int numberMe = bundle.getInt(NUMBERME, 1);
onMessageIMEvent(new MessageIMEvent().setNumber(messageNumber));
onUpdateFieldEvent(new UpdateTablePointMe(numberMe));
}
//获取一下系统通知
MessageIMManager.get(this).getSystemMessages();
}
/**
* 添加头部系统消息
*
* @param listUserBean 数据源
*/
private void addSystemMessagesView(List<ImUserBean> listUserBean) {
//倒序展示
Collections.reverse(listUserBean);
//展示会话列表
conversationListFragment = new ConversationListFragment();
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.container, conversationListFragment);
transaction.commit();
//自定义空数据背景View
conversationListFragment.setEmptyView(com.yunbao.live.R.layout.view_layout_msg);
//初始化系统消息界面
View rootView = LayoutInflater.from(mContext).inflate(R.layout.view_system_message, null, true);
RecyclerView systemMessageList = rootView.findViewById(R.id.system_message_list);
SystemMessageAdapter messageAdapter = new SystemMessageAdapter(mContext);
messageAdapter.addDataAll(listUserBean);
systemMessageList.setHasFixedSize(false);
systemMessageList.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, true));
systemMessageList.setAdapter(messageAdapter);
conversationListFragment.addHeaderView(rootView);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mTabButtonGroup != null) {
mTabButtonGroup.cancelAnim();
}
EventBus.getDefault().unregister(this);
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onRestart() {
super.onRestart();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onStop() {
super.onStop();
}
@Override
public void onBackPressed() {
long curTime = System.currentTimeMillis();
if (curTime - mLastClickBackTime > 2000) {
mLastClickBackTime = curTime;
ToastUtil.show(R.string.main_click_next_exit);
} else {
EventBus.getDefault().post(new PDLiveConversationListEvent().setPage(11));
finish();
}
}
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onMessageIMEvent(MessageIMEvent event) {
if (redPoint == null) return;
if (event.getNumber() > 0) {
redPoint.setVisibility(View.VISIBLE);
redPoint.setText(String.valueOf(event.getNumber()));
} else {
redPoint.setVisibility(View.GONE);
redPoint.setText("");
}
}
//红点(我的)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onUpdateFieldEvent(UpdateTablePointMe updateTablePointMe) {
if (redpointMe == null) return;
if (updateTablePointMe.getPoint() == 0) {
redpointMe.setVisibility(View.VISIBLE);
} else {
redpointMe.setVisibility(View.GONE);
}
}
}

View File

@ -23,6 +23,7 @@ import com.adjust.sdk.AdjustEvent;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.blankj.utilcode.util.DeviceUtils;
import com.blankj.utilcode.util.GsonUtils;
import com.facebook.appevents.AppEventsConstants;
import com.fm.openinstall.OpenInstall;
import com.fm.openinstall.listener.AppInstallAdapter;
@ -34,10 +35,13 @@ import com.yunbao.common.CommonAppConfig;
import com.yunbao.common.HtmlConfig;
import com.yunbao.common.activity.AbsActivity;
import com.yunbao.common.activity.WebViewActivity;
import com.yunbao.common.bean.IMLoginModel;
import com.yunbao.common.bean.UserBean;
import com.yunbao.common.http.CommonHttpUtil;
import com.yunbao.common.http.HttpCallback;
import com.yunbao.common.interfaces.CommonCallback;
import com.yunbao.common.manager.IMLoginManager;
import com.yunbao.common.manager.imrongcloud.RongcloudIMManager;
import com.yunbao.common.utils.DialogUitl;
import com.yunbao.common.utils.ToastUtil;
import com.yunbao.common.utils.WordUtil;
@ -87,6 +91,7 @@ public class RegisterActivity extends AbsActivity {
private WebSettings webSettings;
private LinearLayout yqm_view;
private ArrayList<Country> allCountries = new ArrayList<>();
private RegisterActivity activity;
@Override
protected int getLayoutId() {
@ -96,6 +101,13 @@ public class RegisterActivity extends AbsActivity {
@Override
protected void main() {
activity = this;
//谷歌
mFirebaseAnalytics.logEvent("FS_complete_2nd_loading", null);
logger.logEvent("FB_complete_2nd_loading");
AdjustEvent adjustEvent = new AdjustEvent("pooqmz");
Adjust.trackEvent(adjustEvent);
// setTitle(WordUtil.getString(R.string.reg_register));
AdjustEvent adjustEvent = new AdjustEvent("pooqmz");
@ -397,7 +409,7 @@ public class RegisterActivity extends AbsActivity {
mDialog.show();
}
MainHttpUtil.register(edit_invitecode_2.getText().toString().trim(),phoneNum, mPromoCode, mUuidDevice, mCountryCode, pwd, pwd2, code, new HttpCallback() {
MainHttpUtil.register(edit_invitecode_2.getText().toString().trim(), phoneNum, mPromoCode, mUuidDevice, mCountryCode, pwd, pwd2, code, new HttpCallback() {
@Override
public void onSuccess(int code, String msg, String[] info) {
if (code == 0) {
@ -422,7 +434,6 @@ public class RegisterActivity extends AbsActivity {
params1);
login(phoneNum, pwd, mUuidDevice);
OpenInstall.reportRegister();
} else {
@ -454,7 +465,7 @@ public class RegisterActivity extends AbsActivity {
if (appData.getData() != null && !appData.getData().equals("")) {
JSONObject data = JSON.parseObject(appData.getData());
mPromoCode = data.getString("admin_id") + "";
if(!mPromoCode.equals("")) {
if (!mPromoCode.equals("")) {
yqm_view.setVisibility(View.GONE);
}
Log.d("OpenInstall", "appData.getData()1111= " + mPromoCode);
@ -477,8 +488,11 @@ public class RegisterActivity extends AbsActivity {
CommonAppConfig.getInstance().setLoginInfo(uid, token, true);
getBaseUserInfo();
//友盟统计登录
// MobclickAgent.onProfileSignIn(Constants.MOB_PHONE, uid);
//设置登录信息
IMLoginModel model = GsonUtils.fromJson(info[0], IMLoginModel.class);
IMLoginManager.get(activity).setupLoginUser(model);
//融云连接服务器
RongcloudIMManager.connectIM(activity);
} else {
ToastUtil.show(msg);
}

View File

@ -0,0 +1,150 @@
package com.yunbao.main.adapter;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.adjust.sdk.Adjust;
import com.adjust.sdk.AdjustEvent;
import com.alibaba.fastjson.JSON;
import com.facebook.appevents.AppEventsLogger;
import com.google.firebase.analytics.FirebaseAnalytics;
import com.yunbao.common.activity.WebViewActivity;
import com.yunbao.common.glide.ImgLoader;
import com.yunbao.common.manager.imrongcloud.MessageIMManager;
import com.yunbao.live.activity.SystemMessageActivity;
import com.yunbao.live.bean.ImUserBean;
import com.yunbao.main.R;
import com.yunbao.main.views.SystemMessageViewHolder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* 系统消息适配器
*/
public class SystemMessageAdapter extends RecyclerView.Adapter {
private List<ImUserBean> listUserBean = new ArrayList<>();
protected Activity mContext;
protected LayoutInflater mInflater;
public SystemMessageAdapter(Activity mContext) {
this.mContext = mContext;
mInflater = LayoutInflater.from(mContext);
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//view_system_message_item.xml
return new SystemMessageViewHolder(mInflater.inflate(R.layout.view_system_message_item, parent, false));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
ImUserBean model = listUserBean.get(position);
SystemMessageViewHolder messageViewHolder = (SystemMessageViewHolder) holder;
ImgLoader.displayWithError(mContext, model.getImage(), messageViewHolder.avatarImage, com.yunbao.live.R.mipmap.chat_head_mo);
if (position == 2) {
messageViewHolder.userMsg.setText(TextUtils.isEmpty(model.getLink()) ? mContext.getResources().getString(R.string.chat_like) : model.getLink());
} else {
if (position == 1) {
messageViewHolder.userMsg.setText(TextUtils.isEmpty(model.getContent()) ? mContext.getResources().getString(R.string.chat_action_no) : model.getContent());
} else {
messageViewHolder.userMsg.setText(TextUtils.isEmpty(model.getContent()) ? "" : model.getContent());
}
}
messageViewHolder.userName.setText(model.getTitle());
messageViewHolder.lastTime.setText(model.getLastDate());
String number = model.getNum();
if (!TextUtils.isEmpty(number) && !TextUtils.equals(number, "0")) {
messageViewHolder.redPoint.setVisibility(View.VISIBLE);
messageViewHolder.redPoint.setText(number);
} else {
messageViewHolder.redPoint.setVisibility(View.GONE);
}
//系统消息的跳转
messageViewHolder.setViewHolderOnClickListener((view, model1) -> {
//获取一下系统通知
MessageIMManager.get(mContext).getSystemMessages(new MessageIMManager.SystemMessagesHttpCallback() {
@Override
public void onSuccess(int code, String msg, String[] info) {
if (code==0){
List<ImUserBean> listUserBean = JSON.parseArray(Arrays.toString(info), ImUserBean.class);
addSystemMessagesView(listUserBean);
}
}
});
if (model1.getContent().equals("在線客服")) {
FirebaseAnalytics.getInstance(mContext).logEvent("FS_customer_service", null);
AppEventsLogger.newLogger(mContext).logEvent("FB_customer_service");
AdjustEvent adjustEvent1 = new AdjustEvent("ww5z2p");
Adjust.trackEvent(adjustEvent1);
} else if (model1.getContent().equals("新手指導員")) {
FirebaseAnalytics.getInstance(mContext).logEvent("FS_guide", null);
AppEventsLogger.newLogger(mContext).logEvent("FB_guide", null);
AdjustEvent adjustEvent1 = new AdjustEvent("m0nfpn");
Adjust.trackEvent(adjustEvent1);
}
if (!TextUtils.isEmpty(model1.getLink())) {
mContext.startActivity(new Intent(mContext, WebViewActivity.class).putExtra("url", model1.getLink()));
} else if ("1".equals(model1.getType()) || "2".equals(model1.getType())) {//系统消息,互动消息,猜你喜欢
forward(mContext, model1.getType(), "", model1.getTitle(), "");
} else if ("3".equals(model1.getType())) {
if (model1.getLink() != null && !"".equals(model1.getLink())) {
WebViewActivity.forward(mContext, model1.getLink());
} else {
forward(mContext, model1.getType(), "", model1.getTitle(), "");
}
}
}, model);
}
@Override
public int getItemCount() {
return listUserBean.size();
}
/**
* 添加数据源
*
* @param mListUserBean 数据源
*/
public void addDataAll(List<ImUserBean> mListUserBean) {
listUserBean.clear();
listUserBean.addAll(mListUserBean);
notifyDataSetChanged();
}
private void forward(Context context, String type, String uid, String title, String headImg) {
context.startActivity(new Intent(context, SystemMessageActivity.class)
.putExtra("type", type)
.putExtra("uid", uid)
.putExtra("title", title)
.putExtra("headImg", headImg));
}
/**
* 添加头部系统消息
*
* @param mlistUserBean 数据源
*/
private void addSystemMessagesView(List<ImUserBean> mlistUserBean) {
//倒序展示
Collections.reverse(mlistUserBean);
listUserBean.clear();
listUserBean.addAll(mlistUserBean);
notifyDataSetChanged();
}
}

View File

@ -0,0 +1,19 @@
package com.yunbao.main.event;
import com.yunbao.common.bean.BaseModel;
/**
* 消息中心的信息通知
*/
public class PDLiveConversationListEvent extends BaseModel {
private int page = 0;//page=11时退出应用
public int getPage() {
return page;
}
public PDLiveConversationListEvent setPage(int page) {
this.page = page;
return this;
}
}

View File

@ -0,0 +1,128 @@
package com.yunbao.main.manager.imrongcloud;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.blankj.utilcode.util.GsonUtils;
import com.yunbao.common.http.CommonHttpUtil;
import com.yunbao.common.http.HttpCallback;
import com.yunbao.live.activity.PDLIiveChatActivity;
import com.yunbao.live.activity.PDLiveConversationActivity;
import com.yunbao.live.bean.SearchUserBean;
import com.yunbao.main.activity.PDLiveConversationListActivity;
import com.yunbao.main.utils.PDLiveCustomConversationProvider;
import com.yunbao.main.utils.PDLiveMessageProcessor;
import io.rong.imkit.config.RongConfigCenter;
import io.rong.imkit.conversationlist.model.BaseUiConversation;
import io.rong.imkit.conversationlist.provider.PrivateConversationProvider;
import io.rong.imkit.userinfo.RongUserInfoManager;
import io.rong.imkit.utils.RouteUtils;
import io.rong.imkit.widget.adapter.ProviderManager;
import io.rong.imlib.model.UserInfo;
/**
* 会话列表管理
*/
public class ConversationIMListManager {
private static ConversationIMListManager manager;
private Context mContext;
private ConversationIMListManager(Context context) {
mContext = context;
//将自定义会话列表 Activity 注册到 IMKit SDK
RouteUtils.registerActivity(RouteUtils.RongActivityType.ConversationListActivity, PDLiveConversationListActivity.class);
//将自定义会话列表 Activity 注册到 IMKit SDK
RouteUtils.registerActivity(RouteUtils.RongActivityType.ConversationListActivity, PDLIiveChatActivity.class);
RongConfigCenter.conversationListConfig().setDataProcessor(new PDLiveMessageProcessor());
//获取会话模板管理器
ProviderManager<BaseUiConversation> providerManager = RongConfigCenter.conversationListConfig().getProviderManager();
//用自定义模板替换 SDK 原有模板
providerManager.replaceProvider(PrivateConversationProvider.class, new PDLiveCustomConversationProvider());
}
/**
* 获取单利
*/
public static ConversationIMListManager get(Context context) {
if (null == manager) {
manager = new ConversationIMListManager(context);
}
return manager;
}
/**
* 跳转消息列表
*
* @param title 会话列表页面标题如果传空会显示为默认标题 会话列表
*/
public void jumpConversationList(String title) {
RouteUtils.routeToConversationListActivity(mContext, title);
}
/**
* 跳转消息列表
*
* @param extras 自定义携带数据
*/
public void jumpConversationList(Bundle extras) {
Intent intent = new Intent(mContext, PDLiveConversationListActivity.class);
intent.putExtras(extras);
mContext.startActivity(intent);
}
/**
* 跳转消息列表
*
* @param extras 自定义携带数据
*/
public void jumpPDLIiveChat(Bundle extras) {
RouteUtils.registerActivity(RouteUtils.RongActivityType.ConversationActivity, PDLIiveChatActivity.class);
Intent intent = new Intent(mContext, PDLIiveChatActivity.class);
intent.putExtras(extras);
mContext.startActivity(intent);
}
/**
* 跳转会话页面
* @param context 上下文
* @param targetId 用户id
*/
public void jumpConversation(Activity context,String targetId) {
RouteUtils.registerActivity(RouteUtils.RongActivityType.ConversationActivity, PDLiveConversationActivity.class);
Intent intent = new Intent(context, PDLiveConversationActivity.class);
intent.putExtra(RouteUtils.TARGET_ID, targetId);
context.startActivity(intent);
}
/**
* 刷新用户信息(异步)
*/
public void addUserInfoProvider() {
RongUserInfoManager.getInstance().setUserInfoProvider(userId -> {
CommonHttpUtil.getUserBaseinfo(userId, new HttpCallback() {
@Override
public void onSuccess(int code, String msg, String[] info) {
if (code == 0 && info.length > 0) {
JSONObject obj = JSON.parseObject(info[0]);
SearchUserBean userBean = JSON.toJavaObject(obj, SearchUserBean.class);
UserInfo userInfo = new UserInfo(userId, userBean.getUserNiceName(), Uri.parse(userBean.getAvatar()));
//使用空白字段存储自己服务器用户的所有的信息
userInfo.setExtra(GsonUtils.toJson(userBean));
RongUserInfoManager.getInstance().refreshUserInfoCache(userInfo);
}
}
});
return null;
}, true);
}
}

View File

@ -0,0 +1,50 @@
package com.yunbao.main.utils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
import io.rong.imkit.conversationlist.model.BaseUiConversation;
import io.rong.imkit.conversationlist.provider.BaseConversationProvider;
import io.rong.imkit.utils.RouteUtils;
import io.rong.imkit.widget.adapter.IViewProviderListener;
import io.rong.imkit.widget.adapter.ViewHolder;
import io.rong.imlib.model.Conversation;
import io.rong.imlib.model.UserInfo;
/**
* pdlive自定义会话模板
*/
public class PDLiveCustomConversationProvider extends BaseConversationProvider {
@Override
public boolean isItemViewType(BaseUiConversation item) {
//根据业务需要判断 item 是该模板需要处理的会话时返回 true, 否则返回 false
//此处以自定义私聊会话模板为例
Log.e("PDLiveCustomConversat","-+++++++++++++++++++++++++++++++++");
return item.mCore.getConversationType().equals(Conversation.ConversationType.PRIVATE);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//根据业务需要自定义处理
Log.e("PDLiveCustomConversat","------------------------------------------"+viewType);
// View view = LayoutInflater.from(parent.getContext()).inflate(layout.rc_conversationlist_item, parent, false);
return super.onCreateViewHolder(parent, viewType);
}
@Override
public void bindViewHolder(ViewHolder holder, BaseUiConversation uiConversation, int position, List<BaseUiConversation> list, IViewProviderListener<BaseUiConversation> listener) {
for (BaseUiConversation conversation:list){
// UserInfo userInfo = conversation.mCore.getLatestMessage().getUserInfo();
//// Log.e("PDLiveCustomConversat","getName****************************"+userInfo.getName());
// Log.e("PDLiveCustomConversat","getPortraitUri****************************"+userInfo.getPortraitUri().toString());
}
//根据业务需要自定义处理
Log.e("PDLiveCustomConversat","****************************");
super.bindViewHolder(holder, uiConversation, position, list, listener);
}
}

View File

@ -0,0 +1,20 @@
package com.yunbao.main.utils;
import io.rong.imkit.config.BaseDataProcessor;
import io.rong.imlib.model.Conversation;
/**
* 融云消息筛选
*/
public class PDLiveMessageProcessor extends BaseDataProcessor<Conversation> {
/**
* 自定义会话列表页面支持的会话类型此处设置为仅支持单聊
*/
@Override
public Conversation.ConversationType[] supportedTypes() {
Conversation.ConversationType[] types = {Conversation.ConversationType.PRIVATE};
return types;
}
}

View File

@ -408,7 +408,6 @@ public class MainHomeLiveViewHolder extends AbsMainHomeChildViewHolder implement
watchLive(bean, Constants.LIVE_HOME, position);
} else if (bean.getIs_week() != null && bean.getIs_week().equals("1")) {
String url = CommonAppConfig.HOST + bean.getUrl() + "?a=1";
// WeekWebViewActivity.forward(mContext, url, true);
LiveHttpUtil.getLiveInfo(bean.getUid(), new HttpCallback() {
@Override
public void onSuccess(int code, String msg, String[] info) {
@ -443,21 +442,12 @@ public class MainHomeLiveViewHolder extends AbsMainHomeChildViewHolder implement
intoIndex = 1;
RouteUtil.forwardUserHome(mContext, bean.getUid(), 0);
}
// watchLive(bean, Constants.LIVE_HOME, position);
}
public void changeLiveList(int position) {
if (mAdapter != null) {
// new_data.remove(position);
// mAdapter.notifyItemChanged(position);
}
}
@Override
public void loadData() {
// if (mRefreshView != null) {
// mRefreshView.initData();
// }
}
@Override
@ -485,11 +475,5 @@ public class MainHomeLiveViewHolder extends AbsMainHomeChildViewHolder implement
@Override
public void onResume() {
super.onResume();
// if(intoIndex == 1){
// intoIndex = 0;
// if (mRefreshView != null) {
// mRefreshView.initData();
// }
// }
}
}

View File

@ -0,0 +1,47 @@
package com.yunbao.main.views;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.makeramen.roundedimageview.RoundedImageView;
import com.yunbao.live.bean.ImUserBean;
import com.yunbao.main.R;
/**
* 系统消息界面
*/
public class SystemMessageViewHolder extends RecyclerView.ViewHolder {
public RoundedImageView avatarImage;
public TextView userName, userMsg, lastTime, redPoint;
private ViewHolderOnClickListener listener;
private ImUserBean model;
public SystemMessageViewHolder(@NonNull View itemView) {
super(itemView);
avatarImage = itemView.findViewById(R.id.avatar);
userName = itemView.findViewById(R.id.name);
userMsg = itemView.findViewById(R.id.msg);
lastTime = itemView.findViewById(R.id.time);
redPoint = itemView.findViewById(R.id.red_point);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (null != listener) {
listener.onClick(v, model);
}
}
});
}
public interface ViewHolderOnClickListener {
void onClick(View view, ImUserBean model);
}
public void setViewHolderOnClickListener(ViewHolderOnClickListener listener, ImUserBean model) {
this.listener = listener;
this.model = model;
}
}

View File

@ -0,0 +1,171 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical"
android:paddingTop="20dp">
<TextView
android:id="@+id/top_noback"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="18dp"
android:text="@string/message"
android:textColor="#ff161616"
android:textSize="24sp"
android:textStyle="bold" />
<!-- <androidx.recyclerview.widget.RecyclerView-->
<!-- android:id="@+id/system_message_list"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="198dp" />-->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- 此容器用于动态放置 fragment-->
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<RelativeLayout
android:id="@+id/rt_main_tab"
android:layout_width="match_parent"
android:layout_height="71dp"
android:layout_alignParentBottom="true">
<ImageView
android:id="@+id/img_main_bg_tab"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true"
android:background="@mipmap/home_bar_bg" />
<RelativeLayout
android:id="@+id/bottom"
android:layout_width="match_parent"
android:layout_height="45dp"
android:layout_alignParentBottom="true">
<com.yunbao.common.custom.TabButtonGroup
android:id="@+id/tab_group"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<com.yunbao.common.custom.TabButton
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
app:tbn_checked="true"
app:tbn_icon_array_id="@array/main_tab_home"
app:tbn_icon_size="28dp"
app:tbn_text_color_checked="@color/colorAccent"
app:tbn_text_color_unchecked="@color/gray1"
app:tbn_text_size="11sp" />
<com.yunbao.common.custom.TabButton
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginRight="60dp"
android:layout_weight="1"
app:tbn_icon_array_id="@array/main_tab_video"
app:tbn_icon_size="28dp"
app:tbn_text_color_checked="@color/colorAccent"
app:tbn_text_color_unchecked="@color/gray1"
app:tbn_text_size="11sp" />
<com.yunbao.common.custom.TabButton
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
app:tbn_icon_array_id="@array/main_tab_list"
app:tbn_icon_size="28dp"
app:tbn_text_color_checked="@color/colorAccent"
app:tbn_text_color_unchecked="@color/gray1"
app:tbn_text_size="11sp" />
<com.yunbao.common.custom.TabButton
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
app:tbn_icon_array_id="@array/main_tab_chat"
app:tbn_icon_size="28dp"
app:tbn_text_color_checked="@color/colorAccent"
app:tbn_text_color_unchecked="@color/gray1"
app:tbn_text_size="11sp" />
</com.yunbao.common.custom.TabButtonGroup>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="right">
<TextView
android:id="@+id/v_table_redpoint"
android:layout_width="15dp"
android:layout_height="15dp"
android:textColor="@color/white"
android:textSize="8dp"
android:gravity="center"
android:background="@drawable/background_ff5075"
android:visibility="gone" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="right">
<View
android:id="@+id/v_table_redpoint_me"
android:layout_width="12dp"
android:layout_height="12dp"
android:layout_marginRight="18dp"
android:background="@drawable/background_ff5075"
android:visibility="gone" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
<ImageView
android:id="@+id/btn_start"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:onClick="mainClick"
android:src="@mipmap/icon_main_start" />
</RelativeLayout>
</RelativeLayout>
</LinearLayout>

View File

@ -0,0 +1,106 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/rc_background_main_color"
android:orientation="vertical">
<io.rong.imkit.widget.refresh.SmartRefreshLayout
android:id="@+id/rc_refresh"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@id/rc_extension"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rc_message_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:overScrollMode="never" />
</io.rong.imkit.widget.refresh.SmartRefreshLayout>
<TextView
android:id="@+id/rc_new_message_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="10dp"
android:layout_marginBottom="4dp"
android:background="@drawable/rc_conversation_newmsg"
android:gravity="center"
android:paddingBottom="5dp"
android:textColor="#ffffff"
android:textSize="12dp"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="@id/rc_refresh"
app:layout_constraintEnd_toEndOf="parent" />
<TextView
android:id="@+id/rc_unread_message_count"
android:layout_width="wrap_content"
android:layout_height="@dimen/rc_unread_height"
android:layout_marginStart="3dp"
android:layout_marginTop="@dimen/rc_margin_size_30"
android:layout_marginEnd="5dp"
android:background="@drawable/rc_selector_item_unread"
android:drawableStart="@drawable/rc_unread_msg_arrow"
android:drawablePadding="10dp"
android:gravity="center|left"
android:maxLines="1"
android:minWidth="120dp"
android:paddingStart="15dp"
android:paddingEnd="7dp"
android:textColor="@color/rc_text_main_color"
android:textSize="14sp"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="100条未读消息" />
<TextView
android:id="@+id/rc_mention_message_count"
android:layout_width="wrap_content"
android:layout_height="@dimen/rc_unread_height"
android:layout_marginStart="3dp"
android:layout_marginTop="@dimen/rc_margin_size_80"
android:layout_marginEnd="5dp"
android:background="@drawable/rc_selector_item_unread"
android:drawableStart="@drawable/rc_unread_msg_arrow"
android:drawablePadding="10dp"
android:gravity="center|left"
android:maxLines="1"
android:minWidth="120dp"
android:paddingStart="15dp"
android:paddingEnd="7dp"
android:text="@string/rc_mention_messages"
android:textColor="@color/rc_text_main_color"
android:textSize="14sp"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="100条@消息" />
<io.rong.imkit.conversation.extension.RongExtension
android:id="@+id/rc_extension"
android:layout_width="0dp"
app:RCStyle="CE"
android:layout_height="wrap_content"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/rc_refresh" />
<LinearLayout
android:id="@+id/rc_notification_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#660F0F0F"
android:orientation="vertical"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,134 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/rc_conversation_item"
android:layout_width="match_parent"
android:layout_height="@dimen/rc_conversation_item_height">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/rc_conversation_portrait_rl"
android:layout_width="54dp"
android:layout_height="54dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/rc_conversation_portrait"
android:layout_width="54dp"
android:layout_height="54dp"
android:scaleType="centerCrop" />
<RelativeLayout
android:id="@+id/rc_conversation_unread"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true">
<ImageView
android:id="@+id/rc_conversation_unread_bg"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_centerInParent="true"
app:srcCompat="@drawable/rc_unread_count_bg_normal" />
<TextView
android:id="@+id/rc_conversation_unread_count"
style="@style/TextStyle.Alignment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="15"
android:textColor="@color/rc_white_color"
android:textSize="@dimen/rc_font_auxiliary_size" />
</RelativeLayout>
</RelativeLayout>
<TextView
android:id="@+id/rc_conversation_title"
style="@style/TextStyle.Alignment"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/rc_margin_size_12"
android:layout_marginTop="@dimen/rc_margin_size_16"
android:layout_marginEnd="@dimen/rc_margin_size_12"
android:ellipsize="end"
android:singleLine="true"
android:text="张三"
android:textColor="@color/rc_text_main_color"
android:textSize="@dimen/rc_font_secondary_size"
app:layout_constraintEnd_toStartOf="@+id/rc_conversation_date"
app:layout_constraintStart_toEndOf="@+id/rc_conversation_portrait_rl"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/rc_conversation_content"
style="@style/TextStyle.Alignment"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginTop="4dp"
android:layout_marginEnd="60dp"
android:ellipsize="end"
android:singleLine="true"
android:text="你好,朋友!"
android:textColor="@color/rc_secondary_color"
android:textSize="@dimen/rc_font_text_third_size"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toEndOf="@+id/rc_conversation_portrait_rl"
app:layout_constraintTop_toBottomOf="@+id/rc_conversation_title" />
<TextView
android:id="@+id/rc_conversation_date"
style="@style/TextStyle.Alignment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/rc_margin_size_16"
android:layout_marginEnd="@dimen/rc_margin_size_12"
android:text="3 月 22 日"
android:textColor="@color/rc_auxiliary_color"
android:textSize="@dimen/rc_font_nav_or_date_size"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/rc_conversation_no_disturb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/rc_margin_size_12"
android:layout_marginBottom="@dimen/rc_margin_size_12"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:srcCompat="@drawable/rc_no_disturb" />
<ImageView
android:id="@+id/rc_conversation_read_receipt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/rc_margin_size_2"
android:layout_marginBottom="@dimen/rc_margin_size_12"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/rc_conversation_no_disturb"
app:layout_goneMarginRight="@dimen/rc_margin_size_12"
app:srcCompat="@drawable/rc_read_receipt" />
<View
android:layout_width="wrap_content"
android:layout_height="0.5dp"
android:layout_marginTop="71.5dp"
android:background="@color/rc_divider_color"
app:layout_constraintStart_toStartOf="@id/rc_conversation_title"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,115 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:visibility="gone"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/input_panel_add_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginEnd="4dp"
android:src="@drawable/rc_ext_input_panel_add"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/input_panel_voice_toggle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginBottom="6.5dp"
android:src="@drawable/rc_ext_toggle_voice"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toEndOf="@id/input_panel_add_btn"
android:orientation="horizontal">
<EditText
android:id="@+id/edit_btn"
style="@style/EditTextStyle.Alignment"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="6.5dp"
android:layout_marginEnd="5dp"
android:layout_marginBottom="6.5dp"
android:background="@drawable/rc_ext_panel_editbox_background"
android:maxLines="4"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/input_panel_emoji_btn"
app:layout_constraintStart_toEndOf="@+id/input_panel_voice_toggle"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/press_to_speech_btn"
style="@style/TextStyle.Alignment"
android:layout_width="wrap_content"
android:layout_height="@dimen/rc_ext_input_panel_editbox_height"
android:layout_marginStart="8dp"
android:layout_marginTop="6.5dp"
android:layout_marginEnd="5dp"
android:layout_marginBottom="6.5dp"
android:background="@drawable/rc_ext_voice_idle_button"
android:gravity="center"
android:text="@string/rc_voice_press_to_input"
android:textColor="@color/rc_text_main_color"
android:textSize="@dimen/rc_font_nav_or_date_size"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/input_panel_emoji_btn"
app:layout_constraintStart_toEndOf="@+id/input_panel_voice_toggle"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/input_panel_emoji_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="6.5dp"
android:layout_marginEnd="5dp"
android:layout_marginBottom="6.5dp"
android:src="@drawable/rc_ext_input_panel_emoji"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/input_panel_add_or_send"
app:layout_constraintTop_toTopOf="parent" />
<RelativeLayout
android:id="@+id/input_panel_add_or_send"
android:layout_width="41dp"
android:layout_height="wrap_content"
android:layout_marginTop="6.5dp"
android:layout_marginEnd="5dp"
android:layout_marginBottom="6.5dp"
android:layout_toEndOf="@id/edit_btn"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">
<Button
android:id="@+id/input_panel_send_btn"
android:layout_width="30dp"
android:layout_height="30dp"
android:background="@mipmap/btn_sand"
android:textSize="@dimen/rc_font_text_third_size"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</RelativeLayout>
</LinearLayout>
</RelativeLayout>

View File

@ -105,11 +105,14 @@
android:layout_weight="1"
android:gravity="right">
<View
<TextView
android:id="@+id/v_table_redpoint"
android:layout_width="12dp"
android:layout_height="12dp"
android:layout_width="15dp"
android:layout_height="15dp"
android:background="@drawable/background_ff5075"
android:gravity="center"
android:textColor="@color/white"
android:textSize="8dp"
android:visibility="gone" />
</LinearLayout>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/system_message_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>

View File

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="72dp">
<com.makeramen.roundedimageview.RoundedImageView
android:id="@+id/avatar"
android:layout_width="54dp"
android:layout_height="54dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:scaleType="centerCrop"
app:riv_oval="true" />
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="9dp"
android:layout_toRightOf="@id/avatar"
android:ellipsize="end"
android:singleLine="true"
android:text="dasdas"
android:textColor="@color/textColor"
android:textSize="16sp" />
<TextView
android:id="@+id/msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/name"
android:layout_marginTop="2dp"
android:layout_marginRight="80dp"
android:layout_toRightOf="@id/avatar"
android:ellipsize="end"
android:singleLine="true"
android:text="dasd "
android:textColor="@color/gray3"
android:textSize="14sp" />
<TextView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/name"
android:layout_alignParentRight="true"
android:layout_marginTop="3dp"
android:layout_marginRight="15dp"
android:text="dasdas "
android:textColor="@color/gray3"
android:textSize="12sp" />
<TextView
android:id="@+id/red_point"
android:layout_width="20dp"
android:layout_height="15dp"
android:layout_below="@id/time"
android:layout_alignParentRight="true"
android:layout_marginTop="5dp"
android:layout_marginRight="10dp"
android:background="@drawable/background_ff50715"
android:gravity="center"
android:includeFontPadding="false"
android:minWidth="14dp"
android:paddingLeft="3dp"
android:paddingRight="3dp"
android:textColor="#fff"
android:textSize="12sp"
android:visibility="invisible" />
</RelativeLayout>

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 取消界面转场动画使用-->
  <style name="noAnimationStyle" parent="AppTheme">
    <item name="android:windowAnimationStyle">@style/Animation</item>
  </style>
  <style name="Animation">
    <item name="android:activityOpenEnterAnimation">@null</item>
    <item name="android:activityOpenExitAnimation">@null</item>
    <item name="android:activityCloseEnterAnimation">@null</item>
    <item name="android:activityCloseExitAnimation">@null</item>
    <item name="android:taskOpenEnterAnimation">@null</item>
    <item name="android:taskOpenExitAnimation">@null</item>
    <item name="android:taskCloseEnterAnimation">@null</item>
    <item name="android:taskCloseExitAnimation">@null</item>
    <item name="android:taskToFrontEnterAnimation">@null</item>
    <item name="android:taskToFrontExitAnimation">@null</item>
    <item name="android:taskToBackEnterAnimation">@null</item>
    <item name="android:taskToBackExitAnimation">@null</item>
  </style>
</resources>