This commit is contained in:
2023-09-28 18:28:28 +08:00
parent 2976177e92
commit 2602725320
60 changed files with 1989 additions and 157 deletions

View File

@@ -0,0 +1,38 @@
package com.shayu.onetoone.activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.shayu.onetoone.R;
public abstract class AbsOTOActivity extends AppCompatActivity {
public Context mContext;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutId());
mContext = this;
main(savedInstanceState);
View view=findViewById(R.id.btn_back);
if(view!=null){
view.setOnClickListener(v -> finish());
}
}
protected abstract int getLayoutId();
protected abstract void main(Bundle savedInstanceState);
public void setTitle(String title) {
TextView view = findViewById(R.id.title);
if (view != null) {
view.setText(title);
}
}
}

View File

@@ -0,0 +1,117 @@
package com.shayu.onetoone.activity;
import static com.yunbao.common.CommonAppContext.home_zdy_img_cn;
import static com.yunbao.common.CommonAppContext.home_zdy_img_us;
import android.os.Bundle;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.blankj.utilcode.util.DeviceUtils;
import com.blankj.utilcode.util.GsonUtils;
import com.lzy.okgo.model.Response;
import com.shayu.onetoone.R;
import com.shayu.onetoone.manager.RouteManager;
import com.yunbao.common.CommonAppConfig;
import com.yunbao.common.CommonAppContext;
import com.yunbao.common.bean.IMLoginModel;
import com.yunbao.common.bean.UserBean;
import com.yunbao.common.event.UpdateTablePointMe;
import com.yunbao.common.http.HttpCallback;
import com.yunbao.common.http.HttpClient;
import com.yunbao.common.http.JsonBean;
import com.yunbao.common.manager.IMLoginManager;
import com.yunbao.common.manager.NoviceInstructorManager;
import com.yunbao.common.manager.imrongcloud.RongcloudIMManager;
import com.yunbao.common.utils.SpUtil;
import com.yunbao.common.utils.ToastUtil;
import org.greenrobot.eventbus.EventBus;
import java.util.Arrays;
public class LauncherActivity extends AbsOTOActivity {
@Override
protected int getLayoutId() {
return R.layout.activity_launcher;
}
@Override
protected void main(Bundle savedInstanceState) {
//临时用的登录代码,将就下
HttpClient.getInstance().get("Login.userLogin", "setLoginInfo")
.params("user_login", "95001")
.params("user_pass", "123")
.params("pushid", "")
.params("lastlogindevice", "Android")
.params("uuid_Device", DeviceUtils.getUniqueDeviceId())
.execute(new HttpCallback() {
@Override
public void onSuccess(int code, String msg, String[] info) {
if (code == 0 && info.length > 0) {
JSONObject obj = JSON.parseObject(info[0]);
String uid = obj.getString("id");
String token = obj.getString("token");
// mFirstLogin = obj.getIntValue("first_login") == 1;
// mShowInvite = obj.getIntValue("isagent") == 1;
CommonAppConfig.getInstance().setLoginInfo(uid, token, true);
//设置登录信息
IMLoginModel model = GsonUtils.fromJson(info[0], IMLoginModel.class);
IMLoginManager.get(mContext).setupLoginUser(model);
connectRongCloud();
} else {
ToastUtil.show(msg);
}
}
});
}
private void connectRongCloud() {
HttpClient.getInstance().get("User.getBaseInfos", "getBaseInfo")
.execute(new HttpCallback() {
@Override
public void onSuccess(int code, String msg, String[] info) {
if (code == 0 && info.length > 0) {
IMLoginManager.get(CommonAppContext.sInstance.getApplicationContext()).upDataUserInfo(info[0]);
JSONObject obj = JSON.parseObject(info[0]);
UserBean bean = JSON.toJavaObject(obj, UserBean.class);
bean.setMedalName(obj.getString("medal_name"));
bean.setMedalLevel(obj.getIntValue("medal_level"));
CommonAppConfig.getInstance().setUserBean(bean);
CommonAppConfig.getInstance().setUserItemList(obj.getString("list"));
bean.seUserInfoComplete(obj.getIntValue("user_info_complete"));
SpUtil.getInstance().setStringValue(SpUtil.USER_INFO, info[0]);
//融云连接服务器
RongcloudIMManager.connectIM(mContext);
HttpClient.getInstance().post("Home.getRandJoinAnchor", "Home.getRandJoinAnchor")
.execute(new HttpCallback() {
@Override
public void onSuccess(int code, String msg, String[] info) {
System.out.println("code = " + code + ", msg = " + msg + ", info = " + Arrays.toString(info));
RouteManager.forwardMainActivity();
finish();
}
@Override
public void onError(Response<JsonBean> response) {
super.onError(response);
String message = response.message();
System.out.println(">>>>>" + message);
}
});
}
}
@Override
public void onError() {
}
});
}
}

