Commit b303a9d6 authored by jianglx's avatar jianglx

Im添加好友的继续开发。

parent 21228e69
......@@ -57,8 +57,9 @@
android:launchMode="singleTask"
android:screenOrientation="portrait" />
<activity android:name=".AddressListActivity" />
<activity android:name=".AddFriendActivity" />
<activity android:name=".NewFriendActivity"></activity>
<activity android:name=".friend.AddFriendActivity" />
<activity android:name=".friend.NewFriendActivity" />
<activity android:name=".UserDetailActivity"></activity>
</application>
</manifest>
\ No newline at end of file
......@@ -13,7 +13,11 @@ import com.rv.component.utils.CacheEnum;
import com.rv.component.utils.RvCache;
import com.rv.im.adapter.AddressListAdapter;
import com.rv.im.bean.ContactsBean;
import com.rv.im.db.table.ChatMessage;
import com.rv.im.friend.NewFriendActivity;
import com.rv.im.presenter.AddressPresenter;
import com.rv.im.xmpp.ListenerManager;
import com.rv.im.xmpp.listener.NewFriendListener;
import java.util.ArrayList;
import java.util.Collections;
......@@ -24,7 +28,7 @@ import java.util.List;
* 通讯录
*
*/
public class AddressListActivity extends BaseStatusActivity<AddressPresenter> {
public class AddressListActivity extends BaseStatusActivity<AddressPresenter> implements NewFriendListener {
private RecyclerView recyclerView;
......@@ -36,6 +40,13 @@ public class AddressListActivity extends BaseStatusActivity<AddressPresenter> {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ListenerManager.getInstance().addNewFriendListener(this);
}
@Override
public void onDestroy() {
super.onDestroy();
ListenerManager.getInstance().removeNewFriendListener(this);
}
@Override
......@@ -63,10 +74,11 @@ public class AddressListActivity extends BaseStatusActivity<AddressPresenter> {
} else if (position == 1) {
} else if (position == 2) {
in = new Intent(AddressListActivity.this,NewFriendActivity.class) ;
in = new Intent(AddressListActivity.this, NewFriendActivity.class);
startActivity(in);
} else {
in = ChatActivity.getIntent(this, bean.getToUserId(), bean.getToNickname(), 0);
startActivity(in);
}
});
recyclerView.setAdapter(adapter);
......@@ -96,4 +108,14 @@ public class AddressListActivity extends BaseStatusActivity<AddressPresenter> {
break;
}
}
@Override
public void onNewFriendSendStateChange(String toUserId, ChatMessage message, int messageState) {
//
}
@Override
public boolean onNewFriend(ChatMessage message) {
return false;
}
}
......@@ -46,6 +46,8 @@ public class ChatHolderFactory {
} else {
type = ChatHolderTypeEnum.VIEW_FROM_VIDEO;
}
}else if(message.getMessageType() == MessageTypeEnum.PASS.getType()){
type = ChatHolderTypeEnum.VIEW_ADD_FRIEND_SUCCESS ;
}
}
if (type != null)
......
......@@ -23,7 +23,12 @@ public enum ChatHolderTypeEnum {
// 视频消息
VIEW_FROM_VIDEO(60),
VIEW_TO_VIDEO(61);
VIEW_TO_VIDEO(61),
// 添加好友 这一块
VIEW_ADD_FRIEND_SUCCESS(70) ;
private int id;
......
......@@ -8,16 +8,13 @@ import android.os.IBinder;
import android.text.TextUtils;
import android.util.Log;
import com.google.gson.Gson;
import com.lzy.okgo.callback.StringCallback;
import com.lzy.okgo.model.Response;
import com.lzy.okgo.utils.HttpUtils;
import com.ruiwenliu.wrapper.MessageEventRemoteLogin;
import com.rv.component.utils.AppCookie;
import com.rv.component.utils.CacheEnum;
import com.rv.component.utils.RvCache;
import com.rv.im.bean.LastChatHistoryListBean;
import com.rv.im.broadcast.MessageReceiver;
import com.rv.im.receiver.MessageReceiver;
import com.rv.im.db.table.ChatMessage;
import com.rv.im.enums.CallTypeEnum;
import com.rv.im.listener.AbstractMsgListener;
......@@ -36,7 +33,6 @@ import org.greenrobot.eventbus.EventBus;
import org.jivesoftware.smack.XMPPConnection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
......@@ -316,7 +312,7 @@ public class ImService extends Service {
* 先添加一个等待接收回执的消息
* 然后再发送这条消息
*/
mReceiptManager.addWillSendMessage(toUserId, chatMessage, ReceiptManager.SendType.NORMAL, chatMessage.getContent());
mReceiptManager.addWillSendMessage(toUserId, chatMessage, chatMessage.getContent());
mXChatManager.sendMessage(toUserId, chatMessage);
}
}
......
package com.rv.im;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;
import com.ruiwenliu.wrapper.base.BaseBean;
import com.ruiwenliu.wrapper.base.BaseStatusActivity;
import com.ruiwenliu.wrapper.weight.TitleView;
import com.rv.im.presenter.NewFriendPresenter;
/*********
*
* 新朋友activity
*
*/
public class NewFriendActivity extends BaseStatusActivity<NewFriendPresenter> {
private LinearLayout llSearch;
@Override
public void onShowResult(int requestType, BaseBean result) {
}
@Override
protected int setLayout() {
return R.layout.activity_new_friend;
}
@Override
protected void initView(Bundle savedInstanceState, TitleView titleView, Intent intent) {
titleView.setTitle("新的朋友");
llSearch = findViewById(R.id.ll_search);
llSearch.setOnClickListener(v -> {
Intent in = new Intent(NewFriendActivity.this, AddFriendActivity.class);
startActivityForResult(in, 1);
});
}
}
package com.rv.im;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.Button;
import android.widget.TextView;
import com.ruiwenliu.wrapper.base.BaseBean;
import com.ruiwenliu.wrapper.base.BaseStatusActivity;
import com.ruiwenliu.wrapper.weight.TitleView;
import com.rv.im.bean.UserDetailBean;
import com.rv.im.db.service.FriendServiceImp;
import com.rv.im.presenter.UserDetailPresenter;
import com.rv.im.view.RoundImageView;
public class UserDetailActivity extends BaseStatusActivity<UserDetailPresenter> {
private static final String KEY_USER_ID = "userId";
private String userId;
private String mLoginUserId;
private RoundImageView avatarImg;
private TextView nameTv;
private TextView renameTv;
private TextView sexTv;
private TextView birthdayTv;
private TextView cityText;
private TextView phoneTv;
private TextView onlineTv;
private Button btnNextStep;
public static void start(Context ctx, String userId) {
Intent intent = new Intent(ctx, UserDetailActivity.class);
Bundle bundle = new Bundle();
bundle.putString(KEY_USER_ID, userId);
intent.putExtras(bundle);
ctx.startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected int setLayout() {
return R.layout.activity_user_detail;
}
@Override
protected void initView(Bundle savedInstanceState, TitleView titleView, Intent intent) {
titleView.setTitle("基本信息");
initWeight();
}
@Override
protected void loadData(Bundle savedInstanceState, Intent intent) {
super.loadData(savedInstanceState, intent);
if (intent != null) {
userId = intent.getStringExtra(KEY_USER_ID);
}
mLoginUserId = ImSetting.getUserId();
if (TextUtils.isEmpty(userId)) {
userId = mLoginUserId;
}
mPresenter.loadOtherInfoFromNet(userId);
}
private void initWeight() {
nameTv = findViewById(R.id.name_tv);
avatarImg = findViewById(R.id.avatar_img);
renameTv = findViewById(R.id.rename_tv);
sexTv = findViewById(R.id.sex_tv);
birthdayTv = findViewById(R.id.birthday_tv);
cityText = findViewById(R.id.city_text);
phoneTv = findViewById(R.id.phone_tv);
onlineTv = findViewById(R.id.online_tv);
btnNextStep = findViewById(R.id.next_step_btn);
}
@Override
public void onShowResult(int requestType, BaseBean result) {
switch (requestType) {
case 0:
if (result != null && result.resultCode == 1) {
UserDetailBean userDetailBean = (UserDetailBean) result;
updateUi();
}
break;
}
}
private void updateUi() {
}
}
package com.rv.im.adapter;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.view.View;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.rv.im.R;
import com.rv.im.db.table.Friend;
import java.util.List;
public class AddRecordListAdapter extends BaseQuickAdapter<Friend, BaseViewHolder> {
private FriendItemClickListener listener;
public AddRecordListAdapter(@Nullable List<Friend> data) {
super(R.layout.item_add_record, data);
}
public void setListener(FriendItemClickListener listener) {
this.listener = listener;
}
@Override
protected void convert(BaseViewHolder helper, Friend item) {
if (item == null) return;
/********
* 1 等待验证 ,添加成功
* 2 同意,已同意,已拒绝
*/
helper.setImageResource(R.id.img_header, R.drawable.icon_lion);
helper.setText(R.id.tv_name, TextUtils.isEmpty(item.getUserName()) ? " " : item.getUserName());
helper.setOnClickListener(R.id.ll_content, v -> {
if (listener != null) {
listener.showDetail(item);
}
});
if (item.getStatus() == Friend.STATUS_10) {
helper.itemView.findViewById(R.id.btn_add).setVisibility(View.GONE);
helper.itemView.findViewById(R.id.text_add_status).setVisibility(View.VISIBLE);
if (!TextUtils.isEmpty(item.getAction())) {
helper.setText(R.id.text_add_status, item.getAction());
}
} else if(item.getStatus() == Friend.STATUS_11){
helper.itemView.findViewById(R.id.btn_add).setVisibility(View.VISIBLE);
helper.itemView.findViewById(R.id.text_add_status).setVisibility(View.GONE);
if (!TextUtils.isEmpty(item.getAction())) {
helper.setText(R.id.btn_add, item.getAction());
}
} else if(item.getStatus() == Friend.STATUS_12){
helper.itemView.findViewById(R.id.btn_add).setVisibility(View.GONE);
helper.itemView.findViewById(R.id.text_add_status).setVisibility(View.VISIBLE);
if (!TextUtils.isEmpty(item.getAction())) {
helper.setText(R.id.text_add_status, item.getAction());
}
}else if(item.getStatus() == Friend.STATUS_13){
helper.itemView.findViewById(R.id.btn_add).setVisibility(View.GONE);
helper.itemView.findViewById(R.id.text_add_status).setVisibility(View.VISIBLE);
if (!TextUtils.isEmpty(item.getAction())) {
helper.setText(R.id.text_add_status, item.getAction());
}
}
helper.setOnClickListener(R.id.btn_add, v -> {
if (listener != null) {
listener.agree(item);
}
});
}
public interface FriendItemClickListener {
void showDetail(Friend item);
void agree(Friend item);
}
}
......@@ -3,13 +3,13 @@ package com.rv.im.adapter;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.ruiwenliu.wrapper.util.glide.GlideManager;
import com.rv.im.R;
import com.rv.im.bean.ContactsBean;
import com.rv.im.util.sortlist.PingYinUtil;
import java.util.List;
......@@ -18,7 +18,7 @@ public class AddressListAdapter extends BaseQuickAdapter<ContactsBean.ContactIte
private boolean needShowNavigation = true;
private char lastNavigation;
private char lastNavigation = 'A';
public AddressListAdapter(@Nullable List<ContactsBean.ContactItemBean> data) {
super(R.layout.item_address_list, data);
......@@ -40,8 +40,19 @@ public class AddressListAdapter extends BaseQuickAdapter<ContactsBean.ContactIte
helper.setImageResource(R.id.img_header, item.getLocalHead());
}
} else {
String navigation = PingYinUtil.getPingYin(item.getToNickname());
if (!TextUtils.isEmpty(navigation) && navigation.charAt(0) == lastNavigation) {
needShowNavigation = false;
} else {
if (!TextUtils.isEmpty(navigation)) {
lastNavigation = navigation.charAt(0);
}
needShowNavigation = true;
}
if (needShowNavigation) {
helper.itemView.findViewById(R.id.ll_navigation).setVisibility(View.VISIBLE);
helper.setText(R.id.tv_character, TextUtils.isEmpty(navigation) ? "" : String.valueOf(navigation.charAt(0)));
} else {
helper.itemView.findViewById(R.id.ll_navigation).setVisibility(View.GONE);
}
......
......@@ -103,6 +103,8 @@ public class ChatContentAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
return new MsgFromVideoCallHolder(LayoutInflater.from(mContext).inflate(R.layout.chat_from_item_video_call, viewGroup, false));
case 61:
return new MsgToVideoCallHolder(LayoutInflater.from(mContext).inflate(R.layout.chat_to_item_video_call, viewGroup, false));
case 70:
return new MsgBeFriendHolder(LayoutInflater.from(mContext).inflate(R.layout.chat_be_friend, viewGroup, false)) ;
}
return null;
}
......@@ -135,6 +137,8 @@ public class ChatContentAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
setFromVideoCallContentView(bean, (MsgFromVideoCallHolder) viewHolder);
} else if (viewHolder instanceof MsgToVideoCallHolder) {
setToVideoCallContentView(bean, (MsgToVideoCallHolder) viewHolder);
}else if(viewHolder instanceof MsgBeFriendHolder){
setBeFriendContentView(bean, (MsgBeFriendHolder) viewHolder);
}
}
}
......@@ -198,6 +202,10 @@ public class ChatContentAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
}
}
private void setBeFriendContentView(ChatMessage bean, MsgBeFriendHolder holder){
showTime(holder.tvTime, bean);
}
private void setToTextContentView(ChatMessage bean, MsgToTextHolder holder) {
showTime(holder.tvSendTime, bean);
holder.chatText.setText(parser.addSmileySpans(deleteHtml(bean.getContent()), true));
......@@ -508,6 +516,15 @@ public class ChatContentAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
}
}
class MsgBeFriendHolder extends RecyclerView.ViewHolder{
TextView tvTime;
public MsgBeFriendHolder(@NonNull View itemView) {
super(itemView);
tvTime = itemView.findViewById(R.id.tv_time);
}
}
class MsgFromTextHolder extends RecyclerView.ViewHolder {
TextView tvSendTime;
RoundImageView ivHeader;
......
......@@ -3,6 +3,8 @@ package com.rv.im.adapter;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.chad.library.adapter.base.BaseQuickAdapter;
......@@ -32,8 +34,9 @@ public class FriendSearchListAdapter extends BaseQuickAdapter<FriendSearchBean.F
helper.setImageResource(R.id.img_header, R.drawable.icon_lion);
helper.setText(R.id.tv_name, TextUtils.isEmpty(item.getNickname()) ? " " : item.getNickname());
helper.itemView.setOnClickListener(v -> {
// 显示
LinearLayout llContent = helper.itemView.findViewById(R.id.ll_content) ;
llContent.setOnClickListener(v -> {
if (listener != null) {
listener.showDetail(item);
}
......
package com.rv.im.base;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import com.rv.im.util.SkinUtils;
public abstract class BaseActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
setStatusBarColor();
super.onCreate(savedInstanceState);
setContentView(getLayout());
initView();
getData();
setActionBar();
}
public abstract int getLayout();
public abstract void initView();
public abstract void getData();
protected void setActionBar() {
if (getSupportActionBar() != null) { // 因为有的activity没有actionBar,所以加个判断
SkinUtils.Skin skin = SkinUtils.getSkin(this);
getSupportActionBar().setBackgroundDrawable(new ColorDrawable(skin.getPrimaryColor()));
if (Build.VERSION.SDK_INT >= 21) {//兼容5.0 去除actionbar阴影
getSupportActionBar().setElevation(0);
}
}
}
/**
* 沉浸式状态栏
*/
private void setStatusBarColor() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// >=5.0 背景为全透明
/* >=5.0,this method(getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS));
in some phone is half-transparent like vivo、nexus6p..
in some phone is full-transparent
so ...*/
Window window = getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// 4.4背景为渐变半透明
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
}
package com.rv.im.bean;
import com.google.gson.annotations.SerializedName;
public class AttentionUser {
private int blacklist; // 0 表示不是黑名单,1表示是在黑名单
private int isBeenBlack;// 1表示对方将我拉入黑名单
private int status;
private String userId;// 发起关注的人
private String toUserId;// 被关注的人
private int toUserType;// 2 公众号
@SerializedName("toNickname")
private String toNickName;
private String remarkName;
private String describe;
private int offlineNoPushMsg;// 消息免打扰
private double chatRecordTimeOut;//0 || -1 消息永久保存 单位:day
private int createTime;
private int modifyTime;// 修改时间
private int groupId;// 分组Id
private String groupName;// 分组名称
private int companyId;
public int getBlacklist() {
return blacklist;
}
public void setBlacklist(int blacklist) {
this.blacklist = blacklist;
}
public int getIsBeenBlack() {
return isBeenBlack;
}
public void setIsBeenBlack(int isBeenBlack) {
this.isBeenBlack = isBeenBlack;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getToUserId() {
return toUserId;
}
public void setToUserId(String toUserId) {
this.toUserId = toUserId;
}
public int getToUserType() {
return toUserType;
}
public void setToUserType(int toUserType) {
this.toUserType = toUserType;
}
public String getToNickName() {
return toNickName;
}
public void setToNickName(String toNickName) {
this.toNickName = toNickName;
}
public String getRemarkName() {
return remarkName;
}
public void setRemarkName(String remarkName) {
this.remarkName = remarkName;
}
public int getOfflineNoPushMsg() {
return offlineNoPushMsg;
}
public void setOfflineNoPushMsg(int offlineNoPushMsg) {
this.offlineNoPushMsg = offlineNoPushMsg;
}
public double getChatRecordTimeOut() {
return chatRecordTimeOut;
}
public void setChatRecordTimeOut(double chatRecordTimeOut) {
this.chatRecordTimeOut = chatRecordTimeOut;
}
public int getCreateTime() {
return createTime;
}
public void setCreateTime(int createTime) {
this.createTime = createTime;
}
public int getModifyTime() {
return modifyTime;
}
public void setModifyTime(int modifyTime) {
this.modifyTime = modifyTime;
}
public int getGroupId() {
return groupId;
}
public void setGroupId(int groupId) {
this.groupId = groupId;
}
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
public int getCompanyId() {
return companyId;
}
public void setCompanyId(int companyId) {
this.companyId = companyId;
}
public String getDescribe() {
return describe;
}
public void setDescribe(String describe) {
this.describe = describe;
}
}
......@@ -6,4 +6,5 @@ public class ImBaseBean extends BaseBean {
public transient int status;
public transient String message;
public String resultMsg ;
}
This diff is collapsed.
......@@ -94,6 +94,32 @@ public class FriendDao {
}
}
/*******
*
* 查询好友列表
*
* @return
*/
public List<Friend> getFriendList() {
if (dao == null) {
LogUtil.e(TAG, "dao is null");
return null;
}
List<Friend> friendList = null;
try {
friendList = dao.queryBuilder().where().eq("status", Friend.STATUS_10)
.or().eq("status", Friend.STATUS_11)
.or().eq("status", Friend.STATUS_12)
.or().eq("status", Friend.STATUS_13)
.or().eq("status", Friend.STATUS_21)
.or().eq("status", Friend.STATUS_22)
.query();
} catch (SQLException e) {
e.printStackTrace();
}
return friendList;
}
/*****
* 更新消息
* @param friend
......
......@@ -2,20 +2,44 @@ package com.rv.im.db.service;
import android.content.Context;
import com.rv.im.db.dao.ConversationDao;
import com.rv.im.db.dao.FriendDao;
import com.rv.im.db.dao.MessageDao;
import com.rv.im.db.table.Friend;
import java.util.List;
public class FriendServiceImp implements IFriendService {
private FriendDao dao = null;
public FriendServiceImp(Context context) {
private static FriendServiceImp instance = null ;
private FriendServiceImp(Context context) {
dao = FriendDao.getInstance(context);
}
public static FriendServiceImp getInstance(Context context) {
if (instance == null) {
instance = new FriendServiceImp(context.getApplicationContext());
}
return instance;
}
@Override
public void addMessage(Friend friend) {
dao.addMessage(friend);
}
@Override
public List<Friend> getAllFriends() {
return dao.getFriendList();
}
@Override
public Friend getFriend(String user) {
return null;
}
}
......@@ -2,14 +2,22 @@ package com.rv.im.db.service;
import com.rv.im.db.table.Friend;
import java.util.List;
/*******
*
* 好友操作服务
*/
public interface IFriendService {
void addMessage(Friend friend) ;
List<Friend> getAllFriends();
/*****
* 根据userId 获取朋友信息
* @param user
* @return
*/
Friend getFriend(String user) ;
}
......@@ -7,18 +7,44 @@ import com.j256.ormlite.table.DatabaseTable;
@DatabaseTable(tableName = "tb_friend")
public class Friend {
// -1:黑名单;0:陌生人;1:单方关注;2:互为好友;8:显示系统号;9:非显示系统号
public static final int STATUS_BLACKLIST = -1;// 黑名单
public static final int STATUS_UNKNOW = 0;// 陌生人(不可能出现在好友表,只可能在新朋友消息表)
public static final int STATUS_ATTENTION = 1;// 关注
public static final int STATUS_FRIEND = 2;// 好友
public static final int STATUS_SYSTEM = 8;// 显示系统号
// 需要验证的
public static final int STATUS_10 = 10; //显示 等待验证
public static final int STATUS_11 = 11; //您好
public static final int STATUS_12 = 12; //已通过验证
public static final int STATUS_13 = 13; //验证被通过了
public static final int STATUS_14 = 14; //别人回话
public static final int STATUS_15 = 15; //回话
public static final int STATUS_16 = 16; //已删除了XXX
public static final int STATUS_17 = 17; //XXX删除了我
public static final int STATUS_18 = 18; //已拉黑了XXX
public static final int STATUS_19 = 19; //XXX拉黑了我
public static final int STATUS_20 = 20; //默认值什么都不显示
// 不需要验证的
public static final int STATUS_21 = 21;//XXX 添加你为好友
public static final int STATUS_22 = 22;//你添加好友 XXX
public static final int STATUS_24 = 24;//XXX 已经取消了黑名单
public static final int STATUS_23 = 23;//对方把我加入了黑名单
public static final int STATUS_25 = 25;//通过手机联系人添加
public static final int STATUS_26 = 26;//被后台删除的好友,仅用于新的朋友页面显示,
@DatabaseField(columnName = "_id", dataType = DataType.INTEGER, generatedId = true)
private int id;
@DatabaseField(columnName = "userId")
private String userId;
@DatabaseField(columnName = "userName")
private String userName;
@DatabaseField(columnName = "sender")
private String sender ; // 添加好友发起者
@DatabaseField(columnName = "action")
private String action ;
@DatabaseField(columnName = "timeCreate")
private long timeCreate ; // 发起时间
@DatabaseField
private int status ;// -1:黑名单;0:陌生人;1:单方关注;2:互为好友;8:系统号;9:非显示系统号
private int status ;// -1:黑名单;0:陌生人;1:发卡了i;2:互为好友;3 拒绝 ;8:系统号;9:非显示系统号
@DatabaseField
private String privacy;// 隐私
......@@ -63,12 +89,12 @@ public class Friend {
this.userName = userName;
}
public String getSender() {
return sender;
public String getAction() {
return action;
}
public void setSender(String sender) {
this.sender = sender;
public void setAction(String action) {
this.action = action;
}
public long getTimeCreate() {
......
......@@ -13,9 +13,14 @@ public enum MessageTypeEnum {
CANCEL(7, "撤销"),
PING(8, "ping"),
HELLO(9,"hello") ,
ADD_SUCCESS(10,"add_success") ;
HELLO(500,"打招呼") ,
PASS(501,"同意加好友") ,
FEEBACK(502,"回话"),
DELETE_FRIEND(505,"删除好友"),
BE_BLACK(507,"黑名单"),
BE_FRIEND(508,"直接成为好友") ,
BLACK_REFUSED(509,"取消黑名单");
private int type;
private String name;
......
package com.rv.im.friend;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.LinearLayout;
import com.ruiwenliu.wrapper.base.BaseBean;
import com.ruiwenliu.wrapper.base.BaseStatusActivity;
import com.ruiwenliu.wrapper.weight.TitleView;
import com.rv.im.R;
import com.rv.im.adapter.AddRecordListAdapter;
import com.rv.im.db.service.FriendServiceImp;
import com.rv.im.db.table.ChatMessage;
import com.rv.im.db.table.Friend;
import com.rv.im.presenter.NewFriendPresenter;
import com.rv.im.xmpp.ListenerManager;
import com.rv.im.xmpp.listener.NewFriendListener;
import java.util.Collections;
import java.util.List;
/*********
*
* 新朋友activity
*
*/
public class NewFriendActivity extends BaseStatusActivity<NewFriendPresenter> implements NewFriendListener {
private static final int REQUEST_CODE_SEARCH_FRIEND = 10000;
private LinearLayout llSearch;
private RecyclerView recyclerView;
private AddRecordListAdapter listAdapter;
private List<Friend> addFriendRecords;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ListenerManager.getInstance().addNewFriendListener(this);
}
@Override
public void onShowResult(int requestType, BaseBean result) {
}
@Override
public void onShowError(String errorMsg, int errorType) {
super.onShowError(errorMsg, errorType);
}
@Override
protected int setLayout() {
return R.layout.activity_new_friend;
}
@Override
protected void initView(Bundle savedInstanceState, TitleView titleView, Intent intent) {
titleView.setTitle("新的朋友");
llSearch = findViewById(R.id.ll_search);
llSearch.setOnClickListener(v -> {
Intent in = new Intent(NewFriendActivity.this, AddFriendActivity.class);
startActivityForResult(in, REQUEST_CODE_SEARCH_FRIEND);
});
recyclerView = findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayout.VERTICAL, false));
listAdapter = new AddRecordListAdapter(null);
listAdapter.setListener(listener);
recyclerView.setAdapter(listAdapter);
}
@Override
protected void loadData(Bundle savedInstanceState, Intent intent) {
super.loadData(savedInstanceState, intent);
getAddRecord();
}
private void getAddRecord() {
addFriendRecords = FriendServiceImp.getInstance(this).getAllFriends();
Collections.sort(addFriendRecords, (o1, o2) -> (int) (-o1.getTimeCreate() + o2.getTimeCreate()));
if (addFriendRecords != null) {
listAdapter.setNewData(addFriendRecords);
}
}
@Override
public void onNewFriendSendStateChange(String toUserId, ChatMessage message, int messageState) {
}
@Override
public boolean onNewFriend(ChatMessage message) {
getAddRecord();
return false;
}
@Override
public void onDestroy() {
super.onDestroy();
ListenerManager.getInstance().removeNewFriendListener(this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_SEARCH_FRIEND) {
getAddRecord();
}
}
private Friend agreeFriend;
private AddRecordListAdapter.FriendItemClickListener listener = new AddRecordListAdapter.FriendItemClickListener() {
@Override
public void showDetail(Friend item) {
}
@Override
public void agree(Friend item) {
agreeFriend = item;
mPresenter.doAgreeOrAttention(agreeFriend);
}
};
}
......@@ -14,7 +14,6 @@ import com.rv.im.bean.AddResultBean;
import com.rv.im.bean.FriendSearchBean;
import com.rv.im.db.table.ChatMessage;
import com.rv.im.db.table.Friend;
import com.rv.im.enums.MessageStatusEnum;
import com.rv.im.enums.MessageTypeEnum;
import java.util.HashMap;
......@@ -59,7 +58,7 @@ public class AddFriendPresenter extends CommonPresenter {
}
// 打招呼
public void doSayHello(String text,String toUserName,String toUserId ) {
public ChatMessage doSayHello(String text,String toUserName,String toUserId ) {
if (TextUtils.isEmpty(text)) {
text = "HEY-HELLO";
}
......@@ -68,13 +67,13 @@ public class AddFriendPresenter extends CommonPresenter {
message.setToUserName(toUserName);
message.setToUserId(toUserId);
message.setContent(text);
sendMessage(message);
return sendMessage(message);
}
public ChatMessage doSayAddFriend(String toUserName,String toUserId ){
ChatMessage message = new ChatMessage();
message.setMessageType(MessageTypeEnum.ADD_SUCCESS);
message.setMessageType(MessageTypeEnum.BE_FRIEND);
message.setToUserName(toUserName);
message.setToUserId(toUserId);
message.setContent("be friend");
......@@ -84,8 +83,8 @@ public class AddFriendPresenter extends CommonPresenter {
private ChatMessage sendMessage(ChatMessage message) {
message.setFromUserId(message.getFromUserId());
message.setFromUserName(message.getFromUserName());
message.setFromUserId(ImSetting.getUserId());
message.setFromUserName(ImSetting.getUserName());
message.setRead(true);
message.setFromId("android");
message.setPackId(UUID.randomUUID().toString().replaceAll("-", ""));
......@@ -108,7 +107,14 @@ public class AddFriendPresenter extends CommonPresenter {
Friend friend = new Friend();
friend.setUserId(userId);
friend.setUserName(userName);
friend.setSender(ImSetting.getUserId());
if(status == MessageTypeEnum.HELLO.getType()){
friend.setAction("等待验证");
friend.setStatus(Friend.STATUS_10);
}else if(status == MessageTypeEnum.BE_FRIEND.getType()){
friend.setAction("添加成功");
friend.setStatus(Friend.STATUS_22);
}
friend.setRead(true);
friend.setStatus(status);
friend.setTimeCreate(System.currentTimeMillis());
......
package com.rv.im.presenter;
import android.content.Intent;
import android.text.TextUtils;
import com.google.gson.Gson;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.AbsCallback;
import com.lzy.okgo.model.Response;
import com.ruiwenliu.wrapper.base.BaseBean;
import com.ruiwenliu.wrapper.base.BaseStatusActivity;
import com.ruiwenliu.wrapper.base.presenter.CommonPresenter;
import com.rv.component.utils.CacheEnum;
import com.rv.component.utils.RvCache;
import com.rv.im.AppConfig;
import com.rv.im.Constants;
import com.rv.im.ImSetting;
import com.rv.im.bean.ImBaseBean;
import com.rv.im.db.service.FriendServiceImp;
import com.rv.im.db.table.ChatMessage;
import com.rv.im.db.table.Friend;
import com.rv.im.enums.MessageTypeEnum;
import java.io.IOException;
import java.util.HashMap;
import java.util.UUID;
import okhttp3.OkHttpClient;
import okhttp3.ResponseBody;
public class NewFriendPresenter extends CommonPresenter {
// 同意添加好友的请求
public ChatMessage doAgree(String toUserName, String toUserId) {
ChatMessage message = new ChatMessage();
message.setMessageType(MessageTypeEnum.PASS);
message.setToUserName(toUserName);
message.setToUserId(toUserId);
message.setContent("同意");
return sendMessage(message);
}
private ChatMessage sendMessage(ChatMessage message) {
message.setFromUserId(ImSetting.getUserId());
message.setFromUserName(ImSetting.getUserName());
message.setRead(true);
message.setFromId("android");
message.setPackId(UUID.randomUUID().toString().replaceAll("-", ""));
message.setTimeSend(System.currentTimeMillis());
sendMsgBroad(message);
return message;
}
public void sendMsgBroad(ChatMessage message) {
Intent intent = new Intent();
intent.setAction(Constants.ACTIONS.ACTION_SEND_RECEIVER);
intent.setPackage(getPresenterContext().getPackageName());
intent.putExtra(Constants.KEYS.KEY_MESSAGE_TARGET, message.getToUserId());
intent.putExtra(Constants.KEYS.KEY_MESSAGE_CONTENT, message.toJsonString());
getPresenterContext().sendBroadcast(intent);
}
/**
* 同意别人的加好友
*/
public void doAgreeOrAttention(final Friend item) {
AppConfig appConfig = (AppConfig) RvCache.getInstance().get(CacheEnum.IM_CONFIG);
if (appConfig == null) return;
StringBuffer buffer = new StringBuffer();
buffer.append(appConfig.Add_friends).append("?").append("access_token=").append(ImSetting.getImToken()).append("&toUserId=").append(item.getUserId());
OkGo.<String>get(buffer.toString())
.execute(new AbsCallback<String>() {
@Override
public void onSuccess(Response<String> response) {
okhttp3.Response rawResponse = response.getRawResponse();
ResponseBody responseBody = rawResponse.body();
String data = null;
try {
data = responseBody.string();
} catch (IOException e) {
e.printStackTrace();
}
if (!TextUtils.isEmpty(data)) {
ImBaseBean bean = new Gson().fromJson(data, ImBaseBean.class);
if (bean != null && bean.resultCode == 1) {
((BaseStatusActivity) getPresenterContext()).showToast("已同意");
doAgree(item.getUserName(), item.getUserId());
item.setStatus(Friend.STATUS_12);
FriendServiceImp.getInstance(getPresenterContext()).addMessage(item);
} else if (bean != null) {
((BaseStatusActivity) getPresenterContext()).showToast(bean.resultMsg);
if(bean.resultCode == 100512){
item.setStatus(2);
FriendServiceImp.getInstance(getPresenterContext()).addMessage(item);
}
}
}
}
@Override
public String convertResponse(okhttp3.Response response) {
return null;
}
});
}
}
package com.rv.im.presenter;
import com.ruiwenliu.wrapper.base.presenter.CommonPresenter;
import com.rv.component.utils.CacheEnum;
import com.rv.component.utils.RvCache;
import com.rv.im.AppConfig;
import com.rv.im.ImSetting;
import com.rv.im.bean.ImBaseBean;
import com.rv.im.bean.UserDetailBean;
import java.util.HashMap;
import java.util.Map;
public class UserDetailPresenter extends CommonPresenter {
public void loadOtherInfoFromNet(String mUserId){
AppConfig appConfig = (AppConfig) RvCache.getInstance().get(CacheEnum.IM_CONFIG);
if (appConfig == null) return;
Map<String, String> params = new HashMap<>();
params.put("access_token", ImSetting.getImToken());
params.put("userId", mUserId);
getData(0,appConfig.USER_GET_URL,UserDetailBean.class,params,true);
}
}
package com.rv.im.broadcast;
package com.rv.im.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
......
package com.rv.im.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.widget.Toast;
import com.rv.im.util.NetworkUtil;
import java.util.ArrayList;
import java.util.List;
public class NetWorkReceiver extends BroadcastReceiver {
private List<NetChangListener> listeners = new ArrayList<>();
private static NetWorkReceiver instance = null;
private NetWorkReceiver() {
}
public static NetWorkReceiver getInstance() {
if (instance == null) {
instance = new NetWorkReceiver();
}
return instance;
}
public void register(NetChangListener listener) {
listeners.add(listener);
}
public void unRegister(NetChangListener listener) {
if (listeners.contains(listener)) {
listeners.remove(listener);
}
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
if (NetworkUtil.isNetworkAvailable(context)) {
if (!listeners.isEmpty()) {
for (NetChangListener listener : listeners) {
listener.netAvailable();
}
}
} else {
Toast.makeText(context, "网络已断开!", Toast.LENGTH_SHORT).show();
}
}
}
public interface NetChangListener {
// 网络可用
void netAvailable();
// 网络不可用或者无网络
void netUnAvailable();
}
}
package com.rv.im.broadcast;
package com.rv.im.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
......
......@@ -10,6 +10,7 @@ import android.content.Intent;
import android.os.Build;
import android.support.v4.app.NotificationCompat;
import com.rv.im.ConversationListActivity;
import com.rv.im.CustomerListActivity;
import com.rv.im.R;
......@@ -51,4 +52,38 @@ public class NotificationMananger {
manager.notify(0, notification);
}
public static void showNewsFriendNotification(Context context, String fromId) {
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder builder;
//判断是否是8.0Android.O
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel chan1 = new NotificationChannel("1", "newChannel", NotificationManager.IMPORTANCE_HIGH);
manager.createNotificationChannel(chan1);
builder = new NotificationCompat.Builder(context, "1");
} else {
builder = new NotificationCompat.Builder(context);
}
//
// Intent intent = new Intent();
// intent.setComponent(new ComponentName(context, "com.xxfc.rv."));
// intent.putExtra("to","chat") ;
// intent.putExtra("fromId",fromId) ;
//
Intent intent = new Intent(context, ConversationListActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
Notification notification = builder.setTicker("您有新的消息")
.setSmallIcon(R.mipmap.logo)
.setWhen(System.currentTimeMillis())
.setContentIntent(pendingIntent)
.setContentTitle("滴房车")
.setContentText("好友添加请求")
.setAutoCancel(true)
.setPriority(Notification.PRIORITY_DEFAULT)
.build();
manager.notify(0, notification);
}
}
package com.rv.im.view;
import android.app.AlertDialog;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import com.rv.im.R;
/**
* Created by Administrator on 2017/6/19.
*/
public class LoadingDialog {
/*
*dialog_loading.xml
* ----------------------兼容性更好的方案-------------------------------
*
* */
AlertDialog alertDialog;
Context context;
public LoadingDialog(Context context) {
this.context = context;
LayoutInflater inflater = LayoutInflater.from(context);
View layout = inflater.inflate(R.layout.dialog_loading, null);
AlertDialog.Builder builder = new AlertDialog.Builder(context).setView(layout);
alertDialog = builder.create();
}
/**
* dip-->px
*/
public int dip2Px(int dip) {
// px/dip = density;
float density = context.getResources().getDisplayMetrics().density;
int px = (int) (dip * density + .5f);
return px;
}
public void show() {
alertDialog.show();
WindowManager.LayoutParams lp = alertDialog.getWindow().getAttributes();
lp.width = dip2Px(120);//定义宽度
lp.height = dip2Px(120);
alertDialog.getWindow().setAttributes(lp);
alertDialog.getWindow().setDimAmount(0);
alertDialog.setCancelable(true);
alertDialog.setCanceledOnTouchOutside(false);
}
public void dismiss() {
if (alertDialog != null && alertDialog.isShowing()) {
alertDialog.dismiss();
}
}
/*
* ----------------------普通方案-------------------------------
private int height;
public LoadingDialog(Context context) {
this(context, R.style.alert_dialog);
}
public LoadingDialog(Context context, int themeResId) {
super(context, themeResId);
setCancelable(true);
setCanceledOnTouchOutside(false);
float density = context.getResources().getDisplayMetrics().density;
width = (int) (140 * density + .5f);
height = (int) (105 * density + .5f);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_loading);
}
@Override
public void show() {
super.show();
Window window = getWindow();
WindowManager.LayoutParams lp = window.getAttributes();
lp.width = width;
lp.height = height;
window.setAttributes(lp);
// 去掉周围的颜色
getWindow().setDimAmount(0);
} */
}
......@@ -9,8 +9,12 @@ import com.ruiwenliu.wrapper.util.AppUtils;
import com.rv.im.ImSetting;
import com.rv.im.R;
import com.rv.im.db.service.ChatMessageServiceImp;
import com.rv.im.db.service.FriendServiceImp;
import com.rv.im.db.service.IChatMessageService;
import com.rv.im.db.table.ChatMessage;
import com.rv.im.db.table.Friend;
import com.rv.im.enums.MessageTypeEnum;
import com.rv.im.presenter.AddFriendPresenter;
import com.rv.im.util.NotificationMananger;
import com.rv.im.xmpp.listener.AuthStateListener;
import com.rv.im.xmpp.listener.ChatMessageListener;
......@@ -66,7 +70,7 @@ public class ListenerManager {
mNewFriendListeners.add(newFriendListener);
}
public void removeChatMessageListener(NewFriendListener friendListener) {
public void removeNewFriendListener(NewFriendListener friendListener) {
mNewFriendListeners.remove(friendListener);
}
......@@ -127,13 +131,32 @@ public class ListenerManager {
});
}
/**
* 新朋友发送消息的状态变化
*/
public void notifyNewFriendSendStateChange(final String toUserId, final ChatMessage message, final int messageState) {
if (mNewFriendListeners.size() <= 0) {
return;
}
mHandler.post(() -> {
for (NewFriendListener listener : mNewFriendListeners) {
listener.onNewFriendSendStateChange(toUserId, message, messageState);
}
});
}
/*********
* 添加好友
* 收到添加好友
* @param message
*/
public void notifyNewFriend(final ChatMessage message) {
if (message == null) return;
NotificationMananger.showNewsFriendNotification(ImSetting.getContext(), message.getFromId());
bell();
mHandler.post(() -> {
FriendServiceImp.getInstance(ImSetting.getContext()).addMessage(
buildAddFriendMessage(message.getFromUserId(), message.getFromUserName(), message.getContent(), message.getMessageType()));
boolean hasRead = false;// 是否已经被读了 (如果有类添加)
for (NewFriendListener listener : mNewFriendListeners) {
if (listener.onNewFriend(message)) {
......@@ -172,4 +195,31 @@ public class ListenerManager {
mediaPlayer.release();
}
}
/********
* 收到好友添加请求
* @param userId
* @param userName
* @param status
* @return
*/
private Friend buildAddFriendMessage(String userId, String userName, String content, int status) {
Friend friend = new Friend();
friend.setUserId(userId);
friend.setUserName(userName);
if (status == MessageTypeEnum.HELLO.getType()) {
friend.setAction("同意");
friend.setDescribe(content);
friend.setStatus(Friend.STATUS_11);
} else if (status == MessageTypeEnum.PASS.getType()) {
friend.setAction("添加成功");
friend.setStatus(Friend.STATUS_13);
} else if (status == MessageTypeEnum.BE_FRIEND.getType()) {
friend.setAction("成为好友");
friend.setStatus(Friend.STATUS_21);
}
friend.setRead(true);
friend.setTimeCreate(System.currentTimeMillis());
return friend;
}
}
......@@ -6,6 +6,7 @@ import android.text.TextUtils;
import com.rv.im.ImService;
import com.rv.im.db.table.ChatMessage;
import com.rv.im.enums.MessageTypeEnum;
import com.rv.im.log.LogUtil;
import com.rv.im.xmpp.listener.ChatMessageListener;
......@@ -50,10 +51,14 @@ public class ReceiptManager {
ListenerManager.getInstance().notifyMessageSendStateChange(packetId, ChatMessageListener.MESSAGE_SEND_FAILED);
} else if (msg.what == RECEIPT_YES) {// 认为发送成功
if(obj != null && obj.sendType == SendType.PUSH_NEW_FRIEND ){
ListenerManager.getInstance().notifyNewFriendSendStateChange(obj.toUserId, obj.msg,
ChatMessageListener.MESSAGE_SEND_SUCCESS);
}else{
ListenerManager.getInstance().notifyMessageSendStateChange(packetId, ChatMessageListener.MESSAGE_SEND_SUCCESS);
}
}
mReceiptMap.remove(packetId);
}
};
......@@ -69,7 +74,7 @@ public class ReceiptManager {
public void addWillSendMessage(final String toUserId
, final ChatMessage xmppMessage, SendType sendType, String content) {
, final ChatMessage xmppMessage, String content) {
// 将之前可能存在的回执缓存清除掉
if (mReceiptMap.containsKey(xmppMessage.getPackId())) {
......@@ -82,7 +87,8 @@ public class ReceiptManager {
ReceiptObj obj = new ReceiptObj();
obj.toUserId = toUserId;
obj.msg = xmppMessage;
obj.sendType = sendType;
obj.sendType = (xmppMessage.getMessageType() >= MessageTypeEnum.HELLO.getType() && xmppMessage.getMessageType() <= MessageTypeEnum.BLACK_REFUSED.getType())
?SendType.PUSH_NEW_FRIEND:SendType.NORMAL ;
obj.Read_msg_pid = content;
mReceiptMap.put(xmppMessage.getPackId(), obj); // 记录一条新发送出去的消息(还没有接收到回执)
......
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/set_list_down_press" android:state_focused="true" />
<item android:drawable="@drawable/set_list_down_press" android:state_selected="true" />
<item android:drawable="@drawable/set_list_down_press" android:state_pressed="true" />
<item android:drawable="@drawable/set_list_down" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/set_list_up_press" android:state_focused="true" />
<item android:drawable="@drawable/set_list_up_press" android:state_selected="true" />
<item android:drawable="@drawable/set_list_up_press" android:state_pressed="true" />
<item android:drawable="@drawable/set_list_up" />
</selector>
\ No newline at end of file
......@@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".AddFriendActivity">
tools:context=".friend.AddFriendActivity">
<RelativeLayout
android:layout_width="match_parent"
......
......@@ -5,14 +5,15 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".NewFriendActivity">
tools:context=".friend.NewFriendActivity">
<LinearLayout
android:id="@+id/ll_search"
android:layout_width="match_parent"
android:layout_height="@dimen/size_50"
android:layout_height="@dimen/dp_40"
android:layout_centerInParent="true"
android:layout_marginTop="@dimen/dp5"
android:layout_marginLeft="@dimen/dp_10"
android:layout_marginRight="@dimen/dp_10"
android:background="@drawable/bg_chat_search"
......
This diff is collapsed.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:paddingLeft="@dimen/chat_item_padding_left"
android:paddingTop="@dimen/chat_item_padding_top"
android:paddingRight="@dimen/chat_item_padding_right"
android:paddingBottom="@dimen/chat_item_padding_bottom">
<TextView
android:id="@+id/tv_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="2019-08-19 16:36"
android:textColor="@color/gray"
android:textSize="@dimen/dp10" />
<TextView
android:textSize="@dimen/sp_12"
android:textColor="@color/textGray"
android:layout_marginTop="@dimen/size_3"
android:text="成功建立好友关系!"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:id="@+id/linear_empty"
android:background="@color/colorWrite"
android:orientation="vertical">
<ImageView
android:id="@+id/iv_flag"
android:layout_width="345px"
android:layout_height="345px"
android:layout_centerInParent="true"
android:src="@drawable/gift_bill_list_empty"
/>
<TextView
android:layout_below="@id/iv_flag"
android:id="@+id/tv_tip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="@string/empty_no_data"
android:textColor="#ffcd00"
android:textSize="@dimen/sp_14" />
</RelativeLayout>
\ No newline at end of file
<?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">
<LinearLayout
android:id="@+id/ll_content"
android:layout_width="match_parent"
android:layout_height="@dimen/dp50"
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
android:id="@+id/img_header"
android:layout_width="@dimen/dp_40"
android:layout_height="@dimen/dp_40"
android:layout_marginLeft="@dimen/dp_10" />
<TextView
android:id="@+id/tv_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_10"
android:layout_weight="1" />
<Button
android:id="@+id/btn_add"
android:layout_width="@dimen/size_80"
android:layout_height="@dimen/size_38"
android:layout_gravity="right"
android:text="同意" />
<TextView
android:gravity="center"
android:id="@+id/text_add_status"
android:layout_width="@dimen/size_80"
android:layout_height="@dimen/size_38"
android:layout_gravity="right" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_marginLeft="@dimen/size_60"
android:background="@color/colorGray" />
</LinearLayout>
......@@ -10,13 +10,14 @@
<LinearLayout
android:id="@+id/ll_navigation"
android:layout_width="match_parent"
android:layout_height="@dimen/size_38"
android:background="@color/colorGray"
android:layout_height="@dimen/size_30"
android:background="@color/colorGrayBg"
android:orientation="vertical">
<include layout="@layout/common_line" />
<TextView
android:gravity="center_vertical"
android:id="@+id/tv_character"
android:layout_width="match_parent"
android:layout_height="0dp"
......
......@@ -2,6 +2,7 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/ll_content"
android:orientation="vertical">
<LinearLayout
......
......@@ -178,5 +178,14 @@
<string name="text_group">群聊</string>
<string name="text_new_friend">新的朋友</string>
<string name="add_attention_failed">加关注失败,你已被对方加入黑名单</string>
<string name="name_align">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</string>
<string name="remark_name">备注名</string>
<string name="describe">描述</string>
<string name="sex_align">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</string>
<string name="birthday">出生日期</string>
<string name="residence_align">&#160;&#160;&#160;&#160;</string>
<string name="phone_number">手机号</string>
<string name="label_online_time">上次在线时间</string>
<string name="qrcode">二维码</string>
<string name="now_location">所在位置</string>
</resources>
\ No newline at end of file
......@@ -171,4 +171,53 @@
<item name="android:backgroundDimEnabled">true</item>
<item name="android:backgroundDimAmount">0.6</item>
</style>
<style name="IMTbleLine_UP">
<item name="android:background">@drawable/set_list_up_bg</item>
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:minHeight">50dp</item>
<item name="android:paddingLeft">20dp</item>
<item name="android:paddingRight">27dp</item>
</style>
<style name="IMTbleLine_TextKey">
<item name="android:textSize">@dimen/one_level_title</item>
<item name="android:textColor">#8b8a8a</item>
<item name="android:gravity">center</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:singleLine">true</item>
<item name="android:layout_centerVertical">true</item>
</style>
<style name="IMTbleLine_TextValue">
<item name="android:textSize">@dimen/one_level_title</item>
<item name="android:textColorHint">@color/grey</item>
<item name="android:textColor">@color/black</item>
<item name="android:gravity">right</item>
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_marginLeft">5dp</item>
<item name="android:layout_marginRight">5dp</item>
<item name="android:singleLine">true</item>
<item name="android:layout_centerVertical">true</item>
</style>
<style name="IMTbleLine_ArrowImg">
<item name="android:layout_width">8dp</item>
<item name="android:layout_height">14dp</item>
<item name="android:layout_alignParentRight">true</item>
<item name="android:layout_centerVertical">true</item>
<item name="android:background">@drawable/me_chevron_right</item>
</style>
<style name="IMTbleLine">
<item name="android:background">@drawable/set_list_down_bg</item>
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:minHeight">50dp</item>
<item name="android:paddingLeft">20dp</item>
<item name="android:paddingRight">27dp</item>
</style>
</resources>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment