From e7ce538d7812c321c8f3c11ea3a0319318b5073c Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Sat, 7 Oct 2023 14:59:21 +0800 Subject: [PATCH] update --- OneToOne/src/main/AndroidManifest.xml | 2 +- .../java/com/shayu/onetoone/AppContext.java | 6 +- .../onetoone/activity/AbsOTOActivity.java | 13 + .../onetoone/activity/LauncherActivity.java | 52 +-- .../shayu/onetoone/activity/MainActivity.java | 8 + .../activity/fragments/MessageFragment.java | 3 +- .../fragments/message/MsgMessageFragment.java | 271 ++++++++--- .../activity/login/EntryActivity.java | 233 +++++----- .../activity/login/LoginActivity.java | 167 +++---- .../MsgMessageRecyclerViewAdapter.java | 59 ++- .../shayu/onetoone/bean/JoinAnchorBean.java | 54 +++ .../com/shayu/onetoone/bean/UserBean.java | 428 ++++++++++++++++++ .../shayu/onetoone/dialog/MsgMoreDialog.java | 4 +- .../com/shayu/onetoone/event/AbsBusEvent.java | 26 ++ .../onetoone/event/MessageMsgBusEvent.java | 9 + .../shayu/onetoone/manager/OTONetManager.java | 147 +++++- .../shayu/onetoone/manager/RouteManager.java | 12 +- .../shayu/onetoone/network/OneToOneApi.java | 64 +++ .../provider/CustomConversationProvider.java | 18 +- .../provider/MessageChatTipsItemProvider.java | 1 + .../src/main/res/layout/activity_main.xml | 8 +- .../res/layout/rc_conversationlist_item.xml | 45 +- .../res/layout/rc_extension_input_panel.xml | 9 +- .../res/layout/view_msg_chat_list_top.xml | 28 ++ .../res/mipmap-xxhdpi/ic_message_tab_man.png | Bin 0 -> 3554 bytes OneToOne/src/main/res/values/colors.xml | 4 + common/build.gradle | 3 +- common/libs/OpenInstall_v2.3.0.jar | Bin 0 -> 86069 bytes .../com/yunbao/common/bean/IMLoginModel.java | 10 + .../com/yunbao/common/glide/ImgLoader.java | 8 + .../com/yunbao/common/http/HttpClient.java | 1 + 31 files changed, 1298 insertions(+), 395 deletions(-) create mode 100644 OneToOne/src/main/java/com/shayu/onetoone/bean/JoinAnchorBean.java create mode 100644 OneToOne/src/main/java/com/shayu/onetoone/bean/UserBean.java create mode 100644 OneToOne/src/main/java/com/shayu/onetoone/event/AbsBusEvent.java create mode 100644 OneToOne/src/main/java/com/shayu/onetoone/event/MessageMsgBusEvent.java create mode 100644 OneToOne/src/main/res/layout/view_msg_chat_list_top.xml create mode 100644 OneToOne/src/main/res/mipmap-xxhdpi/ic_message_tab_man.png create mode 100644 OneToOne/src/main/res/values/colors.xml create mode 100644 common/libs/OpenInstall_v2.3.0.jar diff --git a/OneToOne/src/main/AndroidManifest.xml b/OneToOne/src/main/AndroidManifest.xml index 367ccfff4..392bb5ea4 100644 --- a/OneToOne/src/main/AndroidManifest.xml +++ b/OneToOne/src/main/AndroidManifest.xml @@ -141,7 +141,7 @@ + android:value="https://ceshi.yyouou.com" /> diff --git a/OneToOne/src/main/java/com/shayu/onetoone/AppContext.java b/OneToOne/src/main/java/com/shayu/onetoone/AppContext.java index 329f01d2a..9af768c17 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/AppContext.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/AppContext.java @@ -96,8 +96,10 @@ public class AppContext extends CommonAppContext { RongcloudIMManager.addRongcloudIMOnReceiveMessageListener(new RongIMClient.OnReceiveMessageWrapperListener() { @Override public boolean onReceived(Message message, int left, boolean hasPackage, boolean offline) { - TextMessage content = (TextMessage) message.getContent(); - ToastUtil.show("收到:" + content.getContent()); + if (message.getContent() instanceof TextMessage) { + TextMessage content = (TextMessage) message.getContent(); + ToastUtil.show("收到:" + content.getContent()); + } return false; } }); diff --git a/OneToOne/src/main/java/com/shayu/onetoone/activity/AbsOTOActivity.java b/OneToOne/src/main/java/com/shayu/onetoone/activity/AbsOTOActivity.java index 0de909b71..b92dbf8ff 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/activity/AbsOTOActivity.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/activity/AbsOTOActivity.java @@ -1,6 +1,8 @@ package com.shayu.onetoone.activity; import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; import android.os.Build; import android.os.Bundle; import android.view.View; @@ -12,6 +14,7 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import com.shayu.onetoone.R; +import com.yunbao.common.manager.IMLoginManager; /** * Activity基类 @@ -19,6 +22,16 @@ import com.shayu.onetoone.R; public abstract class AbsOTOActivity extends AppCompatActivity { public Context mContext; + @Override + public Resources getResources() { + Resources res = super.getResources(); + Configuration config = new Configuration(); + config.setToDefaults(); + config.locale = IMLoginManager.get(this).getLocaleLanguage(); + res.updateConfiguration(config, res.getDisplayMetrics()); + return res; + } + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/OneToOne/src/main/java/com/shayu/onetoone/activity/LauncherActivity.java b/OneToOne/src/main/java/com/shayu/onetoone/activity/LauncherActivity.java index 24fc82da7..1da2e8458 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/activity/LauncherActivity.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/activity/LauncherActivity.java @@ -1,7 +1,5 @@ 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 static com.yunbao.common.CommonAppContext.sInstance; import android.content.Context; @@ -19,7 +17,6 @@ import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; -import android.widget.EditText; import android.widget.FrameLayout; import android.widget.ImageView; @@ -28,9 +25,6 @@ import androidx.core.app.NotificationManagerCompat; 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.activity.login.EntryActivity; import com.shayu.onetoone.manager.RouteManager; @@ -43,24 +37,17 @@ import com.tencent.rtmp.TXLivePlayer; import com.tencent.rtmp.ui.TXCloudVideoView; import com.tencent.ugc.TXUGCBase; import com.yunbao.common.CommonAppConfig; -import com.yunbao.common.CommonAppContext; import com.yunbao.common.Constants; 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.event.DataUserInfoEvent; -import com.yunbao.common.event.UpdateTablePointMe; import com.yunbao.common.glide.ImgLoader; import com.yunbao.common.http.CommonHttpConsts; import com.yunbao.common.http.CommonHttpUtil; -import com.yunbao.common.http.HttpCallback; -import com.yunbao.common.http.HttpClient; -import com.yunbao.common.http.JsonBean; import com.yunbao.common.interfaces.CommonCallback; import com.yunbao.common.manager.IMLoginManager; -import com.yunbao.common.manager.NoviceInstructorManager; import com.yunbao.common.manager.imrongcloud.RongcloudIMManager; import com.yunbao.common.utils.DownloadUtil; import com.yunbao.common.utils.L; @@ -73,32 +60,8 @@ import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; -import com.linecorp.linesdk.Scope; -import com.linecorp.linesdk.auth.LineAuthenticationParams; -import com.linecorp.linesdk.auth.LineLoginApi; -import com.linecorp.linesdk.auth.LineLoginResult; -import com.twitter.sdk.android.core.Callback; -import com.twitter.sdk.android.core.DefaultLogger; -import com.twitter.sdk.android.core.Result; -import com.twitter.sdk.android.core.Twitter; -import com.twitter.sdk.android.core.TwitterAuthConfig; -import com.twitter.sdk.android.core.TwitterAuthToken; -import com.twitter.sdk.android.core.TwitterConfig; -import com.twitter.sdk.android.core.TwitterException; -import com.twitter.sdk.android.core.TwitterSession; -import com.twitter.sdk.android.core.identity.TwitterLoginButton; -import com.facebook.AccessToken; -import com.facebook.CallbackManager; -import com.facebook.FacebookCallback; -import com.facebook.FacebookException; -import com.facebook.Profile; -import com.facebook.ProfileTracker; -import com.facebook.login.LoginManager; -import com.facebook.login.LoginResult; - import java.io.File; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; /** @@ -129,15 +92,6 @@ public class LauncherActivity extends AbsOTOActivity implements View.OnClickList private int mVideoLastProgress; private boolean mForward; - @Override - public Resources getResources() { - Resources res = super.getResources(); - Configuration config = new Configuration(); - config.setToDefaults(); - config.locale = IMLoginManager.get(this).getLocaleLanguage(); - res.updateConfiguration(config, res.getDisplayMetrics()); - return res; - } @Override protected int getLayoutId() { @@ -246,7 +200,7 @@ public class LauncherActivity extends AbsOTOActivity implements View.OnClickList playAD(obj.getIntValue("type") == 0); } else { releaseVideo(); - LauncherActivity.this.startActivity(new Intent(LauncherActivity.this, EntryActivity.class)); + RouteManager.forwardEntryActivity(); LauncherActivity.this.finish(); } } else { @@ -287,7 +241,7 @@ public class LauncherActivity extends AbsOTOActivity implements View.OnClickList IMLoginManager.get(this).upDataUserInfo(); } else { releaseVideo(); - this.startActivity(new Intent(this, EntryActivity.class)); + RouteManager.forwardEntryActivity(); this.finish(); } @@ -599,7 +553,7 @@ public class LauncherActivity extends AbsOTOActivity implements View.OnClickList forwardMainActivity(); } else { releaseVideo(); - this.startActivity(new Intent(this, EntryActivity.class)); + RouteManager.forwardEntryActivity(); this.finish(); } } diff --git a/OneToOne/src/main/java/com/shayu/onetoone/activity/MainActivity.java b/OneToOne/src/main/java/com/shayu/onetoone/activity/MainActivity.java index a98c1d431..70097a3b6 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/activity/MainActivity.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/activity/MainActivity.java @@ -1,5 +1,6 @@ package com.shayu.onetoone.activity; +import android.net.Uri; import android.os.Bundle; import android.view.View; @@ -20,6 +21,8 @@ import com.shayu.onetoone.activity.fragments.MessageFragment; import com.shayu.onetoone.activity.fragments.MyFragment; import com.shayu.onetoone.manager.RouteManager; import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.bean.IMLoginModel; +import com.yunbao.common.manager.IMLoginManager; import com.yunbao.common.manager.imrongcloud.RongcloudIMManager; import com.yunbao.common.utils.ToastUtil; @@ -27,7 +30,9 @@ import java.util.ArrayList; import java.util.List; import io.rong.imkit.RongIM; +import io.rong.imkit.userinfo.RongUserInfoManager; import io.rong.imlib.RongIMClient; +import io.rong.imlib.model.UserInfo; import kotlin.Unit; import kotlin.jvm.functions.Function1; import kotlin.jvm.functions.Function4; @@ -82,6 +87,9 @@ public class MainActivity extends AbsOTOActivity { } }); RongcloudIMManager.connectIM(mContext); + IMLoginModel userInfo = IMLoginManager.get(this).getUserInfo(); + UserInfo info = new UserInfo(userInfo.getId() + "", userInfo.getUserNicename(), Uri.parse(userInfo.getAvatar())); + RongUserInfoManager.getInstance().refreshUserInfoCache(info); } @Override diff --git a/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/MessageFragment.java b/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/MessageFragment.java index 23decc80c..ba12a5b17 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/MessageFragment.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/MessageFragment.java @@ -46,7 +46,7 @@ public class MessageFragment extends BaseFragment implements View.OnClickListene DslTabLayout tabLayout = itemView.findViewById(R.id.dslTabLayout); more = itemView.findViewById(R.id.more); more.setOnClickListener(this); - moreXPopup = new XPopup.Builder(getContext()).watchView(more); + moreXPopup = new XPopup.Builder(getContext()).atView(more); viewPager2.setUserInputEnabled(false); //绑定ViewPager2到tabLayout ViewPager2Delegate.Companion.install(viewPager2, tabLayout, false); @@ -74,6 +74,7 @@ public class MessageFragment extends BaseFragment implements View.OnClickListene public Boolean invoke(View itemView, Integer index, Boolean select, Boolean fromUse) { if (select) {//设置选择的Fragment viewPager2.setCurrentItem(index); + more.setVisibility(index == 0 ? View.VISIBLE : View.GONE); } return false; } diff --git a/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/message/MsgMessageFragment.java b/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/message/MsgMessageFragment.java index 07a2179ae..b8429bd1d 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/message/MsgMessageFragment.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/message/MsgMessageFragment.java @@ -1,14 +1,20 @@ package com.shayu.onetoone.activity.fragments.message; +import android.app.Dialog; +import android.content.Context; import android.graphics.Color; +import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Looper; +import android.text.SpannableString; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -17,42 +23,60 @@ import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.alibaba.fastjson.JSONObject; 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.event.MessageMsgBusEvent; import com.yanzhenjie.recyclerview.OnItemMenuClickListener; +import com.yanzhenjie.recyclerview.OnItemMenuStateListener; import com.yanzhenjie.recyclerview.SwipeMenuBridge; import com.yanzhenjie.recyclerview.SwipeMenuCreator; import com.yanzhenjie.recyclerview.SwipeMenuItem; import com.yanzhenjie.recyclerview.SwipeRecyclerView; +import com.yunbao.common.glide.ImgLoader; +import com.yunbao.common.utils.Bus; +import com.yunbao.common.utils.DialogUitl; import com.yunbao.common.utils.DpUtil; +import com.yunbao.common.utils.RandomUtil; +import com.yunbao.common.utils.StringUtil; + +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; import java.util.ArrayList; import java.util.List; import io.rong.common.RLog; +import io.rong.imkit.GlideKitImageEngine; import io.rong.imkit.IMCenter; import io.rong.imkit.config.ConversationListBehaviorListener; import io.rong.imkit.config.RongConfigCenter; -import io.rong.imkit.conversationlist.ConversationListAdapter; import io.rong.imkit.conversationlist.model.BaseUiConversation; import io.rong.imkit.conversationlist.model.GatheredConversation; +import io.rong.imkit.conversationlist.model.SingleConversation; import io.rong.imkit.conversationlist.viewmodel.ConversationListViewModel; import io.rong.imkit.event.Event; import io.rong.imkit.model.NoticeContent; +import io.rong.imkit.userinfo.RongUserInfoManager; import io.rong.imkit.utils.RouteUtils; import io.rong.imkit.widget.FixedLinearLayoutManager; import io.rong.imkit.widget.adapter.BaseAdapter; import io.rong.imkit.widget.adapter.ViewHolder; +import io.rong.imkit.widget.dialog.OptionsPopupDialog; import io.rong.imkit.widget.refresh.SmartRefreshLayout; import io.rong.imkit.widget.refresh.api.RefreshLayout; import io.rong.imkit.widget.refresh.constant.RefreshState; import io.rong.imkit.widget.refresh.listener.OnLoadMoreListener; import io.rong.imkit.widget.refresh.listener.OnRefreshListener; import io.rong.imkit.widget.refresh.wrapper.RongRefreshHeader; +import io.rong.imlib.IRongCoreCallback; +import io.rong.imlib.IRongCoreEnum; +import io.rong.imlib.RongCoreClient; import io.rong.imlib.RongIMClient; import io.rong.imlib.model.Conversation; +import io.rong.imlib.model.UserInfo; /** * 消息-消息 @@ -72,40 +96,204 @@ public class MsgMessageFragment extends BaseFragment implements BaseAdapter.OnIt protected Handler mHandler = new Handler(Looper.getMainLooper()); protected boolean delayRefresh = false; + View notification, interaction, system; + + @Override + public void onDestroy() { + super.onDestroy(); + Bus.getOff(this); + } + + private class SwipeRunnable { + private int menuPosition; + private int adapterPosition; + + public SwipeRunnable(int menuPosition, int adapterPosition) { + this.menuPosition = menuPosition; + this.adapterPosition = adapterPosition; + } + } + + private SwipeRunnable swipeRunnable = null; + @Override public void initView(View itemView) { + Bus.getOn(this); mList = itemView.findViewById(R.id.recyclerView); mRefreshLayout = itemView.findViewById(R.id.swipeRefreshLayout); mAdapter = new MsgMessageRecyclerViewAdapter(); list = new ArrayList<>(); - initData(); mList.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)); mList.setSwipeMenuCreator(initSwipeMenuCreator()); - initMoreListener(); mList.setOnItemMenuClickListener(new OnItemMenuClickListener() { @Override public void onItemClick(SwipeMenuBridge menuBridge, int adapterPosition) { + swipeRunnable = new SwipeRunnable(menuBridge.getPosition(), adapterPosition); menuBridge.closeMenu(); - if (menuBridge.getPosition() == 0) { - BaseUiConversation conversation = mAdapter.getData().get(adapterPosition); - IMCenter.getInstance().setConversationToTop(Conversation.ConversationType.PRIVATE, conversation.mCore.getTargetId(), !conversation.mCore.isTop(), true, new RongIMClient.ResultCallback() { - @Override - public void onSuccess(Boolean aBoolean) { - } - - @Override - public void onError(RongIMClient.ErrorCode e) { + } + }); + mList.setOnItemMenuStateListener(new OnItemMenuStateListener() { + @Override + public void onMenuState(RecyclerView.ViewHolder viewHolder, int menuState) { + if (menuState == CLOSED && swipeRunnable != null) { + mHandler.postDelayed(() -> { + BaseUiConversation conversation = mAdapter.getData().get(swipeRunnable.adapterPosition); + if (swipeRunnable.menuPosition == 0) { + topItem(conversation, swipeRunnable.adapterPosition); + // ToastUtil.showDebug("置顶:" + mAdapter.getList().get(adapterPosition).getNickname()); + } else { + removeItem(conversation, swipeRunnable.adapterPosition); + // ToastUtil.showDebug("删除:" + mAdapter.getList().get(adapterPosition).getNickname()); + //mAdapter.getData().remove(adapterPosition); + //mAdapter.notifyDataSetChanged(); } - }); - // ToastUtil.showDebug("置顶:" + mAdapter.getList().get(adapterPosition).getNickname()); - } else { - // ToastUtil.showDebug("删除:" + mAdapter.getList().get(adapterPosition).getNickname()); - mAdapter.getData().remove(adapterPosition); - mAdapter.notifyDataSetChanged(); + swipeRunnable = null; + }, 100); } } }); + initListTop(); + initUserInfo(0); + initRongConfig(); + } + + private void initRongConfig() { + RongConfigCenter.featureConfig().setKitImageEngine(new GlideKitImageEngine() { + @Override + public void loadConversationListPortrait(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView, Conversation conversation) { + super.loadConversationListPortrait(context, url, imageView, conversation); + ImgLoader.displayAvatarForCircleCrop(context, url, imageView); + } + }); + } + + private void initUserInfo(long timer) { + RongIMClient.getInstance().getConversationListByPage(new RongIMClient.ResultCallback>() { + @Override + public void onSuccess(List conversations) { + long destructTime = 0; + for (Conversation conversation : conversations) { + String targetId = conversation.getTargetId(); + Log.i(TAG, "targetId = " + targetId); + UserInfo info = new UserInfo(targetId, "用户名" + targetId, Uri.parse("https://downs.yaoulive.com/avatar/12.jpg")); + JSONObject json = new JSONObject(); + json.put("sex", RandomUtil.nextInt(20) % 2); + json.put("age", RandomUtil.nextInt(40)); + info.setExtra(json.toJSONString()); + RongUserInfoManager.getInstance().refreshUserInfoCache(info); + if (conversations.size() < 10) { + destructTime = conversation.getSentTime(); + } + } + if (destructTime > 0) { + initUserInfo(destructTime); + } + } + + @Override + public void onError(RongIMClient.ErrorCode e) { + + } + }, timer, 10, Conversation.ConversationType.PRIVATE); + } + + + private void initListTop() { + + mAdapter.add(setTopData("官方通知", "测试", "12:00", null, 5), 0); + mAdapter.add(setTopData("互动消息", "测试2", "13:00", null, 0), 1); + mAdapter.add(setTopData("系统消息", "测试3", "14:00", null, 15), 2); + + + } + + private SingleConversation setTopData(String title, String content, String time, String avatar, int num) { + SingleConversation conversation = new SingleConversation(getContext(), new Conversation()); + conversation.mCore.setConversationType(Conversation.ConversationType.PRIVATE); + conversation.mCore.setSenderUserName(title); + conversation.mCore.setConversationTitle(title + "?"); + conversation.mConversationContent = new SpannableString(content); + conversation.mCore.setSentTime(System.currentTimeMillis()); + conversation.mCore.setUnreadMessageCount(num); + conversation.mCore.setTargetId("10000"); + return conversation; + } + + private void clearTopData() { + + } + + public void allRead() { + clearTopData(); + RongCoreClient.getInstance().getUnreadConversationList(new IRongCoreCallback.ResultCallback>() { + @Override + public void onSuccess(List conversations) { + for (Conversation conversation : conversations) { + if (conversation.getConversationType() != Conversation.ConversationType.PRIVATE) { + continue; + } + IMCenter.getInstance().clearMessagesUnreadStatus(conversation.getConversationType(), + conversation.getTargetId(), + new RongIMClient.ResultCallback() { + @Override + public void onSuccess(Boolean aBoolean) { + } + + @Override + public void onError(RongIMClient.ErrorCode e) { + System.out.println("标记失败:" + e.getMessage()); + } + }); + + } + } + + @Override + public void onError(IRongCoreEnum.CoreErrorCode e) { + System.err.println(e.getMessage() + "|" + e.code); + } + }, Conversation.ConversationType.PRIVATE); + + } + + /** + * 置顶会话 + */ + private void topItem(BaseUiConversation conversation, int adapterPosition) { + IMCenter.getInstance().setConversationToTop(conversation.getConversationIdentifier(), !conversation.mCore.isTop(), false, new RongIMClient.ResultCallback() { + @Override + public void onSuccess(Boolean aBoolean) { + Log.i(TAG, "置顶 onSuccess: " + aBoolean); + mList.requestLayout(); + mList.invalidate(); + } + + @Override + public void onError(RongIMClient.ErrorCode e) { + Log.e(TAG, "置顶 onError: " + e.code + "|" + e.msg); + } + }); + } + + /** + * 删除会话 + */ + private void removeItem(BaseUiConversation conversation, int adapterPosition) { + Conversation.ConversationType conversationType = conversation.mCore.getConversationType(); + String targetId = conversation.mCore.getTargetId(); + IMCenter.getInstance().removeConversation(conversationType, targetId, new RongIMClient.ResultCallback() { + @Override + public void onSuccess(Boolean aBoolean) { + Log.i(TAG, "删除 onSuccess: " + aBoolean); + //mRefreshLayout.postInvalidate(); + } + + @Override + public void onError(RongIMClient.ErrorCode e) { + Log.e(TAG, "删除 onError: " + e.code + "|" + e.msg); + } + }); } @Override @@ -204,13 +392,13 @@ public class MsgMessageFragment extends BaseFragment implements BaseAdapter.OnIt if (MsgMessageFragment.this.mRefreshLayout != null) { MsgMessageFragment.this.mRefreshLayout.finishLoadMore(); } else { - RLog.d(MsgMessageFragment.this.TAG, "onChanged finishLoadMore error"); + RLog.d(TAG, "onChanged finishLoadMore error"); } } else if (refreshEvent.state.equals(RefreshState.RefreshFinish)) { if (MsgMessageFragment.this.mRefreshLayout != null) { MsgMessageFragment.this.mRefreshLayout.finishRefresh(); } else { - RLog.d(MsgMessageFragment.this.TAG, "onChanged finishRefresh error"); + RLog.d(TAG, "onChanged finishRefresh error"); } } @@ -253,7 +441,7 @@ public class MsgMessageFragment extends BaseFragment implements BaseAdapter.OnIt BaseUiConversation baseUiConversation = (BaseUiConversation) this.mAdapter.getItem(position); ConversationListBehaviorListener listBehaviorListener = RongConfigCenter.conversationListConfig().getListener(); if (listBehaviorListener != null && listBehaviorListener.onConversationClick(view.getContext(), view, baseUiConversation)) { - RLog.d(this.TAG, "ConversationList item click event has been intercepted by App."); + RLog.d(TAG, "ConversationList item click event has been intercepted by App."); } else { if (baseUiConversation != null && baseUiConversation.mCore != null) { if (baseUiConversation instanceof GatheredConversation) { @@ -262,7 +450,7 @@ public class MsgMessageFragment extends BaseFragment implements BaseAdapter.OnIt RouteUtils.routeToConversationActivity(view.getContext(), baseUiConversation.getConversationIdentifier()); } } else { - RLog.e(this.TAG, "invalid conversation."); + RLog.e(TAG, "invalid conversation."); } } @@ -295,41 +483,10 @@ public class MsgMessageFragment extends BaseFragment implements BaseAdapter.OnIt return creator; } - private void initMoreListener() { - SwipeRecyclerView.LoadMoreListener moreListener = new SwipeRecyclerView.LoadMoreListener() { - @Override - public void onLoadMore() { - List tmp = - new ArrayList<>(list); - initData(); - tmp.addAll(list); - // mAdapter.setDataCollection(tmp); - list = new ArrayList<>(tmp); - mList.loadMoreFinish(false, true); - } - }; - mList.setLoadMoreListener(moreListener); - } - - - 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); + @Subscribe(threadMode = ThreadMode.MAIN) + public void busEvent(MessageMsgBusEvent event) { + if (event.getType() == MessageMsgBusEvent.TYPE_ALL_READ) { + allRead(); } } } diff --git a/OneToOne/src/main/java/com/shayu/onetoone/activity/login/EntryActivity.java b/OneToOne/src/main/java/com/shayu/onetoone/activity/login/EntryActivity.java index 3df91b69e..0d0023da3 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/activity/login/EntryActivity.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/activity/login/EntryActivity.java @@ -4,15 +4,12 @@ import static com.yunbao.common.CommonAppContext.home_zdy_img_cn; import static com.yunbao.common.CommonAppContext.home_zdy_img_us; import android.annotation.SuppressLint; -import android.app.Activity; import android.app.Dialog; -import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.Signature; import android.graphics.Paint; -import android.media.MediaPlayer; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -26,10 +23,8 @@ import android.view.WindowManager; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; -import android.widget.VideoView; import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; import com.alibaba.android.arouter.facade.annotation.Route; import com.alibaba.fastjson.JSON; @@ -58,7 +53,11 @@ import com.linecorp.linesdk.auth.LineAuthenticationParams; import com.linecorp.linesdk.auth.LineLoginApi; import com.linecorp.linesdk.auth.LineLoginResult; import com.shayu.onetoone.R; -import com.shayu.onetoone.utils.MainHttpUtil; +import com.shayu.onetoone.activity.AbsOTOActivity; +import com.shayu.onetoone.bean.JoinAnchorBean; +import com.shayu.onetoone.bean.UserBean; +import com.shayu.onetoone.manager.OTONetManager; +import com.shayu.onetoone.manager.RouteManager; import com.twitter.sdk.android.core.Callback; import com.twitter.sdk.android.core.DefaultLogger; import com.twitter.sdk.android.core.Result; @@ -74,13 +73,12 @@ import com.yunbao.common.Constants; import com.yunbao.common.HtmlConfig; import com.yunbao.common.activity.WebViewActivity; import com.yunbao.common.bean.FaceBookUpModel; +import com.yunbao.common.bean.HttpCallbackModel; import com.yunbao.common.bean.IMLoginModel; import com.yunbao.common.bean.LiveBean; import com.yunbao.common.bean.LoginData; -import com.yunbao.common.bean.UserBean; -import com.yunbao.common.http.HttpCallback; import com.yunbao.common.http.HttpClient; -import com.yunbao.common.http.LiveHttpUtil; +import com.yunbao.common.http.base.HttpCallback; import com.yunbao.common.http.main.MainNetManager; import com.yunbao.common.interfaces.CommonCallback; import com.yunbao.common.manager.IMLoginManager; @@ -89,6 +87,7 @@ import com.yunbao.common.manager.imrongcloud.RongcloudIMManager; import com.yunbao.common.utils.DialogUitl; import com.yunbao.common.utils.LiveRoomCheckLivePresenter; import com.yunbao.common.utils.RouteUtil; +import com.yunbao.common.utils.StringUtil; import com.yunbao.common.utils.ToastUtil; import org.greenrobot.eventbus.EventBus; @@ -105,21 +104,19 @@ import java.util.TimerTask; /** * 入口 */ -@Route(path = RouteUtil.PATH_ENTRY) -public class EntryActivity extends AppCompatActivity { +@Route(path = RouteManager.ACTIVITY_ENTRY) +public class EntryActivity extends AbsOTOActivity { private ImageView btn_phone, btn_line; private TextView btn_tip, btn_tip1, tv_customer; private TwitterLoginButton tt_login_button; private LinearLayout btn_google; - public static Activity activity; private static String mLoginType = Constants.MOB_PHONE;//登录方式 public String mPromoCode = "", UserID = "";//推广码 private String mUuidDevice = "";//手机唯一标识符 private static boolean mFirstLogin;//是否是第一次登录 private static boolean mShowInvite;//显示邀请码弹窗 - private static Context Contexts; private GoogleSignInClient mGoogleSignInClient; private LinearLayout lt_btn_twitter, lt_btn_facebook, lt_customer; private String kefuUrl = ""; @@ -146,11 +143,16 @@ public class EntryActivity extends AppCompatActivity { } } + @Override + protected int getLayoutId() { + return R.layout.activity_entry; + } + public void Get_hash_key() { PackageInfo info; try { - info = getPackageManager().getPackageInfo("com.pdlive.shayu", PackageManager.GET_SIGNATURES); + info = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigest md; md = MessageDigest.getInstance("SHA"); @@ -169,16 +171,12 @@ public class EntryActivity extends AppCompatActivity { } @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_entry); + protected void main(Bundle savedInstanceState) { if (getIntent().getBooleanExtra("forwardEntry", false)) { IMLoginManager.get(this).logout(this); ToastUtil.show(R.string.login_invalid); } Get_hash_key(); - activity = this; - Contexts = this; setStatusBar(); lt_btn_facebook = findViewById(R.id.lt_btn_facebook); lt_btn_twitter = findViewById(R.id.lt_btn_twitter); @@ -208,21 +206,19 @@ public class EntryActivity extends AppCompatActivity { btn_tip1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - WebViewActivity.forward(EntryActivity.this, HtmlConfig.LOGIN_PRIVCAY,false); + WebViewActivity.forward(EntryActivity.this, HtmlConfig.LOGIN_PRIVCAY, false); } }); btn_tip.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - WebViewActivity.forward(EntryActivity.this, HtmlConfig.LOGIN_PRIVCAY1,false); + WebViewActivity.forward(EntryActivity.this, HtmlConfig.LOGIN_PRIVCAY1, false); } }); - - EventBus.getDefault().register(this); getPromoCode(); @@ -237,13 +233,13 @@ public class EntryActivity extends AppCompatActivity { } timerOutBtn(view); MainNetManager.get(EntryActivity.this) - .FaceBookUp(new com.yunbao.common.http.base.HttpCallback() { + .FaceBookUp(new HttpCallback() { @Override public void onSuccess(FaceBookUpModel data) { if (data.getType().equals("0")) { LoginManager.getInstance().logInWithReadPermissions(EntryActivity.this, Arrays.asList("public_profile")); } else { - WebViewActivity.forward(EntryActivity.this, data.getLink() + "?",false); + WebViewActivity.forward(EntryActivity.this, data.getLink() + "?", false); } } @@ -362,23 +358,25 @@ public class EntryActivity extends AppCompatActivity { public void onClick(View v) { if (!"".equals(kefuUrl)) { Constants.LoginKefu = true; - WebViewActivity.forward(EntryActivity.this, kefuUrl,false); + WebViewActivity.forward(EntryActivity.this, kefuUrl, false); } } }); } private void getUrl() { - MainHttpUtil.getCustomerService(new HttpCallback() { - @Override - public void onSuccess(int code, String msg, String[] info) { - if (info != null) { - if (info.length > 0) { - kefuUrl = info[0]; + OTONetManager.getInstance(mContext) + .getCustomerService(new HttpCallback() { + @Override + public void onSuccess(String data) { + kefuUrl = data; } - } - } - }); + + @Override + public void onError(String error) { + + } + }); } private void twitterLoginSet() { @@ -558,9 +556,9 @@ public class EntryActivity extends AppCompatActivity { super.onResume(); } - public static void ToLogin() { - activity.startActivity(new Intent(activity, LoginActivity.class)); - activity.finish(); + public void ToLogin() { + RouteManager.forwardLoginActivity(); + finish(); } private static final String EMAIL = "email"; @@ -573,39 +571,36 @@ public class EntryActivity extends AppCompatActivity { if (CommonAppConfig.IS_GOOGLE_PLAY == true) { mPromoCode = ""; } - MainHttpUtil.loginByThird(UserID, data.getOpenID(), mPromoCode, mUuidDevice, data.getNickName(), data.getAvatar(), data.getType(), new HttpCallback() { - @Override - public void onSuccess(int code, String msg, String[] info) { - onLoginSuccess(code, msg, info); - } - }); + OTONetManager.getInstance(mContext) + .userLoginByThird(UserID, data.getOpenID(), mPromoCode, mUuidDevice, data.getNickName(), data.getAvatar(), data.getType(), + new HttpCallback() { + @Override + public void onSuccess(IMLoginModel data) { + onLoginSuccess(data); + } + + @Override + public void onError(String error) { + + } + }); + } //登录成功! - private void onLoginSuccess(int code, String msg, String[] info) { - Log.e("他", code + "code" + info.toString()); - if (code == 0 && info.length > 0) { - - JSONObject obj = JSON.parseObject(info[0]); - String uid = obj.getString("id"); - String token = obj.getString("token"); - if (obj.containsKey("need_bind") && obj.getString("need_bind").equals("0")) { - 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(activity).setupLoginUser(model); - //融云连接服务器 - RongcloudIMManager.connectIM(activity); - getBaseUserInfo(); - - } else { -// Contexts.startActivity(new Intent(Contexts, BindUserActivity.class).putExtra("uid", uid).putExtra("token", token)); - } - } else { - ToastUtil.show(msg + "11212"); + private void onLoginSuccess(IMLoginModel data) { + String uid = data.getId() + ""; + String token = data.getToken(); + if (data.getNeedBind() == 0) { + mFirstLogin = data.getFirstLogin() == 1; + mShowInvite = data.getIsagent() == 1; + CommonAppConfig.getInstance().setLoginInfo(uid, token, true); + //设置登录信息 + IMLoginManager.get(mContext).setupLoginUser(data); + //融云连接服务器 + RongcloudIMManager.connectIM(mContext); + getBaseUserInfo(); } } @@ -613,78 +608,52 @@ public class EntryActivity extends AppCompatActivity { * 获取用户信息 */ private void getBaseUserInfo() { - MainHttpUtil.getBaseInfo(new CommonCallback() { - @Override - public void callback(UserBean bean) { - - if (mFirstLogin) { - if (CommonAppConfig.IS_GOOGLE_PLAY == true) { -// EntryActivity.this.startActivity(new Intent(EntryActivity.this, OneLoginActivity.class)); - } else { - HttpClient.getInstance().post("Home.getRandJoinAnchor", "Home.getRandJoinAnchor") - .execute(new HttpCallback() { - @Override - public void onSuccess(int code, String msg, String[] info) { - if (info[0] != null) { - JSONObject obj = JSON.parseObject(info[0]); - IMLoginManager.get(EntryActivity.this).setNewUserGif(true); - IMLoginManager.get(EntryActivity.this).setisNewUserOne(true); + OTONetManager.getInstance(mContext) + .getBaseInfos(true,new HttpCallback() { + @Override + public void onSuccess(UserBean data) { + if (mFirstLogin) { + if (CommonAppConfig.IS_GOOGLE_PLAY) { + RouteManager.forwardMainActivity(); + } else { + OTONetManager.getInstance(mContext) + .getRandJoinAnchor(new HttpCallback() { + @Override + public void onSuccess(JoinAnchorBean data) { + IMLoginManager.get(EntryActivity.this).setNewUserGif(true); + IMLoginManager.get(EntryActivity.this).setisNewUserOne(true); // MainActivity.forward(EntryActivity.this, false); - gotoLive(obj.getString("anchor_id")); - if (obj.containsKey("home_zdy_img_us")) { - home_zdy_img_us = obj.getString("home_zdy_img_us"); - home_zdy_img_cn = obj.getString("home_zdy_img_cn"); - } - if (obj.containsKey("home_zdy_pop")) { - NoviceInstructorManager.get(activity).setHomeZdyPop(obj.getString( - "home_zdy_pop")); + if (!StringUtil.isEmpty(data.getHome_zdy_img_us())) { + home_zdy_img_us = data.getHome_zdy_img_us(); + home_zdy_img_cn = data.getHome_zdy_img_cn(); + } + if (!StringUtil.isEmpty(data.getHome_zdy_pop())) { + NoviceInstructorManager.get(mContext).setHomeZdyPop(data.getHome_zdy_pop()); + } + RouteManager.forwardMainActivity(); } - } else { -// MainActivity.forward(EntryActivity.this, false); - } - } - }); + @Override + public void onError(String error) { + + } + }); + } + + } else { + RouteManager.forwardMainActivity(); + } + finish(); } - } else { -// MainActivity.forward(EntryActivity.this, false); - } - EntryActivity.activity.finish(); - } - }); + + @Override + public void onError(String error) { + + } + }); } - private void gotoLive(final String live_id) { - LiveHttpUtil.getLiveInfo(live_id, new HttpCallback() { - @Override - public void onSuccess(int code, String msg, String[] info) { - if (code == 0 && info.length > 0) { - LiveBean liveBean = JSON.parseObject(info[0], LiveBean.class); - if (liveBean == null) { - return; - } - new LiveRoomCheckLivePresenter(activity, liveBean.getUid(), liveBean.getStream(), new LiveRoomCheckLivePresenter.NewActionListener() { - @Override - public void onLiveRoomChanged(String liveUid, String stream, int liveType, String liveTypeVal, String liveSdk) { - RouteUtil.forwardLiveAudienceActivity(liveBean, liveType, Integer.parseInt(liveSdk), Integer.parseInt(liveTypeVal)); - } - - @Override - public void onCheckError(String contextError) { - - } - }); - NoviceInstructorManager.get(activity).setFrist(false); - - - } else { -// MainActivity.forward(EntryActivity.this, false); - } - } - }); - } - private void timerOutBtn(View btn) { if (mBtnClick) { return; diff --git a/OneToOne/src/main/java/com/shayu/onetoone/activity/login/LoginActivity.java b/OneToOne/src/main/java/com/shayu/onetoone/activity/login/LoginActivity.java index 097c8db80..2a421a913 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/activity/login/LoginActivity.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/activity/login/LoginActivity.java @@ -7,6 +7,7 @@ import android.animation.ObjectAnimator; import android.app.Activity; import android.content.Context; import android.content.Intent; +import android.os.Bundle; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; @@ -28,7 +29,11 @@ import com.fm.openinstall.listener.AppInstallAdapter; import com.fm.openinstall.model.AppData; import com.lzy.okgo.model.Response; import com.shayu.onetoone.R; +import com.shayu.onetoone.activity.AbsOTOActivity; import com.shayu.onetoone.activity.MainActivity; +import com.shayu.onetoone.bean.JoinAnchorBean; +import com.shayu.onetoone.manager.OTONetManager; +import com.shayu.onetoone.manager.RouteManager; import com.shayu.onetoone.utils.MainHttpUtil; import com.yunbao.common.CommonAppConfig; import com.yunbao.common.CommonAppContext; @@ -55,6 +60,7 @@ import com.yunbao.common.manager.NoviceInstructorManager; import com.yunbao.common.manager.imrongcloud.RongcloudIMManager; import com.yunbao.common.utils.LiveRoomCheckLivePresenter; import com.yunbao.common.utils.RouteUtil; +import com.yunbao.common.utils.StringUtil; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.views.weight.ViewClicksAntiShake; @@ -67,8 +73,8 @@ import org.greenrobot.eventbus.ThreadMode; /** * Created by cxf on 2018/9/17. */ -@Route(path = RouteUtil.PATH_LOGIN) -public class LoginActivity extends AbsActivity { +@Route(path = RouteManager.ACTIVITY_LOGIN) +public class LoginActivity extends AbsOTOActivity { private View mRoot; // private ImageView mBg; @@ -94,6 +100,7 @@ public class LoginActivity extends AbsActivity { return R.layout.activity_login; } + // @Subscribe(threadMode = ThreadMode.MAIN) // public void onRegSuccessEvent(RegSuccessEvent e) { // if (!isFinishing()) { @@ -102,7 +109,7 @@ public class LoginActivity extends AbsActivity { // } @Override - protected void main() { + protected void main(Bundle savedInstanceState) { EventBus.getDefault().register(this); initUserArea(); mRoot = findViewById(R.id.root); @@ -176,13 +183,6 @@ public class LoginActivity extends AbsActivity { } - public static void forward() { - Intent intent = new Intent(CommonAppContext.sInstance, LoginActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - CommonAppContext.sInstance.startActivity(intent); - } - - public void loginClick(View v) { ViewClicksAntiShake.clicksAntiShake(v, new ViewClicksAntiShake.ViewClicksCallBack() { @Override @@ -235,12 +235,19 @@ public class LoginActivity extends AbsActivity { loadingDialog = new LoadingDialog(); loadingDialog.show(getSupportFragmentManager(), "LoadingDialog"); loadingDialog.setShowText(getString(R.string.login_ing)); - MainHttpUtil.login(phoneNum, pwd, uuid, new HttpCallback() { - @Override - public void onSuccess(int code, String msg, String[] info) { - onLoginSuccess(code, msg, info); - } - }); + OTONetManager.getInstance(mContext) + .login(phoneNum, pwd, uuid, new com.yunbao.common.http.base.HttpCallback() { + @Override + public void onSuccess(IMLoginModel data) { + onLoginSuccess(data); + } + + @Override + public void onError(String error) { + ToastUtil.show(error); + loadingDialog.dismiss(); + } + }); hideKeyboard(mEditPwd); } @@ -256,102 +263,66 @@ public class LoginActivity extends AbsActivity { //登录即代表同意服务和隐私条款 private void forwardTip() { - WebViewActivity.forward(mContext, HtmlConfig.LOGIN_PRIVCAY,false); + WebViewActivity.forward(mContext, HtmlConfig.LOGIN_PRIVCAY, false); } - private void gotoLive(final String live_id) { - LiveHttpUtil.getLiveInfo(live_id, new HttpCallback() { - @Override - public void onSuccess(int code, String msg, String[] info) { - if (code == 0 && info.length > 0) { - LiveBean liveBean = JSON.parseObject(info[0], LiveBean.class); - if (liveBean == null) { - return; - } - new LiveRoomCheckLivePresenter(mContext, liveBean.getUid(), liveBean.getStream(), new LiveRoomCheckLivePresenter.NewActionListener() { - @Override - public void onLiveRoomChanged(String liveUid, String stream, int liveType, String liveTypeVal, String liveSdk) { - RouteUtil.forwardLiveAudienceActivity(liveBean, liveType, Integer.parseInt(liveSdk), Integer.parseInt(liveTypeVal)); - } - - @Override - public void onCheckError(String contextError) { - - } - }); - NoviceInstructorManager.get(activity).setFrist(false); - - } else { -// MainActivity.forward(LoginActivity.this, false); - } - } - }); - } - //登录成功! - private void onLoginSuccess(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(activity).setupLoginUser(model); - getBaseUserInfo(); - } else { - ToastUtil.show(msg); - loadingDialog.dismiss(); - } + private void onLoginSuccess(IMLoginModel data) { + String uid = data.getId() + ""; + String token = data.getToken(); + mFirstLogin = data.getFirstLogin() == 1; + mShowInvite = data.getIsagent() == 1; + CommonAppConfig.getInstance().setLoginInfo(uid, token, true); + //设置登录信息 + IMLoginManager.get(activity).setupLoginUser(data); + getBaseUserInfo(); } /** * 获取用户信息 */ private void getBaseUserInfo() { - MainHttpUtil.getBaseInfo(new CommonCallback() { - @Override - public void callback(UserBean bean) { - //融云连接服务器 - RongcloudIMManager.connectIM(activity); - HttpClient.getInstance().post("Home.getRandJoinAnchor", "Home.getRandJoinAnchor") - .execute(new HttpCallback() { - @Override - public void onSuccess(int code, String msg, String[] info) { - if (info != null && info.length > 0 && info[0] != null && mFirstLogin) { - JSONObject obj = JSON.parseObject(info[0]); - if (obj.containsKey("home_zdy_img_us")) { - home_zdy_img_us = obj.getString("home_zdy_img_us"); - home_zdy_img_cn = obj.getString("home_zdy_img_cn"); + OTONetManager.getInstance(mContext) + .getBaseInfos(true, new com.yunbao.common.http.base.HttpCallback() { + @Override + public void onSuccess(com.shayu.onetoone.bean.UserBean data) { + RongcloudIMManager.connectIM(mContext); + OTONetManager.getInstance(mContext) + .getRandJoinAnchor(new com.yunbao.common.http.base.HttpCallback() { + @Override + public void onSuccess(JoinAnchorBean data) { + if (mFirstLogin) { + IMLoginManager.get(mContext).setNewUserGif(true); + IMLoginManager.get(mContext).setisNewUserOne(true); +// MainActivity.forward(EntryActivity.this, false); + if (!StringUtil.isEmpty(data.getHome_zdy_img_us())) { + home_zdy_img_us = data.getHome_zdy_img_us(); + home_zdy_img_cn = data.getHome_zdy_img_cn(); + } + if (!StringUtil.isEmpty(data.getHome_zdy_pop())) { + NoviceInstructorManager.get(mContext).setHomeZdyPop(data.getHome_zdy_pop()); + } + IMLoginManager.get(mContext).setisNewUserOne(true); + IMLoginManager.get(mContext).setNewUserGif(true); + } + loadingDialog.dismiss(); + RouteManager.forwardMainActivity(); + finish(); } - startActivity(new Intent(LoginActivity.this,MainActivity.class)); - gotoLive(obj.getString("anchor_id")); - IMLoginManager.get(mContext).setisNewUserOne(true); - IMLoginManager.get(mContext).setNewUserGif(true); - if (obj.containsKey("home_zdy_pop")) { - NoviceInstructorManager.get(mContext).setHomeZdyPop(obj.getString("home_zdy_pop")); + + @Override + public void onError(String error) { + ToastUtil.show(error); } - } else { - startActivity(new Intent(LoginActivity.this,MainActivity.class)); - } - loadingDialog.dismiss(); - finish(); + }); + } - } + @Override + public void onError(String error) { - @Override - public void onError(Response response) { - super.onError(response); - String message = response.message(); - System.out.println(">>>>>" + message); - } - }); - - } - }); + } + }); } diff --git a/OneToOne/src/main/java/com/shayu/onetoone/adapter/MsgMessageRecyclerViewAdapter.java b/OneToOne/src/main/java/com/shayu/onetoone/adapter/MsgMessageRecyclerViewAdapter.java index 6a7831027..9ba773252 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/adapter/MsgMessageRecyclerViewAdapter.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/adapter/MsgMessageRecyclerViewAdapter.java @@ -1,21 +1,14 @@ package com.shayu.onetoone.adapter; -import android.content.Context; import android.text.SpannableString; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; -import com.shayu.onetoone.R; -import com.shayu.onetoone.bean.MsgMessageBean; -import com.yunbao.common.glide.ImgLoader; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import io.rong.imkit.conversationlist.ConversationListAdapter; import io.rong.imkit.conversationlist.model.BaseUiConversation; @@ -27,19 +20,43 @@ import io.rong.imlib.model.Conversation; * 聊天列表适配器 */ public class MsgMessageRecyclerViewAdapter extends ConversationListAdapter { + List conversationList = null; + Map map = new HashMap<>(); + @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { - BaseUiConversation uiConversation = mDataList.get(position); - if (uiConversation.mCore.getConversationType() == Conversation.ConversationType.PRIVATE) { - SingleConversation conversation = (SingleConversation) uiConversation; - if (conversation.mConversationContent.length() >= 6) { - conversation.mConversationContent = new SpannableString(conversation.mConversationContent.toString().substring(0, 6) + "...·"); - } else { - conversation.mConversationContent = new SpannableString(conversation.mConversationContent.toString() + " ·"); - } - } else if (uiConversation.mCore.getConversationType() == Conversation.ConversationType.GROUP) { - mDataList.remove(position); - } + super.onBindViewHolder(holder, position); } + + @Override + public void setDataCollection(List data) { + List tmp = new ArrayList<>(); + if(conversationList!=null) { + tmp.addAll(conversationList); + } + for (BaseUiConversation datum : data) { + if (datum.mCore.getConversationType() == Conversation.ConversationType.PRIVATE) { + SingleConversation conversation = (SingleConversation) datum; + if (conversation.mConversationContent.length() >= 6) { + conversation.mConversationContent = new SpannableString(conversation.mConversationContent.toString().substring(0, 6) + "...·"); + } else { + conversation.mConversationContent = new SpannableString(conversation.mConversationContent.toString() + "·"); + } + tmp.add(datum); + } + } + for (BaseUiConversation conversation : map.keySet()) { + if ( map.get(conversation) >= tmp.size()) { + tmp.add(conversation); + }else{ + tmp.add(map.get(conversation),conversation); + } + } + super.setDataCollection(tmp); + } + + public void add(SingleConversation item, int position) { + map.put(item, position); + } } diff --git a/OneToOne/src/main/java/com/shayu/onetoone/bean/JoinAnchorBean.java b/OneToOne/src/main/java/com/shayu/onetoone/bean/JoinAnchorBean.java new file mode 100644 index 000000000..30c7645f6 --- /dev/null +++ b/OneToOne/src/main/java/com/shayu/onetoone/bean/JoinAnchorBean.java @@ -0,0 +1,54 @@ +package com.shayu.onetoone.bean; + +import com.yunbao.common.bean.BaseModel; + +public class JoinAnchorBean extends BaseModel { + private String anchor_id; + private String anchor_stream; + private String home_zdy_img_us; + private String home_zdy_img_cn; + private String home_zdy_pop; + + public JoinAnchorBean() { + } + + public String getAnchor_id() { + return anchor_id; + } + + public void setAnchor_id(String anchor_id) { + this.anchor_id = anchor_id; + } + + public String getAnchor_stream() { + return anchor_stream; + } + + public void setAnchor_stream(String anchor_stream) { + this.anchor_stream = anchor_stream; + } + + public String getHome_zdy_img_us() { + return home_zdy_img_us; + } + + public void setHome_zdy_img_us(String home_zdy_img_us) { + this.home_zdy_img_us = home_zdy_img_us; + } + + public String getHome_zdy_img_cn() { + return home_zdy_img_cn; + } + + public void setHome_zdy_img_cn(String home_zdy_img_cn) { + this.home_zdy_img_cn = home_zdy_img_cn; + } + + public String getHome_zdy_pop() { + return home_zdy_pop; + } + + public void setHome_zdy_pop(String home_zdy_pop) { + this.home_zdy_pop = home_zdy_pop; + } +} diff --git a/OneToOne/src/main/java/com/shayu/onetoone/bean/UserBean.java b/OneToOne/src/main/java/com/shayu/onetoone/bean/UserBean.java new file mode 100644 index 000000000..6914c2f7b --- /dev/null +++ b/OneToOne/src/main/java/com/shayu/onetoone/bean/UserBean.java @@ -0,0 +1,428 @@ +package com.shayu.onetoone.bean; + + +import com.yunbao.common.bean.BaseModel; +import com.yunbao.common.bean.IMLoginModel; + +public class UserBean extends BaseModel { + IMLoginModel user; + UserInfo info; + UserLevel level; + + public UserBean() { + } + + public IMLoginModel getUser() { + return user; + } + + public void setUser(IMLoginModel user) { + this.user = user; + } + + public UserInfo getInfo() { + return info; + } + + public void setInfo(UserInfo info) { + this.info = info; + } + + public UserLevel getLevel() { + return level; + } + + public void setLevel(UserLevel level) { + this.level = level; + } + + public static class UserInfo{ + private int id; + private String label_id; + private String cn_label; + private String en_label; + private int first_mate; + private long create_time; + private long update_time; + private int sex; + private int b_y; + private int b_ym; + private int b_ymd; + private int name_auth; + private long name_auth_time; + private String auth_front; + private String auth_back; + private String auth_remark; + private int sage_auth; + private long sage_auth_time; + private int is_hot; + private String vodie_price; + private String price; + private int star; + private String area; + private int is_hello; + private String star_name; + + public UserInfo() { + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getLabel_id() { + return label_id; + } + + public void setLabel_id(String label_id) { + this.label_id = label_id; + } + + public String getCn_label() { + return cn_label; + } + + public void setCn_label(String cn_label) { + this.cn_label = cn_label; + } + + public String getEn_label() { + return en_label; + } + + public void setEn_label(String en_label) { + this.en_label = en_label; + } + + public int getFirst_mate() { + return first_mate; + } + + public void setFirst_mate(int first_mate) { + this.first_mate = first_mate; + } + + public long getCreate_time() { + return create_time; + } + + public void setCreate_time(long create_time) { + this.create_time = create_time; + } + + public long getUpdate_time() { + return update_time; + } + + public void setUpdate_time(long update_time) { + this.update_time = update_time; + } + + public int getSex() { + return sex; + } + + public void setSex(int sex) { + this.sex = sex; + } + + public int getB_y() { + return b_y; + } + + public void setB_y(int b_y) { + this.b_y = b_y; + } + + public int getB_ym() { + return b_ym; + } + + public void setB_ym(int b_ym) { + this.b_ym = b_ym; + } + + public int getB_ymd() { + return b_ymd; + } + + public void setB_ymd(int b_ymd) { + this.b_ymd = b_ymd; + } + + public int getName_auth() { + return name_auth; + } + + public void setName_auth(int name_auth) { + this.name_auth = name_auth; + } + + public long getName_auth_time() { + return name_auth_time; + } + + public void setName_auth_time(long name_auth_time) { + this.name_auth_time = name_auth_time; + } + + public String getAuth_front() { + return auth_front; + } + + public void setAuth_front(String auth_front) { + this.auth_front = auth_front; + } + + public String getAuth_back() { + return auth_back; + } + + public void setAuth_back(String auth_back) { + this.auth_back = auth_back; + } + + public String getAuth_remark() { + return auth_remark; + } + + public void setAuth_remark(String auth_remark) { + this.auth_remark = auth_remark; + } + + public int getSage_auth() { + return sage_auth; + } + + public void setSage_auth(int sage_auth) { + this.sage_auth = sage_auth; + } + + public long getSage_auth_time() { + return sage_auth_time; + } + + public void setSage_auth_time(long sage_auth_time) { + this.sage_auth_time = sage_auth_time; + } + + public int getIs_hot() { + return is_hot; + } + + public void setIs_hot(int is_hot) { + this.is_hot = is_hot; + } + + public String getVodie_price() { + return vodie_price; + } + + public void setVodie_price(String vodie_price) { + this.vodie_price = vodie_price; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public int getStar() { + return star; + } + + public void setStar(int star) { + this.star = star; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public int getIs_hello() { + return is_hello; + } + + public void setIs_hello(int is_hello) { + this.is_hello = is_hello; + } + + public String getStar_name() { + return star_name; + } + + public void setStar_name(String star_name) { + this.star_name = star_name; + } + } + + public static class UserLevel{ + private int id; + private int wealth; + private int wealth_level; + private int charm; + private int charm_level; + private int level; + private int exp; + private long wealth_update; + private long wealth_level_update; + private long charm_update; + private long charm_level_update; + private long exp_update; + private long level_update; + private long create_time; + private String icon; + private String charm_icon; + private String wealth_icon; + + public UserLevel() { + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getWealth() { + return wealth; + } + + public void setWealth(int wealth) { + this.wealth = wealth; + } + + public int getWealth_level() { + return wealth_level; + } + + public void setWealth_level(int wealth_level) { + this.wealth_level = wealth_level; + } + + public int getCharm() { + return charm; + } + + public void setCharm(int charm) { + this.charm = charm; + } + + public int getCharm_level() { + return charm_level; + } + + public void setCharm_level(int charm_level) { + this.charm_level = charm_level; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public int getExp() { + return exp; + } + + public void setExp(int exp) { + this.exp = exp; + } + + public long getWealth_update() { + return wealth_update; + } + + public void setWealth_update(long wealth_update) { + this.wealth_update = wealth_update; + } + + public long getWealth_level_update() { + return wealth_level_update; + } + + public void setWealth_level_update(long wealth_level_update) { + this.wealth_level_update = wealth_level_update; + } + + public long getCharm_update() { + return charm_update; + } + + public void setCharm_update(long charm_update) { + this.charm_update = charm_update; + } + + public long getCharm_level_update() { + return charm_level_update; + } + + public void setCharm_level_update(long charm_level_update) { + this.charm_level_update = charm_level_update; + } + + public long getExp_update() { + return exp_update; + } + + public void setExp_update(long exp_update) { + this.exp_update = exp_update; + } + + public long getLevel_update() { + return level_update; + } + + public void setLevel_update(long level_update) { + this.level_update = level_update; + } + + public long getCreate_time() { + return create_time; + } + + public void setCreate_time(long create_time) { + this.create_time = create_time; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getCharm_icon() { + return charm_icon; + } + + public void setCharm_icon(String charm_icon) { + this.charm_icon = charm_icon; + } + + public String getWealth_icon() { + return wealth_icon; + } + + public void setWealth_icon(String wealth_icon) { + this.wealth_icon = wealth_icon; + } + } +} diff --git a/OneToOne/src/main/java/com/shayu/onetoone/dialog/MsgMoreDialog.java b/OneToOne/src/main/java/com/shayu/onetoone/dialog/MsgMoreDialog.java index eb156e2c2..80f847986 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/dialog/MsgMoreDialog.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/dialog/MsgMoreDialog.java @@ -7,7 +7,9 @@ import androidx.annotation.NonNull; import com.lxj.xpopup.core.AttachPopupView; import com.shayu.onetoone.R; +import com.shayu.onetoone.event.MessageMsgBusEvent; import com.shayu.onetoone.manager.RouteManager; +import com.yunbao.common.utils.Bus; /** * 消息右上角更多菜单 @@ -39,7 +41,7 @@ public class MsgMoreDialog extends AttachPopupView implements View.OnClickListen if (id == R.id.ll_config) { RouteManager.forwardMsgMoreConfigActivity(); } else if (id == R.id.ll_read) { - + Bus.get().post(new MessageMsgBusEvent(MessageMsgBusEvent.TYPE_ALL_READ)); } dismiss(); } diff --git a/OneToOne/src/main/java/com/shayu/onetoone/event/AbsBusEvent.java b/OneToOne/src/main/java/com/shayu/onetoone/event/AbsBusEvent.java new file mode 100644 index 000000000..c45d1cd53 --- /dev/null +++ b/OneToOne/src/main/java/com/shayu/onetoone/event/AbsBusEvent.java @@ -0,0 +1,26 @@ +package com.shayu.onetoone.event; + +public abstract class AbsBusEvent { + private int type; + private String content; + + public AbsBusEvent(int type) { + this.type = type; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } +} diff --git a/OneToOne/src/main/java/com/shayu/onetoone/event/MessageMsgBusEvent.java b/OneToOne/src/main/java/com/shayu/onetoone/event/MessageMsgBusEvent.java new file mode 100644 index 000000000..22c71085b --- /dev/null +++ b/OneToOne/src/main/java/com/shayu/onetoone/event/MessageMsgBusEvent.java @@ -0,0 +1,9 @@ +package com.shayu.onetoone.event; + +public class MessageMsgBusEvent extends AbsBusEvent { + public static final int TYPE_ALL_READ = 0; + + public MessageMsgBusEvent(int type) { + super(type); + } +} diff --git a/OneToOne/src/main/java/com/shayu/onetoone/manager/OTONetManager.java b/OneToOne/src/main/java/com/shayu/onetoone/manager/OTONetManager.java index 3f7170245..1475745d6 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/manager/OTONetManager.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/manager/OTONetManager.java @@ -1,11 +1,20 @@ package com.shayu.onetoone.manager; import android.content.Context; +import android.util.Log; -import com.yunbao.common.bean.GiftNamingInfoModel; -import com.yunbao.common.http.API; +import com.shayu.onetoone.bean.JoinAnchorBean; +import com.shayu.onetoone.bean.UserBean; +import com.shayu.onetoone.network.API; +import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.bean.BaseModel; +import com.yunbao.common.bean.HttpCallbackModel; +import com.yunbao.common.bean.IMLoginModel; import com.yunbao.common.http.ResponseModel; import com.yunbao.common.http.base.HttpCallback; +import com.yunbao.common.utils.MD5Util; + +import java.util.List; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.functions.Consumer; @@ -15,9 +24,13 @@ import io.reactivex.schedulers.Schedulers; * 网络管理类 使用参考{@link com.yunbao.common.http.live.LiveNetManager} */ public class OTONetManager { + private static final String TAG = "网络请求"; + private static final String SALT = "76576076c1f5f657b634e966c8836a06"; + private static final String DEVICE = "android"; private Context mContext; private static OTONetManager mInstance; + private OTONetManager(Context context) { this.mContext = context; } @@ -28,29 +41,141 @@ public class OTONetManager { } return mInstance; } -//示例 -/* - public void getGiftNamingInfo(String giftId, HttpCallback callback) { - API.get().pdLiveApi(mContext) - .getGiftNamingInfo(giftId) + + /** + * 手机号登录 + */ + public void login(String phoneNum, String pwd, String uuid, HttpCallback callback) { + API.get().otoApi(mContext).loginByManager(phoneNum, pwd, uuid, "", "Android") .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Consumer>() { + .subscribe(new Consumer>() { @Override - public void accept(ResponseModel liveGiftBeanResponseModel) throws Exception { - if (callback!=null){ + public void accept(ResponseModel imLoginModelResponseModel) throws Exception { + if (callback != null) { + IMLoginModel model = imLoginModelResponseModel.getData().getInfo(); + callback.onSuccess(model); + } + } + }, throwable -> { + Log.e(TAG, "accept: ", throwable); + if (callback != null) { + callback.onError(throwable.getMessage()); + } + }).isDisposed(); + } + + public void getBaseInfos(boolean isLogin, HttpCallback callback) { + API.get().otoApi(mContext) + .getBaseInfos(isLogin ? 1 : 0) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Consumer>() { + @Override + public void accept(ResponseModel liveGiftBeanResponseModel) throws Exception { + if (callback != null) { callback.onSuccess(liveGiftBeanResponseModel.getData().getInfo()); } } }, new Consumer() { @Override public void accept(Throwable throwable) throws Exception { + Log.e(TAG, "accept: ", throwable); if (callback != null) { callback.onError(mContext.getString(com.yunbao.common.R.string.net_error)); } } }).isDisposed(); } -*/ + + public void getRandJoinAnchor(HttpCallback callback) { + API.get().otoApi(mContext) + .getRandJoinAnchor() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Consumer>>() { + @Override + public void accept(ResponseModel> model) throws Exception { + if (callback != null) { + callback.onSuccess(model.getData().getInfo().get(0)); + } + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + Log.e(TAG, "accept: ", throwable); + if (callback != null) { + callback.onError(mContext.getString(com.yunbao.common.R.string.net_error)); + } + } + }).isDisposed(); + } + + public void getCustomerService(HttpCallback callback) { + API.get().otoApi(mContext) + .getCustomerService() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Consumer>>() { + @Override + public void accept(ResponseModel> model) throws Exception { + if (callback != null) { + callback.onSuccess(model.getData().getInfo().get(0)); + } + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + Log.e(TAG, "accept: ", throwable); + if (callback != null) { + callback.onError(mContext.getString(com.yunbao.common.R.string.net_error)); + } + } + }).isDisposed(); + } + + public void userLoginByThird(String uid, + String openId, + String promCode, + String uuid, + String nickName, + String avatar, + String type, + HttpCallback callback) { + String sign = MD5Util.getMD5("openid=" + openId + "&" + SALT); + API.get().otoApi(mContext) + .userLoginByThird(uid, + openId, + promCode, + uuid, + nickName, + avatar, + CommonAppConfig.IS_GOOGLE_PLAY ? "1" : "3", + DEVICE, + sign, + "Android", + type, + "" + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Consumer>() { + @Override + public void accept(ResponseModel model) throws Exception { + if (callback != null) { + callback.onSuccess(model.getData().getInfo()); + } + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + Log.e(TAG, "accept: ", throwable); + if (callback != null) { + callback.onError(mContext.getString(com.yunbao.common.R.string.net_error)); + } + } + }).isDisposed(); + } + } diff --git a/OneToOne/src/main/java/com/shayu/onetoone/manager/RouteManager.java b/OneToOne/src/main/java/com/shayu/onetoone/manager/RouteManager.java index 63958998d..d4474d2d9 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/manager/RouteManager.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/manager/RouteManager.java @@ -9,7 +9,8 @@ public class RouteManager { public static final String ACTIVITY_MAIN = "/activity/MainActivity"; //主页 public static final String ACTIVITY_MSG_MORE_CONFIG_ACTIVITY = "/activity/MsgMoreConfigActivity";//打招呼页面 public static final String ACTIVITY_MSG_CHAT = "/activity/ChatActivity";//聊天页面 - + public static final String ACTIVITY_ENTRY = "/activity/EntryActivity"; + public static final String ACTIVITY_LOGIN = "/activity/LoginActivity"; public static void forwardMainActivity() { ARouter.getInstance().build(ACTIVITY_MAIN) @@ -25,4 +26,13 @@ public class RouteManager { ARouter.getInstance().build(ACTIVITY_MSG_CHAT) .navigation(); } + + public static void forwardEntryActivity() { + ARouter.getInstance().build(ACTIVITY_ENTRY) + .navigation(); + } + public static void forwardLoginActivity() { + ARouter.getInstance().build(ACTIVITY_LOGIN) + .navigation(); + } } diff --git a/OneToOne/src/main/java/com/shayu/onetoone/network/OneToOneApi.java b/OneToOne/src/main/java/com/shayu/onetoone/network/OneToOneApi.java index 9cb3ee677..0e480bdd9 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/network/OneToOneApi.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/network/OneToOneApi.java @@ -1,6 +1,8 @@ package com.shayu.onetoone.network; import com.alibaba.fastjson.JSONObject; +import com.shayu.onetoone.bean.JoinAnchorBean; +import com.shayu.onetoone.bean.UserBean; import com.yunbao.common.bean.ActiveModel; import com.yunbao.common.bean.AnchorRecommendItemModel; import com.yunbao.common.bean.AnchorRecommendModel; @@ -75,6 +77,68 @@ import retrofit2.http.QueryMap; * 1v1网络接口访问 参考 {@link com.yunbao.common.http.PDLiveApi} */ public interface OneToOneApi { + /** + * 用户手机号登录 + * + */ + @FormUrlEncoded + @POST("/api/public/?service=Login.userLogin") + Observable> loginByManager( + @Field("user_login") String userName, + @Field("user_pass") String passWord, + @Field("uuid_Device") String uuidDevice, + @Field("pushid") String pushid, + @Field("lastlogindevice") String lastlogindevice + ); + /** + * 用户手机号登录 + */ + @GET("/api/public/?service=Friendappinfos.getInfo") + Observable> getBaseInfos(@Query("login")int login); + @GET("/api/public/?service=Home.getRandJoinAnchor") + Observable>> getRandJoinAnchor(); + @GET("/api/public/?service=Home.getCustomerService") + Observable>> getCustomerService(); + @GET("/api/public/?service=Login.userLoginByThird") + Observable> userLoginByThird(@Query("user_id")String uid, + @Query("openid") String openId, + @Query("admin_id") String promCode, + @Query("uuid_Device") String uuid, + @Query("nicename") String nickName, + @Query("avatar") String avatar, + @Query("app_source")String source, + @Query("source")String devices, + @Query("sign")String sign, + @Query("lastlogindevice")String lastlogindevice, + @Query("type") String type, + @Query("pushid")String pushid + ); } + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OneToOne/src/main/java/com/shayu/onetoone/provider/CustomConversationProvider.java b/OneToOne/src/main/java/com/shayu/onetoone/provider/CustomConversationProvider.java index 999092f29..d74a62b4f 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/provider/CustomConversationProvider.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/provider/CustomConversationProvider.java @@ -1,12 +1,19 @@ package com.shayu.onetoone.provider; +import android.text.SpannableString; + +import com.alibaba.fastjson.JSONObject; +import com.shayu.onetoone.R; + import java.util.List; import io.rong.imkit.conversationlist.model.BaseUiConversation; import io.rong.imkit.conversationlist.provider.BaseConversationProvider; +import io.rong.imkit.userinfo.RongUserInfoManager; 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; public class CustomConversationProvider extends BaseConversationProvider { @Override @@ -16,8 +23,17 @@ public class CustomConversationProvider extends BaseConversationProvider { @Override public void bindViewHolder(ViewHolder holder, BaseUiConversation uiConversation, int position, List list, IViewProviderListener listener) { + String targetId = uiConversation.mCore.getTargetId(); + UserInfo userInfo = RongUserInfoManager.getInstance().getUserInfo(targetId); + if(userInfo!=null){ + JSONObject json=JSONObject.parseObject(userInfo.getExtra()); + if(json.getInteger("sex")==0){ + holder.setImageResource(R.id.sex,R.mipmap.ic_message_tab_woman); + }else{ + holder.setImageResource(R.id.sex,R.mipmap.ic_message_tab_man); + } + } super.bindViewHolder(holder, uiConversation, position, list, listener); - BaseUiConversation conversation = list.get(position); } } diff --git a/OneToOne/src/main/java/com/shayu/onetoone/provider/MessageChatTipsItemProvider.java b/OneToOne/src/main/java/com/shayu/onetoone/provider/MessageChatTipsItemProvider.java index 8d7ac2d2a..ceb896172 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/provider/MessageChatTipsItemProvider.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/provider/MessageChatTipsItemProvider.java @@ -2,6 +2,7 @@ package com.shayu.onetoone.provider; import android.content.Context; import android.text.Spannable; +import android.text.SpannableString; import android.view.ViewGroup; import com.shayu.onetoone.R; diff --git a/OneToOne/src/main/res/layout/activity_main.xml b/OneToOne/src/main/res/layout/activity_main.xml index 9853df0ee..1e5878084 100644 --- a/OneToOne/src/main/res/layout/activity_main.xml +++ b/OneToOne/src/main/res/layout/activity_main.xml @@ -46,7 +46,7 @@ android:layout_height="wrap_content" android:textSize="10sp" android:gravity="center" - android:text="TextView1" /> + android:text="交友" /> + android:text="动态" /> + android:text="消息" /> + android:text="我的" /> \ No newline at end of file diff --git a/OneToOne/src/main/res/layout/rc_conversationlist_item.xml b/OneToOne/src/main/res/layout/rc_conversationlist_item.xml index 19e7d57a5..ac93c3710 100644 --- a/OneToOne/src/main/res/layout/rc_conversationlist_item.xml +++ b/OneToOne/src/main/res/layout/rc_conversationlist_item.xml @@ -4,19 +4,40 @@ xmlns:tools="http://schemas.android.com/tools" android:background="#F7F7F7" android:layout_width="match_parent" + android:layout_marginEnd="16dp" + android:layout_marginStart="16dp" android:layout_height="wrap_content"> - + app:layout_constraintTop_toTopOf="parent"> + + + + + @@ -52,7 +74,6 @@ android:id="@+id/rc_conversation_unread" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginEnd="20dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent"> diff --git a/OneToOne/src/main/res/layout/rc_extension_input_panel.xml b/OneToOne/src/main/res/layout/rc_extension_input_panel.xml index 5545f9965..cc0bac77c 100644 --- a/OneToOne/src/main/res/layout/rc_extension_input_panel.xml +++ b/OneToOne/src/main/res/layout/rc_extension_input_panel.xml @@ -32,7 +32,8 @@ android:visibility="visible" app:layout_constraintEnd_toStartOf="@+id/input_panel_emoji_btn" app:layout_constraintStart_toEndOf="@+id/input_panel_voice_toggle" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + tools:visibility="visible" /> + app:layout_constraintTop_toTopOf="parent" + tools:visibility="gone" /> + app:layout_constraintTop_toBottomOf="@+id/input_panel_add_or_send"> + + + + + + \ No newline at end of file diff --git a/OneToOne/src/main/res/mipmap-xxhdpi/ic_message_tab_man.png b/OneToOne/src/main/res/mipmap-xxhdpi/ic_message_tab_man.png new file mode 100644 index 0000000000000000000000000000000000000000..78af72b4f9bdcfa35966f973576c962a7c4cb1e5 GIT binary patch literal 3554 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 literal 0 HcmV?d00001 diff --git a/OneToOne/src/main/res/values/colors.xml b/OneToOne/src/main/res/values/colors.xml new file mode 100644 index 000000000..e7f03603c --- /dev/null +++ b/OneToOne/src/main/res/values/colors.xml @@ -0,0 +1,4 @@ + + + #F7F7F7 + \ No newline at end of file diff --git a/common/build.gradle b/common/build.gradle index 63742cc78..62428bdd8 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -67,6 +67,7 @@ repositories { dependencies { api fileTree(dir: 'libs', include: ['*.jar', '*.aar']) api files('libs/jcc-bate-0.7.3.jar') + api files('libs/OpenInstall_v2.3.0.jar') compileOnly fileTree(dir: '../libs', include: ['*.aar']) api rootProject.ext.dependencies["appcompat-androidx"] api rootProject.ext.dependencies["recyclerview-androidx"] @@ -199,7 +200,7 @@ dependencies { api 'com.makeramen:roundedimageview:2.3.0' api 'com.google.android.gms:play-services-auth:15.0.0' api 'com.google.android.material:material:1.4.0' - api files('libs/OpenInstall_v2.3.0.jar') + // api files('libs/svgaplayer-release-v1.2.1.aar') } diff --git a/common/libs/OpenInstall_v2.3.0.jar b/common/libs/OpenInstall_v2.3.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..60d2c8f1fa27d98442ed6270d3af7af33b353dd5 GIT binary patch literal 86069 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