View File

@@ -0,0 +1,83 @@
package com.shayu.onetoone.activity;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.angcyo.tablayout.DslTabLayout;
import com.angcyo.tablayout.DslTabLayoutConfig;
import com.angcyo.tablayout.delegate2.ViewPager2Delegate;
import com.shayu.onetoone.R;
import com.shayu.onetoone.activity.fragments.BaseFragment;
import com.shayu.onetoone.activity.fragments.DynamicFragment;
import com.shayu.onetoone.activity.fragments.FriendsFragment;
import com.shayu.onetoone.activity.fragments.MessageFragment;
import com.shayu.onetoone.activity.fragments.MyFragment;
import com.shayu.onetoone.manager.RouteManager;
import java.util.ArrayList;
import java.util.List;
import kotlin.Unit;
import kotlin.jvm.functions.Function1;
import kotlin.jvm.functions.Function4;
@Route(path = RouteManager.ACTIVITY_MAIN)
public class MainActivity extends AbsOTOActivity {
List<BaseFragment> fragments = new ArrayList<>();
private ViewPager2 viewPager;
private DslTabLayout dslTabLayout;
@Override
protected void main(Bundle savedInstanceState) {
fragments.add(new FriendsFragment());
fragments.add(new DynamicFragment());
fragments.add(new MessageFragment());
fragments.add(new MyFragment());
viewPager = findViewById(R.id.viewPager);
dslTabLayout = findViewById(R.id.dslTabLayout);
viewPager.setAdapter(new FragmentStateAdapter(this) {
@NonNull
@Override
public Fragment createFragment(int position) {
return fragments.get(position);
}
@Override
public int getItemCount() {
return fragments.size();
}
});
viewPager.setUserInputEnabled(false);
ViewPager2Delegate.Companion.install(viewPager, dslTabLayout, false);
dslTabLayout.configTabLayoutConfig(new Function1<DslTabLayoutConfig, Unit>() {
@Override
public Unit invoke(DslTabLayoutConfig dslTabLayoutConfig) {
dslTabLayoutConfig.setOnSelectItemView(new Function4<View, Integer, Boolean, Boolean, Boolean>() {
@Override
public Boolean invoke(View itemView, Integer index, Boolean select, Boolean fromUse) {
if (select) {
viewPager.setCurrentItem(index);
}
return false;
}
});
return null;
}
});
}
@Override
protected int getLayoutId() {
return R.layout.activity_main;
}
}

View File

@@ -0,0 +1,30 @@
package com.shayu.onetoone.activity.fragments;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
public abstract class BaseFragment extends Fragment {
public Context mContext;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View itemView = createView(inflater, container, savedInstanceState);
this.mContext = getContext();
initView(itemView);
return itemView;
}
public abstract void initView(View itemView);
public abstract View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState);
}

View File

@@ -0,0 +1,22 @@
package com.shayu.onetoone.activity.fragments;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.shayu.onetoone.R;
public class DynamicFragment extends BaseFragment {
@Override
public void initView(View itemView) {
}
@Override
public View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_dynamic, container, false);
}
}

View File

@@ -0,0 +1,21 @@
package com.shayu.onetoone.activity.fragments;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.shayu.onetoone.R;
public class FriendsFragment extends BaseFragment {
@Override
public void initView(View itemView) {
}
@Override
public View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_friends, container, false);
}
}

