update
61
OneToOne/README.md
Normal 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项目,注册即可,暂时共用
|
||||
|
||||
### 混淆
|
||||
暂不混淆
|
@ -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
|
||||
|
@ -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}" />
|
||||
|
@ -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;
|
||||
}
|
||||
});
|
||||
|
@ -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) {
|
||||
|
@ -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() {
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
@ -8,6 +8,9 @@ import android.view.ViewGroup;
|
||||
|
||||
import com.shayu.onetoone.R;
|
||||
|
||||
/**
|
||||
* 动态主页面
|
||||
*/
|
||||
public class DynamicFragment extends BaseFragment {
|
||||
|
||||
@Override
|
||||
|
@ -8,6 +8,9 @@ import android.view.ViewGroup;
|
||||
|
||||
import com.shayu.onetoone.R;
|
||||
|
||||
/**
|
||||
* 交友主页面
|
||||
*/
|
||||
public class FriendsFragment extends BaseFragment {
|
||||
@Override
|
||||
public void initView(View itemView) {
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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() {
|
||||
|
||||
}
|
||||
}
|
@ -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() {
|
||||
|
||||
}
|
||||
}
|
@ -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());
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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<>();
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
@ -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() {
|
||||
|
100
OneToOne/src/main/java/com/shayu/onetoone/network/API.java
Normal 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;
|
||||
}
|
||||
}
|
@ -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 {
|
||||
|
||||
|
||||
}
|
@ -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);
|
||||
|
||||
}
|
||||
}
|
@ -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";
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -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) {
|
||||
|
||||
}
|
||||
}
|
@ -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>
|
9
OneToOne/src/main/res/drawable/bg_msg_send.xml
Normal 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>
|
@ -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>
|
@ -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>
|
@ -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"
|
||||
|
@ -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>
|
@ -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>
|
21
OneToOne/src/main/res/layout/fragment_hot.xml
Normal 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>
|
@ -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"
|
||||
|
@ -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>
|
@ -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>
|
31
OneToOne/src/main/res/layout/fragment_recommend.xml
Normal 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>
|
75
OneToOne/src/main/res/layout/item_home_recommend.xml
Normal 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>
|
@ -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>
|
83
OneToOne/src/main/res/layout/rc_conversationlist_item.xml
Normal 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>
|
153
OneToOne/src/main/res/layout/rc_extension_input_panel.xml
Normal 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>
|
BIN
OneToOne/src/main/res/mipmap-xxhdpi/ic_home_recommend_chat.png
Normal file
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 24 KiB |
BIN
OneToOne/src/main/res/mipmap-xxhdpi/ic_msg_add.png
Normal file
After Width: | Height: | Size: 4.5 KiB |
BIN
OneToOne/src/main/res/mipmap-xxhdpi/ic_msg_audio.png
Normal file
After Width: | Height: | Size: 4.9 KiB |
BIN
OneToOne/src/main/res/mipmap-xxhdpi/ic_msg_call.png
Normal file
After Width: | Height: | Size: 4.4 KiB |
BIN
OneToOne/src/main/res/mipmap-xxhdpi/ic_msg_emoji.png
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
OneToOne/src/main/res/mipmap-xxhdpi/ic_msg_gift.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
BIN
OneToOne/src/main/res/mipmap-xxhdpi/ic_msg_image.png
Normal file
After Width: | Height: | Size: 3.8 KiB |
BIN
OneToOne/src/main/res/mipmap-xxhdpi/ic_msg_video.png
Normal file
After Width: | Height: | Size: 3.0 KiB |
BIN
OneToOne/src/main/res/mipmap-xxhdpi/ic_recommend_top.png
Normal file
After Width: | Height: | Size: 8.0 KiB |
@ -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'
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|