This commit is contained in:
zlzw 2023-10-05 14:12:03 +08:00
parent 41b5ab93dc
commit d82f89f11c
63 changed files with 2221 additions and 323 deletions

61
OneToOne/README.md Normal file
View File

@ -0,0 +1,61 @@
# 项目结构
- `app` PDLive入口
- `baidu` 百度模块,废弃
- `beauty` 旧美颜模块,废弃
- `common` 公共模块
- `FaceUnity` 美颜模块
- `lib_country_code` 不管他
- `live` PDLive直播模块
- `main` PDLive主页模块
- `OneToOne` 1v1入口*
- `pluginsForAnchor` PDLive插件化打包模块
- `Share` PDLive分享模块
- `TabLayout` [滑动翻页库模块](!https://github.com/angcyo/DslTabLayout)
- `video` PDLive 视频模块
- `ViewPager2Delegate` [滑动翻页附属模块](!https://github.com/angcyo/DslTabLayout)
# 运行说明
Gradle版本
distributionUrl=`https://services.gradle.org/distributions/gradle-6.1.1-all.zip`
jdk版本`11.0.2`
AndroidStudio版本`Android Studio Giraffe | 2022.3.1 Patch 2`
### 若无法编译请检查`gradle.properties`的代理设置
# 1V1项目介绍
## [项目文档](!https://alidocs.dingtalk.com/i/nodes/YQBnd5ExVEw1DlvwFNaZElK48yeZqMmz?utm_scene=person_space)
## [蓝图](!https://lanhuapp.com/web/#/item/project/stage?tid=a589c634-a1c0-415a-9691-7bad6c77312c&pid=be2586b6-6583-4447-ac83-bf9669ad4854)
## 1v1项目结构
- `activity` 页面
- - `fragments`
- - - `message` 消息页面外层内容
- - `message` 消息页面独立Activity
- `adapter` 适配器
- `bean` 数据Bean类
- `dialog` 对话框类
- `network` 网络请求
- `manager` 单例模式
- `utils` 工具类
- `AppContext` Application
### 项目说明
[即时通讯(IM)融云SDK](!https://doc.rongcloud.cn/im/Android/5.X/ui/init)
[实时音视频融云SDK](!https://doc.rongcloud.cn/call/Android/5.X/callkit/init)
Activity 跳转用Route模块参考`RouteManager``MainActivity`
网络请求使用`OTONetManager`
图片加载使用`ImgLoader.display(Context context, String url, ImageView imageView)`
### 签名文件
签名暂时共享PDLive项目签名用根目录下的`hdl.jks`,其余参考`build.gradle`文件
### APP账号密码
运行PDLive项目注册即可暂时共用
### 混淆
暂不混淆

View File

@ -94,7 +94,7 @@ dependencies {
implementation 'com.google.android.exoplayer:exoplayer:2.18.5'
implementation 'com.google.android.exoplayer:exoplayer-core:2.18.5@aar'
implementation 'cn.rongcloud.sdk:call_kit:5.2.0' // UI
implementation 'cn.rongcloud.sdk:call_kit:5.5.0' // UI
implementation 'com.github.luqiming666:SwipeRecyclerView:1.4.8'//
implementation 'com.google.android.material:material:1.6.1'
implementation 'com.blankj:utilcode:1.30.0'//uuid

View File

@ -112,8 +112,18 @@
<activity
android:name=".activity.message.ChatActivity"
android:screenOrientation="fullSensor"
android:windowSoftInputMode="stateHidden|adjustResize"/>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.shayu.onetoone.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
<meta-data
android:name="SERVER_HOST"
android:value="${serverHost}" />

View File

@ -12,25 +12,33 @@ import com.alibaba.android.arouter.launcher.ARouter;
import com.facebook.FacebookSdk;
import com.shayu.onetoone.activity.fragments.message.ChatMessageFragment;
import com.shayu.onetoone.activity.message.ChatActivity;
import com.shayu.onetoone.provider.CustomConversationProvider;
import com.shayu.onetoone.utils.NeverCrashUtils;
import com.yunbao.common.BuildConfig;
import com.yunbao.common.CommonAppContext;
import com.yunbao.common.manager.imrongcloud.InstructorSendRewardProvider;
import com.yunbao.common.manager.imrongcloud.RongcloudIMManager;
import com.yunbao.common.utils.AppManager;
import com.yunbao.common.utils.L;
import com.yunbao.common.utils.ToastUtil;
import io.rong.imkit.RongIM;
import io.rong.imkit.config.RongConfigCenter;
import io.rong.imkit.conversationlist.model.BaseUiConversation;
import io.rong.imkit.conversationlist.provider.PrivateConversationProvider;
import io.rong.imkit.utils.RouteUtils;
import io.rong.imkit.widget.adapter.ProviderManager;
import io.rong.imlib.IMLibRTCClient;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.Message;
import io.rong.imlib.model.MessageContent;
import io.rong.message.TextMessage;
public class AppContext extends CommonAppContext {
@Override
public void onCreate() {
super.onCreate();
L.setDeBug(true);
NeverCrashUtils.getInstance()
.setDebugMode(BuildConfig.DEBUG)
.setMainCrashHandler((t, e) -> {
@ -60,12 +68,23 @@ public class AppContext extends CommonAppContext {
String appKey = "pvxdm17jpd3hr";
boolean enablePush = true;
RongIM.init(this, appKey, enablePush);
RongIM.setConnectionStatusListener(new RongIMClient.ConnectionStatusListener() {
@Override
public void onChanged(ConnectionStatus status) {
Log.i("融云", "onChanged: "+status.getMessage());
}
});
ProviderManager<BaseUiConversation> providerManager = RongConfigCenter.conversationListConfig().getProviderManager();
providerManager.replaceProvider(PrivateConversationProvider.class,new CustomConversationProvider());
RongcloudIMManager.initRongIM(this);
RongConfigCenter.conversationConfig().addMessageProvider(new InstructorSendRewardProvider(getApplicationContext()));
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());
return false;
}
});

View File

@ -1,8 +1,11 @@
package com.shayu.onetoone.activity;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
import androidx.annotation.Nullable;
@ -10,12 +13,16 @@ import androidx.appcompat.app.AppCompatActivity;
import com.shayu.onetoone.R;
/**
* Activity基类
*/
public abstract class AbsOTOActivity extends AppCompatActivity {
public Context mContext;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStatusBar();
setContentView(getLayoutId());
mContext = this;
main(savedInstanceState);
@ -24,11 +31,24 @@ public abstract class AbsOTOActivity extends AppCompatActivity {
view.setOnClickListener(v -> finish());
}
}
private void setStatusBar() {
Window window = getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(0);
}
/**
* 设置布局id
*/
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 File

@ -4,6 +4,7 @@ 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 android.widget.EditText;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
@ -12,6 +13,7 @@ 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.shayu.onetoone.utils.MainHttpUtil;
import com.yunbao.common.CommonAppConfig;
import com.yunbao.common.CommonAppContext;
import com.yunbao.common.bean.IMLoginModel;
@ -28,8 +30,34 @@ import com.yunbao.common.utils.ToastUtil;
import org.greenrobot.eventbus.EventBus;
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.util.Arrays;
/**
* 启动Activity
*/
public class LauncherActivity extends AbsOTOActivity {
@Override
@ -39,14 +67,12 @@ public class LauncherActivity extends AbsOTOActivity {
@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() {
findViewById(R.id.login).setOnClickListener(view -> {
//账号密码登录 临时用的登录代码将就下
String account = ((EditText) findViewById(R.id.edit_user)).getText().toString();
String password= ((EditText) findViewById(R.id.edit_password)).getText().toString();
MainHttpUtil.login(account, password, DeviceUtils.getUniqueDeviceId(), new HttpCallback() {
@Override
public void onSuccess(int code, String msg, String[] info) {
if (code == 0 && info.length > 0) {
@ -66,6 +92,7 @@ public class LauncherActivity extends AbsOTOActivity {
}
});
});
}
private void connectRongCloud() {

View File

@ -19,14 +19,22 @@ 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 com.yunbao.common.CommonAppConfig;
import com.yunbao.common.manager.imrongcloud.RongcloudIMManager;
import com.yunbao.common.utils.ToastUtil;
import java.util.ArrayList;
import java.util.List;
import io.rong.imkit.RongIM;
import io.rong.imlib.RongIMClient;
import kotlin.Unit;
import kotlin.jvm.functions.Function1;
import kotlin.jvm.functions.Function4;
/**
* 主页Activity
*/
@Route(path = RouteManager.ACTIVITY_MAIN)
public class MainActivity extends AbsOTOActivity {
List<BaseFragment> fragments = new ArrayList<>();
@ -73,7 +81,7 @@ public class MainActivity extends AbsOTOActivity {
return null;
}
});
RongcloudIMManager.connectIM(mContext);
}
@Override

View File

@ -10,6 +10,9 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
/**
* Fragment基类
*/
public abstract class BaseFragment extends Fragment {
public Context mContext;
@ -23,8 +26,16 @@ public abstract class BaseFragment extends Fragment {
return itemView;
}
/**
* 初始化页面
* @param itemView 布局view
*/
public abstract void initView(View itemView);
/**
* 创建页面
* @return 布局
*/
public abstract View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState);
}

View File

@ -8,6 +8,9 @@ import android.view.ViewGroup;
import com.shayu.onetoone.R;
/**
* 动态主页面
*/
public class DynamicFragment extends BaseFragment {
@Override

View File

@ -8,6 +8,9 @@ import android.view.ViewGroup;
import com.shayu.onetoone.R;
/**
* 交友主页面
*/
public class FriendsFragment extends BaseFragment {
@Override
public void initView(View itemView) {

View File

@ -27,6 +27,9 @@ 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;

View File

@ -8,6 +8,9 @@ import android.view.ViewGroup;
import com.shayu.onetoone.R;
/**
* 我的主页面
*/
public class MyFragment extends BaseFragment {
@Override
public void initView(View itemView) {
@ -16,6 +19,6 @@ public class MyFragment extends BaseFragment {
@Override
public View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.activity_msg_config, container, false);
return inflater.inflate(R.layout.fragment_my, container, false);
}
}

View File

@ -0,0 +1,31 @@
package com.shayu.onetoone.activity.fragments.home;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.shayu.onetoone.R;
import com.yunbao.common.fragment.BaseFragment;
public class HotFragment extends BaseFragment {
@Override
public View createView(LayoutInflater inflater, ViewGroup container) {
return inflater.inflate(R.layout.fragment_hot, container, false);
}
@Override
protected void initVariables(Bundle bundle) {
}
@Override
protected void initViews(Bundle savedInstanceState, View contentView) {
}
@Override
protected void loadData() {
}
}

View File

@ -0,0 +1,31 @@
package com.shayu.onetoone.activity.fragments.home;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.shayu.onetoone.R;
import com.yunbao.common.fragment.BaseFragment;
public class RecommendFragment extends BaseFragment {
@Override
public View createView(LayoutInflater inflater, ViewGroup container) {
return inflater.inflate(R.layout.fragment_recommend, container, false);
}
@Override
protected void initVariables(Bundle bundle) {
}
@Override
protected void initViews(Bundle savedInstanceState, View contentView) {
}
@Override
protected void loadData() {
}
}

View File

@ -1,46 +1,135 @@
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.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.FileProvider;
import com.shayu.onetoone.R;
import com.yunbao.common.CommonAppConfig;
import com.yunbao.common.Constants;
import com.yunbao.common.interfaces.ImageResultCallback;
import com.yunbao.common.utils.ProcessImageUtil;
import com.yunbao.common.utils.ToastUtil;
import java.io.File;
import java.lang.reflect.Field;
import java.util.Date;
import io.rong.imkit.IMCenter;
import io.rong.imkit.conversation.ConversationFragment;
import io.rong.imlib.IRongCallback;
import io.rong.imlib.ISendMessageCallback;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.Conversation;
import io.rong.imlib.model.Message;
import io.rong.message.TextMessage;
import io.rong.message.ImageMessage;
/**
* 融云聊天UI
*/
public class ChatMessageFragment extends ConversationFragment {
Button mSendBtn;
View mInputPanel;
ImageView img, call, video, gift;
ProcessImageUtil cameraUtil;
String targetId;
Conversation.ConversationType conversationType= Conversation.ConversationType.PRIVATE;
@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>() {
initBtn();
targetId = getActivity().getIntent().getStringExtra("targetId");
cameraUtil = new ProcessImageUtil(getActivity(), "com.shayu.onetoone.fileprovider");
mSendBtn.setOnClickListener(v -> sendText());
img.setOnClickListener(v -> cameraUtil.getImageByCamera());
cameraUtil.setImageResultCallback(new ImageResultCallback() {
@Override
public void onSuccess(Message message) {
ToastUtil.show("消息发送成功");
public void beforeCamera() {
}
@Override
public void onError(RongIMClient.ErrorCode e) {
ToastUtil.show("消息发送失败:"+e.msg);
Log.i("聊天", "onError: "+e);
public void onSuccess(File file) {
sendImage(file);
}
@Override
public void onFailure() {
}
});
}
private void initBtn() {
try {
Field field = mRongExtension.getInputPanel().getClass().getDeclaredField("mInputPanel");
field.setAccessible(true);
mInputPanel = (View) field.get(mRongExtension.getInputPanel());
assert mInputPanel != null;
mSendBtn = mInputPanel.findViewById(R.id.send_btn);
img = mInputPanel.findViewById(R.id.input_panel_image_btn);
video = mInputPanel.findViewById(R.id.input_panel_video_btn);
call = mInputPanel.findViewById(R.id.input_panel_call_btn);
gift = mInputPanel.findViewById(R.id.input_panel_gift_btn);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private void sendText() {
try {
Field field = mRongExtension.getInputPanel().getClass().getDeclaredField("mSendBtn");
field.setAccessible(true);
Button send = (Button) field.get(mRongExtension.getInputPanel());
assert send != null;
send.callOnClick();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private void sendImage(File file) {
ImageMessage imageMessage = ImageMessage.obtain(Uri.parse("file://"+file.getAbsolutePath()),true);
Message message = Message.obtain(targetId, conversationType, imageMessage);
message.setSenderUserId(CommonAppConfig.getInstance().getUid());
message.setObjectName("RC:ImgMsg");
message.setExtra("");
message.setSentTime(new Date().getTime());
message.setTargetId(targetId);
IMCenter.getInstance().sendMediaMessage(message, null, null, new IRongCallback.ISendMediaMessageCallback() {
@Override
public void onProgress(Message message, int progress) {
}
@Override
public void onCanceled(Message message) {
}
@Override
public void onAttached(Message message) {
}
@Override
public void onSuccess(Message message) {
}
@Override
public void onError(Message message, RongIMClient.ErrorCode errorCode) {
ToastUtil.show("发送失败");
System.out.println("发送失败:" + errorCode.getMessage());
}
});
}
}

View File

@ -8,6 +8,9 @@ import android.view.ViewGroup;
import com.shayu.onetoone.R;
import com.shayu.onetoone.activity.fragments.BaseFragment;
/**
* 消息-好友
*/
public class MsgFriendFragment extends BaseFragment {
@Override

View File

@ -2,12 +2,21 @@ package com.shayu.onetoone.activity.fragments.message;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
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.constraintlayout.widget.ConstraintLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.shayu.onetoone.R;
@ -27,51 +36,83 @@ import com.yunbao.common.utils.ToastUtil;
import java.util.ArrayList;
import java.util.List;
import io.rong.common.RLog;
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.ConversationListFragment;
import io.rong.imkit.conversationlist.model.BaseUiConversation;
import io.rong.imkit.conversationlist.model.GatheredConversation;
import io.rong.imkit.conversationlist.viewmodel.ConversationListViewModel;
import io.rong.imkit.event.Event;
import io.rong.imkit.model.NoticeContent;
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.RongIMClient;
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;
/**
* 消息-消息
* copy {@link io.rong.imkit.conversationlist.ConversationListFragment}
*/
public class MsgMessageFragment extends BaseFragment implements BaseAdapter.OnItemClickListener {
private static final String TAG = MsgMessageFragment.class.getSimpleName();
SwipeRecyclerView mList;
SmartRefreshLayout mRefreshLayout;
ConversationListAdapter mAdapter;
List<MsgMessageBean> list;
protected View mNoticeContainerView;
protected TextView mNoticeContentTv;
protected ImageView mNoticeIconIv;
protected ConversationListViewModel mConversationListViewModel;
protected Handler mHandler = new Handler(Looper.getMainLooper());
protected boolean delayRefresh = false;
@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());
mList = itemView.findViewById(R.id.recyclerView);
mRefreshLayout = itemView.findViewById(R.id.swipeRefreshLayout);
mAdapter = new ConversationListAdapter();
list = new ArrayList<>();
initData();
recyclerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
recyclerView.setSwipeMenuCreator(initSwipeMenuCreator());
mList.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
mList.setSwipeMenuCreator(initSwipeMenuCreator());
initMoreListener();
initRefreshListener();
recyclerView.setOnItemMenuClickListener(new OnItemMenuClickListener() {
mList.setOnItemMenuClickListener(new OnItemMenuClickListener() {
@Override
public void onItemClick(SwipeMenuBridge menuBridge, int adapterPosition) {
menuBridge.closeMenu();
if (menuBridge.getPosition() == 0) {
ToastUtil.showDebug("置顶:" + adapter.getList().get(adapterPosition).getNickname());
BaseUiConversation conversation = mAdapter.getData().get(adapterPosition);
IMCenter.getInstance().setConversationToTop(Conversation.ConversationType.PRIVATE, conversation.mCore.getTargetId(), !conversation.mCore.isTop(), true, new RongIMClient.ResultCallback<Boolean>() {
@Override
public void onSuccess(Boolean aBoolean) {
}
@Override
public void onError(RongIMClient.ErrorCode e) {
}
});
// ToastUtil.showDebug("置顶:" + mAdapter.getList().get(adapterPosition).getNickname());
} else {
ToastUtil.showDebug("删除:" + adapter.getList().get(adapterPosition).getNickname());
adapter.getList().remove(adapterPosition);
adapter.notifyDataSetChanged();
// ToastUtil.showDebug("删除:" + mAdapter.getList().get(adapterPosition).getNickname());
mAdapter.getData().remove(adapterPosition);
mAdapter.notifyDataSetChanged();
}
}
});
recyclerView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(View view, int i) {
RouteManager.forwardMsgChatActivity();
}
});
recyclerView.setAdapter(adapter);
adapter.setList(list);
}
@Override
@ -79,6 +120,168 @@ public class MsgMessageFragment extends BaseFragment {
return inflater.inflate(R.layout.fragment_msg_message, container, false);
}
protected int mNewState = 0;
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (!IMCenter.getInstance().isInitialized()) {
RLog.e(TAG, "Please init SDK first!");
} else {
LinearLayoutManager layoutManager = new FixedLinearLayoutManager(this.getActivity());
this.mList.setLayoutManager(layoutManager);
this.mList.setAdapter(this.mAdapter);
this.mList.addOnScrollListener(new RecyclerView.OnScrollListener() {
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
MsgMessageFragment.this.mNewState = newState;
if (MsgMessageFragment.this.mNewState == 0 && MsgMessageFragment.this.delayRefresh && MsgMessageFragment.this.mAdapter != null && MsgMessageFragment.this.mConversationListViewModel != null) {
MsgMessageFragment.this.delayRefresh = false;
MsgMessageFragment.this.mAdapter.setDataCollection((List) MsgMessageFragment.this.mConversationListViewModel.getConversationListLiveData().getValue());
}
}
});
this.mAdapter.setItemClickListener(this);
this.mNoticeContainerView = view.findViewById(R.id.rc_conversationlist_notice_container);
this.mNoticeContentTv = (TextView) view.findViewById(R.id.rc_conversationlist_notice_tv);
this.mNoticeIconIv = (ImageView) view.findViewById(R.id.rc_conversationlist_notice_icon_iv);
this.initRefreshView();
this.subscribeUi();
}
}
public void onResume() {
super.onResume();
if (this.mConversationListViewModel != null) {
this.mConversationListViewModel.clearAllNotification();
}
}
protected void initRefreshView() {
if (this.mRefreshLayout == null) {
RLog.d(this.TAG, "initRefreshView null");
} else {
this.mRefreshLayout.setNestedScrollingEnabled(false);
this.mRefreshLayout.setRefreshHeader(new RongRefreshHeader(this.getContext()));
this.mRefreshLayout.setRefreshFooter(new RongRefreshHeader(this.getContext()));
this.mRefreshLayout.setOnRefreshListener(new OnRefreshListener() {
public void onRefresh(@NonNull RefreshLayout refreshLayout) {
MsgMessageFragment.this.onConversationListRefresh(refreshLayout);
}
});
this.mRefreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
MsgMessageFragment.this.onConversationListLoadMore();
}
});
}
}
protected void subscribeUi() {
this.mConversationListViewModel = (ConversationListViewModel) (new ViewModelProvider(this)).get(ConversationListViewModel.class);
this.mConversationListViewModel.getConversationList(false, false, 0L);
this.mConversationListViewModel.getConversationListLiveData().observe(this.getViewLifecycleOwner(), new Observer<List<BaseUiConversation>>() {
public void onChanged(List<BaseUiConversation> uiConversations) {
RLog.d(MsgMessageFragment.this.TAG, "conversation list onChanged.");
if (MsgMessageFragment.this.mNewState == 0) {
MsgMessageFragment.this.mAdapter.setDataCollection(uiConversations);
} else {
MsgMessageFragment.this.delayRefresh = true;
}
}
});
this.mConversationListViewModel.getNoticeContentLiveData().observe(this.getViewLifecycleOwner(), new Observer<NoticeContent>() {
public void onChanged(NoticeContent noticeContent) {
if (MsgMessageFragment.this.mNoticeContainerView.getVisibility() == View.GONE) {
MsgMessageFragment.this.mHandler.postDelayed(new Runnable() {
public void run() {
MsgMessageFragment.this.updateNoticeContent((NoticeContent) MsgMessageFragment.this.mConversationListViewModel.getNoticeContentLiveData().getValue());
}
}, 4000L);
} else {
MsgMessageFragment.this.updateNoticeContent(noticeContent);
}
}
});
this.mConversationListViewModel.getRefreshEventLiveData().observe(this.getViewLifecycleOwner(), new Observer<Event.RefreshEvent>() {
public void onChanged(Event.RefreshEvent refreshEvent) {
if (refreshEvent.state.equals(RefreshState.LoadFinish)) {
if (MsgMessageFragment.this.mRefreshLayout != null) {
MsgMessageFragment.this.mRefreshLayout.finishLoadMore();
} else {
RLog.d(MsgMessageFragment.this.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");
}
}
}
});
}
protected void onConversationListRefresh(RefreshLayout refreshLayout) {
if (this.mConversationListViewModel != null) {
this.mConversationListViewModel.getConversationList(false, true, 0L);
}
}
protected void onConversationListLoadMore() {
if (this.mConversationListViewModel != null) {
this.mConversationListViewModel.getConversationList(true, true, 0L);
}
}
protected void updateNoticeContent(NoticeContent content) {
if (content != null) {
if (content.isShowNotice()) {
this.mNoticeContainerView.setVisibility(View.VISIBLE);
this.mNoticeContentTv.setText(content.getContent());
if (content.getIconResId() != 0) {
this.mNoticeIconIv.setImageResource(content.getIconResId());
}
} else {
this.mNoticeContainerView.setVisibility(View.GONE);
}
}
}
public void onItemClick(View view, ViewHolder holder, int position) {
if (position >= 0 && position < this.mAdapter.getData().size()) {
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.");
} else {
if (baseUiConversation != null && baseUiConversation.mCore != null) {
if (baseUiConversation instanceof GatheredConversation) {
RouteUtils.routeToSubConversationListActivity(view.getContext(), ((GatheredConversation) baseUiConversation).mGatheredType, baseUiConversation.mCore.getConversationTitle());
} else {
RouteUtils.routeToConversationActivity(view.getContext(), baseUiConversation.getConversationIdentifier());
}
} else {
RLog.e(this.TAG, "invalid conversation.");
}
}
}
}
@Override
public boolean onItemLongClick(View view, ViewHolder holder, int position) {
return false;
}
private SwipeMenuCreator initSwipeMenuCreator() {
SwipeMenuCreator creator = (leftMenu, rightMenu, position) -> {
SwipeMenuItem top = new SwipeMenuItem(getContext());
@ -107,24 +310,14 @@ public class MsgMessageFragment extends BaseFragment {
new ArrayList<>(list);
initData();
tmp.addAll(list);
adapter.setList(tmp);
// mAdapter.setDataCollection(tmp);
list = new ArrayList<>(tmp);
recyclerView.loadMoreFinish(false, true);
mList.loadMoreFinish(false, true);
}
};
recyclerView.setLoadMoreListener(moreListener);
mList.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<>();

View File

@ -13,6 +13,9 @@ import com.shayu.onetoone.manager.RouteManager;
import io.rong.imkit.conversation.ConversationFragment;
/**
* 聊天界面
*/
@Route(path = RouteManager.ACTIVITY_MSG_CHAT)
public class ChatActivity extends AbsOTOActivity {
@Override

View File

@ -17,6 +17,9 @@ 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;

View File

@ -1,27 +0,0 @@
package com.shayu.onetoone.activitys.fragments.home;
import android.os.Bundle;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import com.shayu.onetoone.R;
import com.shayu.onetoone.activity.AbsOTOActivity;
import com.shayu.onetoone.activity.fragments.message.ChatMessageFragment;
import io.rong.imkit.conversation.ConversationFragment;
/**
* 推荐
*/
public class RecommendActivity extends AbsOTOActivity {
@Override
protected int getLayoutId() {
return R.layout.activity_recommend;
}
@Override
protected void main(Bundle savedInstanceState) {
}
}

View File

@ -19,6 +19,9 @@ import com.yunbao.common.interfaces.OnItemClickListener;
import java.util.ArrayList;
import java.util.List;
/**
* 打招呼设置适配器
*/
public class MsgGreetConfigAdapter extends RecyclerView.Adapter<MsgGreetConfigAdapter.ViewHolder> {
List<MsgGreetConfigBean> mList;
Context mContext;

View File

@ -16,6 +16,9 @@ import com.yunbao.common.glide.ImgLoader;
import java.util.List;
/**
* 聊天列表适配器
*/
public class MsgMessageRecyclerViewAdapter extends RecyclerView.Adapter<MsgMessageRecyclerViewAdapter.ViewHolder> {
List<MsgMessageBean> list;
Context mContext;
@ -36,7 +39,7 @@ public class MsgMessageRecyclerViewAdapter extends RecyclerView.Adapter<MsgMessa
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_msg_message, parent, false));
return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.rc_conversationlist_item, parent, false));
}
@Override
@ -58,11 +61,11 @@ public class MsgMessageRecyclerViewAdapter extends RecyclerView.Adapter<MsgMessa
public ViewHolder(@NonNull View itemView) {
super(itemView);
avatar = itemView.findViewById(R.id.msg_message_avatar);
/* avatar = itemView.findViewById(R.id.msg_message_avatar);
name = itemView.findViewById(R.id.msg_message_title);
content = itemView.findViewById(R.id.msg_message_content);
time = itemView.findViewById(R.id.msg_message_content_time);
read = itemView.findViewById(R.id.msg_message_content_not_read);
read = itemView.findViewById(R.id.msg_message_content_not_read);*/
}
public void setData(MsgMessageBean bean, int position) {

View File

@ -2,6 +2,9 @@ package com.shayu.onetoone.bean;
import com.yunbao.common.bean.BaseModel;
/**
* 打招呼设置
*/
public class MsgGreetConfigBean extends BaseModel {
private int id;
private String content;

View File

@ -2,6 +2,9 @@ package com.shayu.onetoone.bean;
import com.yunbao.common.bean.BaseModel;
/**
* 聊天列表消息
*/
public class MsgMessageBean extends BaseModel {
private int id;
private String avatar;

View File

@ -9,6 +9,9 @@ import com.lxj.xpopup.core.AttachPopupView;
import com.shayu.onetoone.R;
import com.shayu.onetoone.manager.RouteManager;
/**
* 消息右上角更多菜单
*/
public class MsgMoreDialog extends AttachPopupView implements View.OnClickListener {
View config, read;

View File

@ -0,0 +1,56 @@
package com.shayu.onetoone.manager;
import android.content.Context;
import com.yunbao.common.bean.GiftNamingInfoModel;
import com.yunbao.common.http.API;
import com.yunbao.common.http.ResponseModel;
import com.yunbao.common.http.base.HttpCallback;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
/**
* 网络管理类 使用参考{@link com.yunbao.common.http.live.LiveNetManager}
*/
public class OTONetManager {
private Context mContext;
private static OTONetManager mInstance;
private OTONetManager(Context context) {
this.mContext = context;
}
public static OTONetManager getInstance(Context context) {
if (mInstance == null) {
mInstance = new OTONetManager(context);
}
return mInstance;
}
//示例
/*
public void getGiftNamingInfo(String giftId, HttpCallback<GiftNamingInfoModel> callback) {
API.get().pdLiveApi(mContext)
.getGiftNamingInfo(giftId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ResponseModel<GiftNamingInfoModel>>() {
@Override
public void accept(ResponseModel<GiftNamingInfoModel> liveGiftBeanResponseModel) throws Exception {
if (callback!=null){
callback.onSuccess(liveGiftBeanResponseModel.getData().getInfo());
}
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
if (callback != null) {
callback.onError(mContext.getString(com.yunbao.common.R.string.net_error));
}
}
}).isDisposed();
}
*/
}

View File

@ -6,9 +6,9 @@ import com.alibaba.android.arouter.launcher.ARouter;
* 路由跳转Activity
*/
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_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 void forwardMainActivity() {

View File

@ -0,0 +1,100 @@
package com.shayu.onetoone.network;
import android.content.Context;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.internal.bind.DateTypeAdapter;
import com.yunbao.common.CommonAppConfig;
import com.yunbao.common.CommonAppContext;
import com.yunbao.common.http.HttpLoggingInterceptor;
import com.yunbao.common.http.base.BaseApi;
import com.yunbao.common.http.base.ParamsContext;
import java.io.IOException;
import java.util.Date;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* 网络请求接口
*/
public class API extends BaseApi {
private OneToOneApi otoApi;
private static API api;
/**
* 获取单利
*
* @return
*/
public static API get() {
if (null == api) {
api = new API();
}
return api;
}
public OneToOneApi otoApi(Context context) {
if (null == otoApi) {
//实例化gson
otoApi = createOneToOneApi(true, true);
}
return otoApi;
}
/**
* 创建新的OneToOneApi兼容部分接口需要控制是否添加UID参数
* 仅有需要不添加uid的接口使用默认请用otoApi()
*
* @param isNeedUid 是否需要用户uid参数
* @return OneToOneApi
*/
public OneToOneApi createOneToOneApi(boolean isNeedUid) {
return createOneToOneApi(isNeedUid, true);
}
/**
* 创建新的OneToOneApi兼容部分接口需要控制是否添加UID参数
* 仅有需要不添加uid或token的接口使用默认请用otoApi()
*
* @param isNeedUid 是否需要用户uid参数
* @param isNeedToken 是否需要用户Token
* @return OneToOneApi
*/
public OneToOneApi createOneToOneApi(boolean isNeedUid, boolean isNeedToken) {
Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, new DateTypeAdapter())
.create();
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor("http");
loggingInterceptor.setPrintLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder builder = new OkHttpClient()
.newBuilder()
.addInterceptor(initQuery(isNeedUid, isNeedToken, CommonAppContext.sInstance.getApplicationContext()))
.addInterceptor(loggingInterceptor);
return create(builder.build(),
GsonConverterFactory.create(gson), RxJava2CallAdapterFactory.create(), CommonAppConfig.HOST, OneToOneApi.class);
}
//公共参数
public Interceptor initQuery(boolean isNeedUid, boolean isNeedToken, final Context context) {
Interceptor addQueryParameterInterceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
//配置公共参数
request = new ParamsContext(request, context).getInRequest(isNeedUid, isNeedToken);
return chain.proceed(request);
}
};
return addQueryParameterInterceptor;
}
}

View File

@ -0,0 +1,80 @@
package com.shayu.onetoone.network;
import com.alibaba.fastjson.JSONObject;
import com.yunbao.common.bean.ActiveModel;
import com.yunbao.common.bean.AnchorRecommendItemModel;
import com.yunbao.common.bean.AnchorRecommendModel;
import com.yunbao.common.bean.BaseModel;
import com.yunbao.common.bean.BlindBoxInfoModel;
import com.yunbao.common.bean.CheckLiveModel;
import com.yunbao.common.bean.ContributeModel;
import com.yunbao.common.bean.CustomSidebarInfoModel;
import com.yunbao.common.bean.DiscountsModel;
import com.yunbao.common.bean.EnterRoomNewModel;
import com.yunbao.common.bean.FaceBookUpModel;
import com.yunbao.common.bean.FansCheckRed;
import com.yunbao.common.bean.FansGroupGiftPack;
import com.yunbao.common.bean.FansGroupGiftPackInfo;
import com.yunbao.common.bean.GiftAlreadyWallModel;
import com.yunbao.common.bean.GiftGuideModel;
import com.yunbao.common.bean.GiftNamingInfoModel;
import com.yunbao.common.bean.GiftWallGiftDetail;
import com.yunbao.common.bean.GiftWallModel;
import com.yunbao.common.bean.HourRank;
import com.yunbao.common.bean.HttpCallbackModel;
import com.yunbao.common.bean.IMLoginModel;
import com.yunbao.common.bean.LinkMicUserBeanV2;
import com.yunbao.common.bean.ListInfoMessageModel;
import com.yunbao.common.bean.LiveAiRobotBean;
import com.yunbao.common.bean.LiveAnchorCallMeModel;
import com.yunbao.common.bean.LiveAnchorSayModel;
import com.yunbao.common.bean.LiveDataInfoModel;
import com.yunbao.common.bean.LiveInfoModel;
import com.yunbao.common.bean.LiveRoomActivityBanner;
import com.yunbao.common.bean.LiveRoomVoteModel;
import com.yunbao.common.bean.LiveStetUpStatusModel;
import com.yunbao.common.bean.LiveTaskModel;
import com.yunbao.common.bean.LiveUserMailBoxModel;
import com.yunbao.common.bean.MedalAchievementModel;
import com.yunbao.common.bean.MsgSwitchDetailModel;
import com.yunbao.common.bean.NewPeopleInfo;
import com.yunbao.common.bean.NobleRankHideUserListModel;
import com.yunbao.common.bean.NobleTrumpetModel;
import com.yunbao.common.bean.PkRankBean;
import com.yunbao.common.bean.PrankGiftBean;
import com.yunbao.common.bean.PrankHttpTurntableBean;
import com.yunbao.common.bean.RandomPkUserBean;
import com.yunbao.common.bean.RankPkInfoBean;
import com.yunbao.common.bean.RedPacketDetailsBean;
import com.yunbao.common.bean.RedPacketGiftModel;
import com.yunbao.common.bean.RedPacketInfoModel;
import com.yunbao.common.bean.RedPacketListBean;
import com.yunbao.common.bean.SearchModel;
import com.yunbao.common.bean.SetAttentsModel;
import com.yunbao.common.bean.SlideInBannerModel;
import com.yunbao.common.bean.StarChallengeStatusModel;
import com.yunbao.common.bean.UserAreaBean;
import com.yunbao.common.bean.UserAvatarSelectBean;
import com.yunbao.common.bean.VipModel;
import com.yunbao.common.bean.WishListGiftConfModel;
import com.yunbao.common.bean.WishListModel;
import com.yunbao.common.http.ResponseModel;
import java.util.List;
import java.util.Map;
import io.reactivex.Observable;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
/**
* 1v1网络接口访问 参考 {@link com.yunbao.common.http.PDLiveApi}
*/
public interface OneToOneApi {
}

View File

@ -0,0 +1,23 @@
package com.shayu.onetoone.provider;
import java.util.List;
import io.rong.imkit.conversationlist.model.BaseUiConversation;
import io.rong.imkit.conversationlist.provider.BaseConversationProvider;
import io.rong.imkit.widget.adapter.IViewProviderListener;
import io.rong.imkit.widget.adapter.ViewHolder;
import io.rong.imlib.model.Conversation;
public class CustomConversationProvider extends BaseConversationProvider {
@Override
public boolean isItemViewType(BaseUiConversation item) {
return item.mCore.getConversationType().equals(Conversation.ConversationType.PRIVATE);
}
@Override
public void bindViewHolder(ViewHolder holder, BaseUiConversation uiConversation, int position, List<BaseUiConversation> list, IViewProviderListener<BaseUiConversation> listener) {
super.bindViewHolder(holder, uiConversation, position, list, listener);
BaseUiConversation conversation = list.get(position);
}
}

View File

@ -0,0 +1,56 @@
package com.shayu.onetoone.utils;
/**
* Created by cxf on 2019/2/16.
*/
public class MainHttpConsts {
public static final String LOGIN = "setLoginInfo";
public static final String LOGIN_BY_THIRD = "loginByThird";
public static final String REQUEST_BONUS = "requestBonus";
public static final String GET_BONUS = "getBonus";
public static final String SET_DISTRIBUT = "setDistribut";
public static final String GET_HOT = "getHot";
public static final String GET_FOLLOW = "getFollow";
public static final String GET_NEAR = "getNear";
public static final String PROFIT_LIST = "profitList";
public static final String CONSUME_LIST = "consumeList";
public static final String BLIND_BOX_LIST = "blindBoxList";
public static final String GET_BASE_INFO = "getBaseInfo";
public static final String SET_BLACK = "setBlack";
public static final String GET_SETTING_LIST = "getSettingList";
public static final String SEARCH = "search";
public static final String GET_FOLLOW_LIST = "getFollowList";
public static final String GET_FANS_LIST = "getFansList";
public static final String UPDATE_AVATAR = "updateAvatar";
public static final String UPDATE_FIELDS = "updateFields";
public static final String GET_MY_IMPRESS = "getMyImpress";
public static final String GET_PROFIT = "getProfit";
public static final String GET_USER_ACCOUNT_LIST = "getUserAccountList";
public static final String ADD_CASH_ACCOUNT = "addCashAccount";
public static final String DEL_CASH_ACCOUNT = "deleteCashAccount";
public static final String DO_CASH = "doCash";
public static final String GET_CLASS_LIVE = "getClassLive";
public static final String GET_RECOMMEND = "getRecommend";
public static final String RECOMMEND_FOLLOW = "recommendFollow";
public static final String GET_REGISTER_CODE = "getRegisterCode";
public static final String REGISTER = "register";
public static final String FIND_PWD = "findPwd";
public static final String GET_FIND_PWD_CODE = "getCode";
public static final String GET_QR_CODE = "getQrCode";
public static final String MODIFY_PWD = "modifyPwd";
public static final String HOME_TOP = "getHomeTop";
public static final String SEND_DYNAMICGIFT = "sendDynamicGift";
public static final String GET_DYNAMICGIFTINFO = "getDynamicGiftInfo";
public static final String GET_DYNAMICSENDGIFTLIST = "getDynamicSendGiftList";
public static final String ISANCHOR = "isAnchor";
public static final String GET_RANDOM= "getRandom";
public static final String GET_HOME_FOLLOW= "Home.getFollow";
public static final String GET_USER_FRONTTASKTYPE= "getUserFrontTaskType";
public static final String UPDATEBINDMOBILE = "updateBindMobile";
public static final String BINDMOBILE = "bindMobile";
public static final String GETCUSTOMERSERVICE = "getCustomerService";
public static final String GETINSTRUCTORREMARK = "getInstructorRemark";
public static final String ISINSTRUCTOR = "isInstructor";
}

View File

@ -0,0 +1,776 @@
package com.shayu.onetoone.utils;
import android.util.Log;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.blankj.utilcode.util.AppUtils;
import com.blankj.utilcode.util.DeviceUtils;
import com.yunbao.common.CommonAppConfig;
import com.yunbao.common.CommonAppContext;
import com.yunbao.common.bean.GoogleBean;
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.interfaces.CommonCallback;
import com.yunbao.common.manager.IMLoginManager;
import com.yunbao.common.utils.MD5Util;
import com.yunbao.common.utils.SpUtil;
import com.yunbao.common.utils.VersionUtil;
import org.greenrobot.eventbus.EventBus;
import java.io.File;
import java.net.NetworkInterface;
import java.util.Collections;
import java.util.List;
/**
* Created by cxf on 2018/9/17.
*/
public class MainHttpUtil {
private static final String SALT = "76576076c1f5f657b634e966c8836a06";
private static final String DEVICE = "android";
/**
* 取消网络请求
*/
public static void cancel(String tag) {
HttpClient.getInstance().cancel(tag);
}
/**
* 手机号 密码登录
*/
public static void login(String phoneNum, String pwd, String uuid, HttpCallback callback) {
HttpClient.getInstance().get("Login.userLogin", MainHttpConsts.LOGIN)
.params("user_login", phoneNum)
.params("user_pass", pwd)
.params("pushid", "")
.params("lastlogindevice", "Android")
.params("uuid_Device", uuid)
.execute(callback);
}
/**
* 第三方登录
*/
public static void loginByThird(String openid, String nicename, String avatar, String type, HttpCallback callback) {
String sign = MD5Util.getMD5("openid=" + openid + "&" + SALT);
HttpClient.getInstance().get("Login.userLoginByThird", MainHttpConsts.LOGIN_BY_THIRD)
.params("openid", openid)
.params("nicename", nicename)
.params("app_source", CommonAppConfig.IS_GOOGLE_PLAY == true ? "1" : "3")
.params("avatar", avatar)
.params("type", type)
.params("source", DEVICE)
.params("sign", sign)
.params("lastlogindevice", "Android")
.params("pushid", "")
.execute(callback);
}
/**
* 第三方登录---增加参数推广码,手机唯一标识
*/
public static void loginByThird(String UserID, String openid, String promoCode, String uuidDevice, String nicename, String avatar, String type, HttpCallback callback) {
String sign = MD5Util.getMD5("openid=" + openid + "&" + SALT);
HttpClient.getInstance().get("Login.userLoginByThird", MainHttpConsts.LOGIN_BY_THIRD)
.params("openid", openid)
.params("app_source", CommonAppConfig.IS_GOOGLE_PLAY == true ? "1" : "3")
.params("admin_id", promoCode)
.params("uuid_Device", uuidDevice)
.params("nicename", nicename)
.params("avatar", avatar)
.params("type", type)
.params("user_id", UserID)
.params("source", DEVICE)
.params("sign", sign)
.params("lastlogindevice", "Android")
.params("pushid", "")
.execute(callback);
}
/**
* 请求签到奖励
*/
public static void requestBonus(HttpCallback callback) {
String appVer = AppUtils.getAppVersionName();
HttpClient.getInstance().get("User.bonus", MainHttpConsts.REQUEST_BONUS)
.params("appAndroidVersion", appVer)
.execute(callback);
}
/**
* 新版本签到奖励
*/
public static void requestNewBonus(HttpCallback callback) {
HttpClient.getInstance().get("Sign.userSign", MainHttpConsts.REQUEST_BONUS)
.params("uuid_Device", DeviceUtils.getUniqueDeviceId())
.params("lastlogindevice", "Android")
.params("model", android.os.Build.BRAND + android.os.Build.MODEL)
.execute(callback);
}
/**
* 获取签到奖励
*/
public static void getBonus(HttpCallback callback) {
HttpClient.getInstance().get("User.getBonus", MainHttpConsts.GET_BONUS)
.execute(callback);
}
/**
* 用于用户首次登录设置分销关系
*/
public static void setDistribut(String code, HttpCallback callback) {
HttpClient.getInstance().get("User.setDistribut", MainHttpConsts.SET_DISTRIBUT)
.params("code", code)
.execute(callback);
}
/**
* 首页直播
*/
public static void getHot(int p, HttpCallback callback) {
HttpClient.getInstance().get("Home.getHot", MainHttpConsts.GET_HOT)
.params("p", p)
.execute(callback);
}
/**
* 首页推荐直播
*/
public static void getRandom(int p, HttpCallback callback) {
HttpClient.getInstance().get("Home.getRandom", MainHttpConsts.GET_RANDOM)
.execute(callback);
}
/**
* 首页关注直播
*/
public static void getHomeFollow(int p, HttpCallback callback) {
HttpClient.getInstance().get("Home.getFollow", MainHttpConsts.GET_HOME_FOLLOW)
.params("p", p)
.execute(callback);
}
/**
* 首页红包专区
*/
public static void getRedPacket(int p, HttpCallback callback) {
HttpClient.getInstance().get("Home.getRedPacket", MainHttpConsts.GET_RANDOM)
.execute(callback);
}
/**
* 首页
*/
public static void getFollow(int p, HttpCallback callback) {
HttpClient.getInstance().get("Home.getFollow", MainHttpConsts.GET_FOLLOW)
.params("p", p)
.execute(callback);
}
/**
* 首页 附近
*/
public static void getNear(int p, HttpCallback callback) {
HttpClient.getInstance().get("Home.getNearby", MainHttpConsts.GET_NEAR)
.params("lng", CommonAppConfig.getInstance().getLng())
.params("lat", CommonAppConfig.getInstance().getLat())
.params("p", p)
.execute(callback);
}
//排行榜 魅力榜
public static void profitList(String type, int p, HttpCallback callback) {
HttpClient.getInstance().get("Home.profitList", MainHttpConsts.PROFIT_LIST)
.params("type", type)
.params("p", p)
.execute(callback);
}
//排行榜 豪气榜
public static void consumeList(String type, int p, HttpCallback callback) {
HttpClient.getInstance().get("Home.consumeList", MainHttpConsts.CONSUME_LIST)
.params("type", type)
.params("p", p)
.execute(callback);
}
//排行榜 盲盒榜
public static void blindBoxList(String type, int p, HttpCallback callback) {
HttpClient.getInstance().get("Home.blindBoxList", MainHttpConsts.BLIND_BOX_LIST)
.params("type", type)
.params("p", p)
.execute(callback);
}
/**
* 获取谷歌
*/
public static void getGoogle(String token, final CommonCallback<GoogleBean> commonCallback) {
HttpClient.getInstance().get("Charge.getChargeHide", MainHttpConsts.GET_BASE_INFO)
.params("terminal", "1")
.params("token", token)
.execute(new HttpCallback() {
@Override
public void onSuccess(int code, String msg, String info[]) {
if (code == 0) {
JSONObject obj = JSON.parseObject(info[0]);
GoogleBean bean = JSON.toJavaObject(obj, GoogleBean.class);
if (commonCallback != null) {
Log.i("tag", bean.getIs_hide());
commonCallback.callback(bean);
}
}
}
@Override
public void onError() {
if (commonCallback != null) {
commonCallback.callback(null);
}
}
});
}
/**
* 获取用户信息
*/
public static void getBaseInfo(String uid, String token, final CommonCallback<UserBean> commonCallback) {
HttpClient.getInstance().get("User.getBaseInfos", MainHttpConsts.GET_BASE_INFO)
.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]);
if (commonCallback != null) {
commonCallback.callback(bean);
}
if ("0".equals(bean.getFront_task())) {
EventBus.getDefault().post(new UpdateTablePointMe(0));
} else {
EventBus.getDefault().post(new UpdateTablePointMe(1));
}
}
}
@Override
public void onError() {
if (commonCallback != null) {
commonCallback.callback(null);
}
}
});
}
public static void getBaseInfos(String uid, String token, HttpCallback callback) {
HttpClient.getInstance().get("User.getBaseInfos", MainHttpConsts.GET_BASE_INFO)
.execute(callback);
}
/**
* 获取用户信息
*/
public static void getBaseInfo(CommonCallback<UserBean> commonCallback) {
getBaseInfo(CommonAppConfig.getInstance().getUid(),
CommonAppConfig.getInstance().getToken(),
commonCallback);
}
/**
* 获取用户钱
*/
public static void getBalance(HttpCallback callback) {
HttpClient.getInstance().get("User.getUserBalance", "User.getUserBalance")
.execute(callback);
}
/**
* 获取谷歌上架
*/
public static void getGoogle(CommonCallback<GoogleBean> commonCallback) {
getGoogle(CommonAppConfig.getInstance().getToken(),
commonCallback);
}
/**
* 拉黑对方 解除拉黑
*/
public static void setBlack(String toUid, HttpCallback callback) {
HttpClient.getInstance().get("User.setBlack", MainHttpConsts.SET_BLACK)
.params("touid", toUid)
.execute(callback);
}
/**
* 获取个性设置列表
*/
public static void getSettingList(HttpCallback callback) {
HttpClient.getInstance().get("User.getPerSetting", MainHttpConsts.GET_SETTING_LIST)
.params("version", VersionUtil.getVersion())
.execute(callback);
}
/**
* 搜索
*/
public static void search(String key, int type, int p, HttpCallback callback) {
HttpClient.getInstance().get("Home.search", MainHttpConsts.SEARCH)
.params("key", key)
.params("type", type)
.params("p", p)
.execute(callback);
}
/**
* 搜索
*/
public static void searchnew(String fan_key, String jian_key, int type, int p, HttpCallback callback) {
HttpClient.getInstance().get("", MainHttpConsts.SEARCH)
.params("jian_key", jian_key)
.params("fan_key", fan_key)
.params("type", type)
.params("p", p)
.execute(callback);
}
/**
* 获取我的拉黑列表
*/
public static void getBlackList(int p, HttpCallback callback) {
HttpClient.getInstance().get("User.getBlackList", "User.getBlackList")
.params("p", p)
.execute(callback);
}
/**
* 获取对方的关注列表
*
* @param touid 对方的uid
*/
public static void getFollowList(String touid, int p, HttpCallback callback) {
HttpClient.getInstance().get("User.getFollowsList", MainHttpConsts.GET_FOLLOW_LIST)
.params("touid", touid)
.params("p", p)
.execute(callback);
}
/**
* 获取对方的粉丝列表
*
* @param touid 对方的uid
*/
public static void getFansList(String touid, int p, HttpCallback callback) {
HttpClient.getInstance().get("User.getFansList", MainHttpConsts.GET_FANS_LIST)
.params("touid", touid)
.params("p", p)
.execute(callback);
}
/**
* 上传头像用post
*/
public static void updateAvatar(File file, HttpCallback callback) {
HttpClient.getInstance().post("User.updateAvatar", MainHttpConsts.UPDATE_AVATAR)
.isMultipart(true)
.params("file", file)
.execute(callback);
}
/**
* 更新用户资料
*
* @param fields 用户资料 ,以json形式出现
*/
public static void updateFields(String fields, HttpCallback callback) {
HttpClient.getInstance().get("User.updateFields", MainHttpConsts.UPDATE_FIELDS)
.params("fields", fields)
.execute(callback);
}
/**
* 获取 我的收益 可提现金额数
*/
public static void getProfit(HttpCallback callback) {
HttpClient.getInstance().get("User.getProfit", MainHttpConsts.GET_PROFIT)
.execute(callback);
}
/**
* 获取 提现账户列表
*/
public static void getCashAccountList(HttpCallback callback) {
HttpClient.getInstance().get("User.getUserAccountList", MainHttpConsts.GET_USER_ACCOUNT_LIST)
.execute(callback);
}
/**
* 添加 提现账户
*/
public static void addCashAccount(String account, String name, String bank, int type, HttpCallback callback) {
HttpClient.getInstance().get("User.setUserAccount", MainHttpConsts.ADD_CASH_ACCOUNT)
.params("account", account)
.params("name", name)
.params("account_bank", bank)
.params("type", type)
.execute(callback);
}
/**
* 删除 提现账户
*/
public static void deleteCashAccount(String accountId, HttpCallback callback) {
HttpClient.getInstance().get("User.delUserAccount", MainHttpConsts.DEL_CASH_ACCOUNT)
.params("id", accountId)
.execute(callback);
}
/**
* 提现
*/
public static void doCash(String votes, String accountId, HttpCallback callback) {
HttpClient.getInstance().get("User.setCash", MainHttpConsts.DO_CASH)
.params("cashvote", votes)//提现的票数
.params("accountid", accountId)//账号ID
.execute(callback);
}
/**
* 分类直播
*/
public static void getClassLive(int classId, int p, HttpCallback callback) {
HttpClient.getInstance().get("Home.getClassLive", MainHttpConsts.GET_CLASS_LIVE)
.params("liveclassid", classId)
.params("p", p)
.execute(callback);
}
/**
* 获取自己收到的主播印象列表
*/
public static void getMyImpress(HttpCallback callback) {
HttpClient.getInstance().get("User.getMyLabel", MainHttpConsts.GET_MY_IMPRESS)
.execute(callback);
}
/**
* 用于用户首次登录推荐
*/
public static void getRecommend(HttpCallback callback) {
HttpClient.getInstance().get("Home.getRecommend", MainHttpConsts.GET_RECOMMEND)
.execute(callback);
}
/**
* 用于用户首次登录推荐,关注主播
*/
public static void recommendFollow(String touid, HttpCallback callback) {
HttpClient.getInstance().get("Home.attentRecommend", MainHttpConsts.RECOMMEND_FOLLOW)
.params("touid", touid)
.execute(callback);
}
/**
* 获取验证码接口 注册用
*/
public static void getRegisterCode(String mobile, HttpCallback callback) {
String sign = MD5Util.getMD5("mobile=" + mobile + "&" + SALT);
HttpClient.getInstance().get("Login.getCode", MainHttpConsts.GET_REGISTER_CODE)
.params("mobile", mobile)
.params("sign", sign)
.params("source", "1")
.execute(callback);
}
/**
* 获取验证码接口 注册用
* 增加国家代码
*/
public static void getRegisterCode(String Randstr, String Ticket, String mobile, int countryCode, HttpCallback callback) {
String sign = MD5Util.getMD5("mobile=" + mobile + "&" + SALT);
String uuid = DeviceUtils.getUniqueDeviceId();
HttpClient.getInstance().get("Login.getCode", MainHttpConsts.GET_REGISTER_CODE)
.params("mobile", mobile)
.params("country_code", countryCode + "")
.params("sign", sign)
.params("Randstr", Randstr)
.params("Ticket", Ticket)
.params("MacAddress", getNewMac())
.params("Imei", uuid)
.params("source", "1")
.execute(callback);
}
/**
* 第三方绑定手机号
*/
public static void bindPhone(String mobile, int countryCode, String uid, String token, String user_pass, String user_pass2, String code, HttpCallback callback) {
HttpClient.getInstance().get("Login.bindMobile", MainHttpConsts.BINDMOBILE)
.params("mobile", mobile)
.params("country_code", countryCode + "")
.params("uid", uid, true)
.params("token", token, true)
.params("user_pass", user_pass)
.params("user_pass2", user_pass2)
.params("code", code)
.execute(callback);
}
/**
* 修改绑定手机号
*/
public static void updateBindMobile(String mobile, int countryCode, String uid, String token, String code, HttpCallback callback) {
HttpClient.getInstance().get("Login.updateBindMobile", MainHttpConsts.UPDATEBINDMOBILE)
.params("mobile", mobile)
.params("country_code", countryCode + "")
.params("uid", uid, true)
.params("token", token, true)
.params("code", code)
.execute(callback);
}
// /**
// * 手机注册接口
// */
// public static void register(String user_login, String pass, String pass2, String code, HttpCallback callback) {
// HttpClient.getInstance().get("Login.userReg", MainHttpConsts.REGISTER)
// .params("user_login", user_login)
// .params("user_pass", pass)
// .params("user_pass2", pass2)
// .params("code", code)
// .params("source", DEVICE)
// .execute(callback);
// }
/**
* 手机注册接口---增加参数推广码,手机唯一标识,国家代码
*/
public static void register(String UserID, String invitecode, String user_login, String promo_code, String uuidDevice, int countryCode, String pass, String pass2, String code, HttpCallback callback) {
HttpClient.getInstance().get("Login.userReg", MainHttpConsts.REGISTER)
.params("user_login", user_login)
.params("app_source", CommonAppConfig.IS_GOOGLE_PLAY == true ? "1" : "3")
//增加参数推广码
.params("user_activation_key", promo_code)
.params("admin_id", promo_code)
.params("user_id", UserID)
//增加参数手机唯一标识
.params("uuid_Device", uuidDevice)
//增加国家代码
.params("country_code", countryCode + "")
.params("user_pass", pass)
.params("user_pass2", pass2)
.params("code", code)
.params("source", DEVICE)
.params("invitation_code", invitecode)
.execute(callback);
}
/**
* 找回密码
*/
public static void findPwd(String user_login, String pass, String pass2, String code, HttpCallback callback) {
HttpClient.getInstance().get("Login.userFindPass", MainHttpConsts.FIND_PWD)
.params("user_login", user_login)
.params("user_pass", pass)
.params("user_pass2", pass2)
.params("code", code)
.execute(callback);
}
/**
* 重置密码
*/
public static void modifyPwd(String oldpass, String pass, String pass2, HttpCallback callback) {
HttpClient.getInstance().get("User.updatePass", MainHttpConsts.MODIFY_PWD)
.params("oldpass", oldpass)
.params("pass", pass)
.params("pass2", pass2)
.execute(callback);
}
/**
* 获取验证码接口 找回密码用
*/
public static void getFindPwdCode(String mobile, String country_code, HttpCallback callback) {
// String sign = MD5Util.getMD5("mobile=" + mobile + "&" + SALT);
HttpClient.getInstance().get("Login.getCode", MainHttpConsts.GET_FIND_PWD_CODE)
.params("mobile", mobile)
.params("country_code", country_code)
.params("source", "1")
.execute(callback);
}
/**
* 三级分销页面 获取二维码
*/
public static void getQrCode(HttpCallback callback) {
HttpClient.getInstance().get("Agent.getCode", MainHttpConsts.GET_QR_CODE)
.params("source", "1")
.execute(callback);
}
/**
* 首页的排行榜轮播
*/
public static void getHomeTop(HttpCallback callback) {
HttpClient.getInstance().get("Home.consumeproList", MainHttpConsts.HOME_TOP)
.params("type", "month")
.params("p", "1")
.execute(callback);
}
/**
* 动态赠送礼物
*/
public static void sendDynamicGift(String id, int gift_num, String gift_id, HttpCallback callback) {
HttpClient.getInstance().get("Community.sendDynamicGift", MainHttpConsts.SEND_DYNAMICGIFT)
.params("dynamic_id", id)
.params("gift_num", gift_num)
.params("gift_id", gift_id)
.execute(callback);
}
/**
* 动态赠送礼物列表
*/
public static void getDynamicGiftInfo(HttpCallback callback) {
HttpClient.getInstance().get("Community.getDynamicGiftInfo", MainHttpConsts.GET_DYNAMICGIFTINFO)
.execute(callback);
}
/**
* 社区动态礼物信息列表
*/
public static void getDynamicSendGiftList(String id, HttpCallback callback) {
HttpClient.getInstance().get("Community.getDynamicSendGiftList", MainHttpConsts.GET_DYNAMICSENDGIFTLIST)
.params("dynamic_id", id)
.execute(callback);
}
/**
* 是否是主播
*/
public static void isAnchor(HttpCallback callback) {
HttpClient.getInstance().get("User.isAnchor", MainHttpConsts.ISANCHOR)
.execute(callback);
}
/**
* 是否是完成任务
*/
public static void getUserFrontTaskType(HttpCallback callback) {
HttpClient.getInstance().get("Task.getUserFrontTaskType", MainHttpConsts.GET_USER_FRONTTASKTYPE)
.execute(callback);
}
/**
* 客服地址
*/
public static void getCustomerService(HttpCallback callback) {
HttpClient.getInstance().get("Home.getCustomerService", MainHttpConsts.GETCUSTOMERSERVICE)
.execute(callback);
}
/**
* 获取im备注信息
*/
public static void getInstructorRemark(HttpCallback callback) {
HttpClient.getInstance().get("User.getInstructorRemark", MainHttpConsts.GETINSTRUCTORREMARK)
.execute(callback);
}
/**
* 是否管理员
*/
public static void isInstructor(HttpCallback callback) {
HttpClient.getInstance().get("User.isInstructor", MainHttpConsts.ISINSTRUCTOR)
.execute(callback);
}
//
public static void setMessageReadAll() {
HttpClient.getInstance().get("User.getUserInstructor", "")
.execute(new HttpCallback() {
@Override
public void onSuccess(int code, String msg, String[] info) {
}
});
}
/**
* 获取设备号有没有注册过
*/
public static void getDeviceLoginType(HttpCallback callback) {
HttpClient.getInstance().get("Login.getDeviceLoginType", "Login.getDeviceLoginType")
.params("uuid_Device", DeviceUtils.getUniqueDeviceId())
.execute(callback);
}
/**
* 通过网络接口取
* @return
*/
public static String getNewMac() {
try {
List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface nif : all) {
if (!nif.getName().equalsIgnoreCase("wlan0")) continue;
byte[] macBytes = nif.getHardwareAddress();
if (macBytes == null) {
return null;
}
StringBuilder res1 = new StringBuilder();
for (byte b : macBytes) {
res1.append(String.format("%02X:", b));
}
if (res1.length() > 0) {
res1.deleteCharAt(res1.length() - 1);
}
return res1.toString();
}
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
}

View File

@ -0,0 +1,32 @@
package com.shayu.onetoone.utils;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import androidx.fragment.app.Fragment;
import io.rong.imkit.conversation.extension.RongExtension;
import io.rong.imkit.conversation.extension.component.plugin.IPluginModule;
public class MessageMsgInputPanelPlugin implements IPluginModule {
@Override
public Drawable obtainDrawable(Context context) {
return null;
}
@Override
public String obtainTitle(Context context) {
return null;
}
@Override
public void onClick(Fragment currentFragment, RongExtension extension, int index) {
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
}
}

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:width="343dp" android:height="84dp">
<shape android:shape="rectangle">
<solid android:color="#ffffffff" />
<corners android:topLeftRadius="10dp" android:topRightRadius="10dp" android:bottomLeftRadius="10dp" android:bottomRightRadius="10dp" />
</shape>
</item>
</selector>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:width="51dp" android:height="29dp">
<shape android:shape="rectangle">
<solid android:color="#ff8e7ddf" />
<corners android:topLeftRadius="6dp" android:topRightRadius="6dp" android:bottomLeftRadius="6dp" android:bottomRightRadius="6dp" />
</shape>
</item>
</selector>

View File

@ -1,71 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.makeramen.roundedimageview.RoundedImageView
android:id="@+id/msg_message_avatar"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:scaleType="centerCrop"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:riv_oval="true"
tools:src="@tools:sample/avatars" />
<TextView
android:id="@+id/msg_message_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginBottom="8dp"
android:textColor="@android:color/black"
android:textSize="20sp"
app:layout_constraintBottom_toTopOf="@+id/msg_message_content"
app:layout_constraintStart_toEndOf="@+id/msg_message_avatar"
app:layout_constraintTop_toTopOf="@+id/msg_message_avatar"
tools:text="@tools:sample/full_names" />
<TextView
android:id="@+id/msg_message_content"
android:layout_width="185dp"
android:layout_height="20dp"
android:layout_marginStart="8dp"
app:layout_constraintBottom_toBottomOf="@+id/msg_message_avatar"
app:layout_constraintStart_toEndOf="@+id/msg_message_avatar"
tools:text="@tools:sample/lorem[4:10]" />
<TextView
android:id="@+id/msg_message_content_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/msg_message_content"
tools:text="@tools:sample/date/hhmm" />
<TextView
android:id="@+id/msg_message_content_not_read"
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_marginEnd="20dp"
android:autoSizeMaxTextSize="14sp"
android:autoSizeMinTextSize="5sp"
android:autoSizeStepGranularity="1sp"
android:autoSizeTextType="uniform"
android:background="@drawable/bg_red_point"
android:ellipsize="marquee"
android:gravity="center"
android:text="0"
android:textColor="#fff"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,10 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.LauncherActivity">
</androidx.constraintlayout.widget.ConstraintLayout>
<EditText
android:id="@+id/edit_user"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="322dp"
android:ems="10"
android:inputType="text"
android:hint="账号"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<EditText
android:id="@+id/edit_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="34dp"
android:ems="10"
android:inputType="text"
android:hint="密码"
app:layout_constraintStart_toStartOf="@+id/edit_user"
app:layout_constraintTop_toBottomOf="@+id/edit_user" />
<Button
android:id="@+id/login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="34dp"
android:text="登陆"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/edit_password" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -8,7 +8,6 @@
android:id="@+id/container"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@color/color_b14066"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"

View File

@ -9,7 +9,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="357dp"
android:layout_marginEnd="142dp"
android:text="Dynamic"
android:text="动态"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,14 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#F7F7F7">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.angcyo.tablayout.DslTabLayout
android:id="@+id/dslTabLayout"
@ -36,36 +34,49 @@
android:layout_width="wrap_content"
android:textSize="16sp"
android:layout_height="wrap_content"
android:text="消息" />
android:text="推荐" />
<TextView
android:gravity="center"
android:textSize="16sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="好友" />
android:text="热门" />
</com.angcyo.tablayout.DslTabLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView android:layout_width="30dp"
android:layout_height="30dp"
/>
</LinearLayout>
</RelativeLayout>
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/dslTabLayout" />
app:layout_constraintTop_toBottomOf="@+id/dslTabLayout" >
</androidx.viewpager2.widget.ViewPager2>
<ImageView
android:id="@+id/btn_filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="42dp"
android:layout_marginEnd="14dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@mipmap/ic_tab_dynamic_filter" />
<ImageView
android:id="@+id/btn_top"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="42dp"
android:layout_marginEnd="24dp"
app:layout_constraintEnd_toStartOf="@+id/btn_filter"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@mipmap/ic_tab_dynamic_top" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<io.rong.imkit.widget.refresh.SmartRefreshLayout
android:id="@+id/swipeRefreshLayout"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.yanzhenjie.recyclerview.SwipeRecyclerView
android:id="@+id/recyclerView"
tools:listitem="@layout/rc_conversationlist_item"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</io.rong.imkit.widget.refresh.SmartRefreshLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -6,8 +6,8 @@
<ImageView
android:id="@+id/more"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="30dp"
android:layout_height="26dp"
android:layout_marginTop="42dp"
android:layout_marginEnd="16dp"
android:src="@mipmap/ic_message_tab_more"
@ -18,6 +18,7 @@
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"

View File

@ -5,62 +5,28 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/net_error"
android:layout_width="match_parent"
android:layout_height="41dp"
android:background="#FEE9EE"
<include
android:id="@+id/rc_conversationlist_notice_container"
layout="@layout/rc_conversationlist_notice_view"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible" />
<ImageView
android:id="@+id/imageView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="3dp"
android:src="@mipmap/ic_message_tab_right"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/textView5"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="3dp"
android:src="@mipmap/ic_message_tab_error"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/textView5"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="网络不给力,请检查网络设置"
android:textColor="#E26891"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
<io.rong.imkit.widget.refresh.SmartRefreshLayout
android:id="@+id/swipeRefreshLayout"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/net_error">
app:layout_constraintTop_toBottomOf="@+id/rc_conversationlist_notice_container">
<com.yanzhenjie.recyclerview.SwipeRecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:listitem="@layout/item_msg_message" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
tools:listitem="@layout/rc_conversationlist_item" />
</io.rong.imkit.widget.refresh.SmartRefreshLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -9,7 +9,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="357dp"
android:layout_marginEnd="142dp"
android:text="My"
android:text="我的"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<io.rong.imkit.widget.refresh.SmartRefreshLayout
android:id="@+id/swipeRefreshLayout"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.yanzhenjie.recyclerview.SwipeRecyclerView
android:id="@+id/recyclerView"
tools:listitem="@layout/rc_conversationlist_item"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</io.rong.imkit.widget.refresh.SmartRefreshLayout>
<ImageView
android:id="@+id/btn_top_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginBottom="5dp"
android:src="@mipmap/ic_recommend_top"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:background="@drawable/bg_home_recommend_item"
android:layout_height="84dp"
xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_marginStart="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.makeramen.roundedimageview.RoundedImageView
android:id="@+id/avatar"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_centerHorizontal="true"
android:scaleType="centerCrop"
android:src="@drawable/m_chu_xia"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:riv_oval="true" />
<ImageView
android:id="@+id/sex"
android:layout_width="16dp"
android:layout_height="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:srcCompat="@mipmap/ic_message_tab_woman" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="7dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/btn_chat_up"
app:layout_constraintStart_toEndOf="@+id/constraintLayout"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
</LinearLayout>
<ImageView
android:id="@+id/btn_chat_up"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="34dp"
android:src="@mipmap/ic_home_recommend_chat_up"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,66 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.makeramen.roundedimageview.RoundedImageView
android:id="@+id/msg_message_avatar"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:scaleType="centerCrop"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:riv_oval="true"
tools:src="@tools:sample/avatars" />
<TextView
android:id="@+id/msg_message_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginBottom="8dp"
android:textColor="@android:color/black"
android:textSize="20sp"
app:layout_constraintBottom_toTopOf="@+id/msg_message_content"
app:layout_constraintStart_toEndOf="@+id/msg_message_avatar"
app:layout_constraintTop_toTopOf="@+id/msg_message_avatar"
tools:text="@tools:sample/full_names" />
<TextView
android:id="@+id/msg_message_content"
android:layout_width="185dp"
android:layout_height="20dp"
android:layout_marginStart="8dp"
app:layout_constraintBottom_toBottomOf="@+id/msg_message_avatar"
app:layout_constraintStart_toEndOf="@+id/msg_message_avatar"
tools:text="@tools:sample/lorem[4:10]" />
<TextView
android:id="@+id/msg_message_content_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/msg_message_content"
tools:text="@tools:sample/date/hhmm" />
<TextView
android:id="@+id/msg_message_content_not_read"
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_marginEnd="20dp"
android:autoSizeTextType="uniform"
android:background="@drawable/bg_red_point"
android:ellipsize="marquee"
android:gravity="center"
android:text="0"
android:textColor="#fff"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/rc_conversation_portrait"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:scaleType="centerCrop"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:riv_oval="true"
tools:src="@tools:sample/avatars" />
<TextView
android:id="@+id/rc_conversation_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginBottom="8dp"
android:textColor="@android:color/black"
android:textSize="20sp"
app:layout_constraintBottom_toTopOf="@+id/rc_conversation_content"
app:layout_constraintStart_toEndOf="@+id/rc_conversation_portrait"
app:layout_constraintTop_toTopOf="@+id/rc_conversation_portrait"
tools:text="@tools:sample/full_names" />
<TextView
android:id="@+id/rc_conversation_content"
android:layout_width="wrap_content"
android:layout_height="20dp"
android:layout_marginStart="8dp"
app:layout_constraintBottom_toBottomOf="@+id/rc_conversation_portrait"
app:layout_constraintStart_toEndOf="@+id/rc_conversation_portrait"
tools:text="@tools:sample/lorem[4:10]" />
<TextView
android:id="@+id/rc_conversation_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/rc_conversation_content"
tools:text="@tools:sample/date/hhmm" />
<androidx.constraintlayout.widget.ConstraintLayout
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">
<TextView
android:id="@+id/rc_conversation_unread_count"
android:layout_width="18dp"
android:layout_height="18dp"
android:autoSizeTextType="uniform"
android:background="@drawable/bg_red_point"
android:ellipsize="marquee"
android:gravity="center"
android:text="0"
android:textColor="#fff"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<ImageView
android:id="@+id/rc_conversation_read_receipt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,153 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="visible"
tools:visibility="visible">
<ImageView
android:id="@+id/input_panel_voice_toggle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="6dp"
android:src="@mipmap/ic_msg_audio"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/edit_btn"
style="@style/EditTextStyle.Alignment"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="6.5dp"
android:layout_marginEnd="5dp"
android:background="@drawable/rc_ext_panel_editbox_background"
android:hint="輸入信息"
android:maxLines="4"
android:textColorHint="#BDBDBD"
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" />
<TextView
android:id="@+id/press_to_speech_btn"
style="@style/TextStyle.Alignment"
android:layout_width="0dp"
android:layout_height="@dimen/rc_ext_input_panel_editbox_height"
android:layout_marginStart="8dp"
android:layout_marginTop="6.5dp"
android:layout_marginEnd="5dp"
android:background="@drawable/rc_ext_voice_idle_button"
android:gravity="center"
android:text="@string/rc_voice_press_to_input"
android:textColor="@color/rc_text_main_color"
android:textSize="@dimen/rc_font_nav_or_date_size"
android:visibility="gone"
app:layout_constraintEnd_toStartOf="@+id/input_panel_emoji_btn"
app:layout_constraintStart_toEndOf="@+id/input_panel_voice_toggle"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/input_panel_emoji_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="6.5dp"
android:layout_marginEnd="5dp"
android:src="@mipmap/ic_msg_emoji"
app:layout_constraintEnd_toStartOf="@+id/input_panel_add_or_send"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/input_panel_add_or_send"
android:layout_width="41dp"
android:layout_height="wrap_content"
android:layout_marginTop="6.5dp"
android:layout_marginEnd="5dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">
<Button
android:id="@+id/input_panel_send_btn"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@drawable/bg_msg_send"
android:text="@string/rc_send"
android:textColor="@color/rc_white_color"
android:textSize="@dimen/rc_font_text_third_size"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible" />
<Button
android:id="@+id/send_btn"
android:layout_width="wrap_content"
android:layout_height="34dp"
android:background="@drawable/bg_msg_send"
android:text="@string/rc_send"
android:textColor="@color/rc_white_color"
android:textSize="@dimen/rc_font_text_third_size"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/edit_btn">
<ImageView
android:id="@+id/input_panel_image_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="4dp"
android:layout_weight="1"
android:src="@mipmap/ic_msg_image" />
<ImageView
android:id="@+id/input_panel_call_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="4dp"
android:layout_weight="1"
android:src="@mipmap/ic_msg_call" />
<ImageView
android:id="@+id/input_panel_video_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="4dp"
android:layout_weight="1"
android:src="@mipmap/ic_msg_video" />
<ImageView
android:id="@+id/input_panel_gift_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="4dp"
android:layout_weight="1"
android:src="@mipmap/ic_msg_gift" />
<ImageView
android:id="@+id/input_panel_add_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="4dp"
android:layout_weight="1"
android:src="@mipmap/ic_msg_add" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

@ -154,13 +154,13 @@ dependencies {
//im
api 'com.tencent.imsdk:imsdk-plus:5.4.666'
api 'com.google.code.gson:gson:2.8.8'
api 'cn.rongcloud.sdk:rtc_lib:5.2.0' //
api 'cn.rongcloud.sdk:rtc_lib:5.5.0' //
// 5.1.2
api 'cn.rongcloud.sdk:im_lib:5.2.0.2'
api 'cn.rongcloud.sdk:call_lib:5.2.0'
api 'cn.rongcloud.sdk:im_lib:5.5.0'
api 'cn.rongcloud.sdk:call_lib:5.5.0'
// 5.1.2
api 'cn.rongcloud.sdk:im_kit:5.2.5.4' // UI
api 'cn.rongcloud.sdk:im_kit:5.5.0' // UI
//
api 'cn.rongcloud.sdk:sight:5.2.5.4'
api 'com.facebook.android:facebook-android-sdk:15.2.0'

View File

@ -6,6 +6,7 @@ import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;
import androidx.fragment.app.FragmentActivity;
import androidx.core.content.FileProvider;
@ -36,9 +37,20 @@ public class ProcessImageUtil extends ProcessResultUtil {
private File mCorpResult;//裁剪后得到的图片
private ImageResultCallback mResultCallback;
private boolean mNeedCrop;//是否需要裁剪
private String authority = "com.pdlive.shayu.fileprovider";
public ProcessImageUtil(FragmentActivity activity, String authority) {
super(activity);
this.authority = authority;
init(activity);
}
public ProcessImageUtil(FragmentActivity activity) {
super(activity);
init(activity);
}
private void init(FragmentActivity activity) {
mContext = activity;
mCameraPermissions = new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
@ -67,7 +79,7 @@ public class ProcessImageUtil extends ProcessResultUtil {
if (mNeedCrop) {
Uri uri = null;
if (Build.VERSION.SDK_INT >= 24) {
uri = FileProvider.getUriForFile(mContext, "com.pdlive.shayu.fileprovider", mCameraResult);
uri = FileProvider.getUriForFile(mContext, authority, mCameraResult);
} else {
uri = Uri.fromFile(mCameraResult);
}
@ -147,14 +159,16 @@ public class ProcessImageUtil extends ProcessResultUtil {
mCameraResult = getNewFile();
Uri uri = null;
if (Build.VERSION.SDK_INT >= 24) {
uri = FileProvider.getUriForFile(mContext, "com.pdlive.shayu.fileprovider", mCameraResult);
uri = FileProvider.getUriForFile(mContext, authority, mCameraResult);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
} else {
uri = Uri.fromFile(mCameraResult);
}
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, mCameraResultCallback);
}catch (Exception e){e.printStackTrace();}
} catch (Exception e) {
e.printStackTrace();
}
}
private File getNewFile() {
@ -200,7 +214,7 @@ public class ProcessImageUtil extends ProcessResultUtil {
startActivityForResult(intent, mCropResultCallback);
} catch (Exception e) {
try {
Uri resultUri = FileProvider.getUriForFile(mContext, "com.pdlive.shayu.fileprovider", mCorpResult);
Uri resultUri = FileProvider.getUriForFile(mContext, authority, mCorpResult);
if (resultUri == null || mFragment == null || mContext == null) {
return;
}

View File

@ -227,7 +227,7 @@ public class LiveRyAnchorActivity extends LiveActivity implements LiveFunctionCl
//丢包率
long lossRate = statusBean.packetLostRate;
//带宽
String googAvailableSendBandwidth = statusReport.googAvailableSendBandwidth;
//String googAvailableSendBandwidth = statusReport.googAvailableSendBandwidth;
// Log.e("网速和内存", "获取视频:" + resolution + " 丢包率:" + lossRate + " 带宽:" + googAvailableSendBandwidth);
}
}