View File

@@ -0,0 +1,95 @@
package com.shayu.onetoone.activity.fragments;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;
import com.angcyo.tablayout.DslTabLayout;
import com.angcyo.tablayout.DslTabLayoutConfig;
import com.angcyo.tablayout.delegate2.ViewPager2Delegate;
import com.lxj.xpopup.XPopup;
import com.shayu.onetoone.R;
import com.shayu.onetoone.activity.fragments.message.MsgFriendFragment;
import com.shayu.onetoone.activity.fragments.message.MsgMessageFragment;
import com.shayu.onetoone.dialog.MsgMoreDialog;
import java.util.ArrayList;
import java.util.List;
import kotlin.Unit;
import kotlin.jvm.functions.Function1;
import kotlin.jvm.functions.Function4;
public class MessageFragment extends BaseFragment implements View.OnClickListener {
List<BaseFragment> fragments = new ArrayList<>();
View more;
XPopup.Builder moreXPopup;
@Override
public View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_msg, container, false);
}
@Override
public void initView(View itemView) {
ViewPager2 viewPager2 = itemView.findViewById(R.id.viewPager);
DslTabLayout tabLayout = itemView.findViewById(R.id.dslTabLayout);
more = itemView.findViewById(R.id.more);
more.setOnClickListener(this);
moreXPopup = new XPopup.Builder(getContext()).watchView(more);
viewPager2.setUserInputEnabled(false);
//绑定ViewPager2到tabLayout
ViewPager2Delegate.Companion.install(viewPager2, tabLayout, false);
fragments.add(new MsgMessageFragment());//消息 - 消息
fragments.add(new MsgFriendFragment()); //消息 - 好友
viewPager2.setAdapter(new FragmentStateAdapter(this) {
@NonNull
@Override
public Fragment createFragment(int position) {
return fragments.get(position);
}
@Override
public int getItemCount() {
return fragments.size();
}
});
//设置点击事件
tabLayout.configTabLayoutConfig(new Function1<DslTabLayoutConfig, Unit>() {
@Override
public Unit invoke(DslTabLayoutConfig dslTabLayoutConfig) {
dslTabLayoutConfig.setOnSelectItemView(new Function4<View, Integer, Boolean, Boolean, Boolean>() {
@Override
public Boolean invoke(View itemView, Integer index, Boolean select, Boolean fromUse) {
if (select) {//设置选择的Fragment
viewPager2.setCurrentItem(index);
}
return false;
}
});
return null;
}
});
}
private void showMoreDialog() {
moreXPopup.asCustom(new MsgMoreDialog(mContext)).show();
}
@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.more) {
showMoreDialog();
}
}
}

View File

@@ -0,0 +1,21 @@
package com.shayu.onetoone.activity.fragments;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.shayu.onetoone.R;
public class MyFragment extends BaseFragment {
@Override
public void initView(View itemView) {
}
@Override
public View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.activity_msg_config, container, false);
}
}

View File

@@ -0,0 +1,46 @@
package com.shayu.onetoone.activity.fragments.message;
import static io.rong.imkit.conversation.extension.component.inputpanel.InputPanel.InputStyle.STYLE_CONTAINER_EXTENSION;
import static io.rong.imkit.conversation.extension.component.inputpanel.InputPanel.InputStyle.STYLE_SWITCH_CONTAINER_EXTENSION;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.yunbao.common.utils.ToastUtil;
import io.rong.imkit.IMCenter;
import io.rong.imkit.conversation.ConversationFragment;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.Conversation;
import io.rong.imlib.model.Message;
import io.rong.message.TextMessage;
public class ChatMessageFragment extends ConversationFragment {
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Conversation.ConversationType conversationType = Conversation.ConversationType.PRIVATE;
String targetId = "user1";
Message.SentStatus sentStatus = Message.SentStatus.SENT;
TextMessage content = TextMessage.obtain("这里是消息内容");
long sentTime = System.currentTimeMillis();
IMCenter.getInstance().insertOutgoingMessage(conversationType, targetId, sentStatus, content, sentTime, new RongIMClient.ResultCallback<Message>() {
@Override
public void onSuccess(Message message) {
ToastUtil.show("消息发送成功");
}
@Override
public void onError(RongIMClient.ErrorCode e) {
ToastUtil.show("消息发送失败:"+e.msg);
Log.i("聊天", "onError: "+e);
}
});
}
}

View File

@@ -0,0 +1,22 @@
package com.shayu.onetoone.activity.fragments.message;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.shayu.onetoone.R;
import com.shayu.onetoone.activity.fragments.BaseFragment;
public class MsgFriendFragment extends BaseFragment {
@Override
public void initView(View itemView) {
}
@Override
public View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_msg_friend, container, false);
}
}

View File

@@ -0,0 +1,149 @@
package com.shayu.onetoone.activity.fragments.message;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.shayu.onetoone.R;
import com.shayu.onetoone.activity.fragments.BaseFragment;
import com.shayu.onetoone.adapter.MsgMessageRecyclerViewAdapter;
import com.shayu.onetoone.bean.MsgMessageBean;
import com.shayu.onetoone.manager.RouteManager;
import com.yanzhenjie.recyclerview.OnItemClickListener;
import com.yanzhenjie.recyclerview.OnItemMenuClickListener;
import com.yanzhenjie.recyclerview.SwipeMenuBridge;
import com.yanzhenjie.recyclerview.SwipeMenuCreator;
import com.yanzhenjie.recyclerview.SwipeMenuItem;
import com.yanzhenjie.recyclerview.SwipeRecyclerView;
import com.yunbao.common.utils.DpUtil;
import com.yunbao.common.utils.ToastUtil;
import java.util.ArrayList;
import java.util.List;
import io.rong.imkit.utils.RouteUtils;
import io.rong.imlib.model.Conversation;
import io.rong.imlib.model.ConversationIdentifier;
public class MsgMessageFragment extends BaseFragment {
SwipeRecyclerView recyclerView;
SwipeRefreshLayout swipeRefreshLayout;
ConstraintLayout netError;
MsgMessageRecyclerViewAdapter adapter;
List<MsgMessageBean> list;
@Override
public void initView(View itemView) {
recyclerView = itemView.findViewById(R.id.recyclerView);
swipeRefreshLayout = itemView.findViewById(R.id.swipeRefreshLayout);
netError = itemView.findViewById(R.id.net_error);
adapter = new MsgMessageRecyclerViewAdapter(getContext());
list = new ArrayList<>();
initData();
recyclerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
recyclerView.setSwipeMenuCreator(initSwipeMenuCreator());
initMoreListener();
initRefreshListener();
recyclerView.setOnItemMenuClickListener(new OnItemMenuClickListener() {
@Override
public void onItemClick(SwipeMenuBridge menuBridge, int adapterPosition) {
menuBridge.closeMenu();
if (menuBridge.getPosition() == 0) {
ToastUtil.showDebug("置顶:" + adapter.getList().get(adapterPosition).getNickname());
} else {
ToastUtil.showDebug("删除:" + adapter.getList().get(adapterPosition).getNickname());
adapter.getList().remove(adapterPosition);
adapter.notifyDataSetChanged();
}
}
});
recyclerView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(View view, int i) {
RouteManager.forwardMsgChatActivity();
}
});
recyclerView.setAdapter(adapter);
adapter.setList(list);
}
@Override
public View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_msg_message, container, false);
}
private SwipeMenuCreator initSwipeMenuCreator() {
SwipeMenuCreator creator = (leftMenu, rightMenu, position) -> {
SwipeMenuItem top = new SwipeMenuItem(getContext());
SwipeMenuItem del = new SwipeMenuItem(getContext());
top.setBackgroundColor(Color.parseColor("#D9D9D9"));
del.setBackgroundColor(Color.parseColor("#FE5268"));
top.setText("置顶");
del.setText("删除");
top.setHeight(ViewGroup.LayoutParams.MATCH_PARENT);
top.setWidth(DpUtil.dp2px(71));
del.setHeight(ViewGroup.LayoutParams.MATCH_PARENT);
del.setWidth(DpUtil.dp2px(71));
rightMenu.addMenuItem(top);
rightMenu.addMenuItem(del);
};
return creator;
}
private void initMoreListener() {
SwipeRecyclerView.LoadMoreListener moreListener = new SwipeRecyclerView.LoadMoreListener() {
@Override
public void onLoadMore() {
List<MsgMessageBean> tmp =
new ArrayList<>(list);
initData();
tmp.addAll(list);
adapter.setList(tmp);
list = new ArrayList<>(tmp);
recyclerView.loadMoreFinish(false, true);
}
};
recyclerView.setLoadMoreListener(moreListener);
}
private void initRefreshListener() {
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
initData();
adapter.setList(list);
swipeRefreshLayout.setRefreshing(false);
}
});
}
private void initData() {
list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
MsgMessageBean bean = new MsgMessageBean();
bean.setId(i);
bean.setNickname("名字" + i);
bean.setContent("内容" + i);
bean.setTime("时间:" + i);
if (i % 5 == 0) {
bean.setNotRead(true);
bean.setNotReadNum(i);
}
if (i % 2 == 0) {
bean.setAvatar("https://downs.yaoulive.com/%E4%BA%A4%E5%8F%89%2015%403x.png");
} else {
bean.setAvatar("https://downs.yaoulive.com/%E4%BA%A4%E5%8F%89%2014%403x.png");
}
list.add(bean);
}
}
}

View File

@@ -0,0 +1,31 @@
package com.shayu.onetoone.activity.message;
import android.os.Bundle;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.shayu.onetoone.R;
import com.shayu.onetoone.activity.AbsOTOActivity;
import com.shayu.onetoone.activity.fragments.message.ChatMessageFragment;
import com.shayu.onetoone.manager.RouteManager;
import io.rong.imkit.conversation.ConversationFragment;
@Route(path = RouteManager.ACTIVITY_MSG_CHAT)
public class ChatActivity extends AbsOTOActivity {
@Override
protected int getLayoutId() {
return R.layout.activity_msg_chat;
}
@Override
protected void main(Bundle savedInstanceState) {
ConversationFragment conversationFragment = new ChatMessageFragment();
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.container, conversationFragment);
transaction.commit();
}
}

View File

@@ -0,0 +1,64 @@
package com.shayu.onetoone.activity.message;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import androidx.appcompat.widget.SwitchCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.shayu.onetoone.R;
import com.shayu.onetoone.activity.AbsOTOActivity;
import com.shayu.onetoone.adapter.MsgGreetConfigAdapter;
import com.shayu.onetoone.bean.MsgGreetConfigBean;
import com.shayu.onetoone.manager.RouteManager;
import com.yunbao.common.interfaces.OnItemClickListener;
@Route(path = RouteManager.ACTIVITY_MSG_MORE_CONFIG_ACTIVITY)
public class MsgMoreConfigActivity extends AbsOTOActivity {
RecyclerView recyclerView;
MsgGreetConfigAdapter adapter;
SwitchCompat msgSwitch;
View add;
View editLayout;
Button cancel, apply;
@Override
protected int getLayoutId() {
return R.layout.activity_msg_config;
}
@Override
protected void main(Bundle savedInstanceState) {
setTitle("打招呼設置");
recyclerView = findViewById(R.id.msg_recyclerView);
msgSwitch = findViewById(R.id.msg_switch);
add = findViewById(R.id.add_msg);
cancel = findViewById(R.id.btn_cancel);
apply = findViewById(R.id.btn_apply);
editLayout = findViewById(R.id.edit_layout);
adapter = new MsgGreetConfigAdapter(this);
recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
recyclerView.setAdapter(adapter);
adapter.setDeleteListener((size, position) -> {
if (size >= 10) {
add.setVisibility(View.GONE);
} else {
add.setVisibility(View.VISIBLE);
}
});
add.setOnClickListener(v -> {
adapter.addItem(new MsgGreetConfigBean());
if (adapter.getItemCount() >= 10) {
add.setVisibility(View.GONE);
}
});
msgSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> editLayout.setVisibility(isChecked ? View.VISIBLE : View.GONE));
}
}