/*
* Copyright (c) 2020 WildFireChat. All rights reserved.
*/
package com.highdatas.madeasy.patient;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Handler;
import android.text.TextUtils;
import android.widget.Toast;
import cn.wildfire.chat.kit.AppServiceProvider;
import cn.wildfire.chat.kit.ChatManagerHolder;
import cn.wildfire.chat.kit.Config;
import cn.wildfire.chat.kit.WfcUIKit;
import cn.wildfire.chat.kit.favorite.FavoriteItem;
import cn.wildfire.chat.kit.group.GroupAnnouncement;
import cn.wildfire.chat.kit.net.BaseResultCallBack;
import cn.wildfire.chat.kit.net.OKHttpHelper;
import cn.wildfire.chat.kit.net.SimpleCallback;
import cn.wildfire.chat.kit.net.base.StatusResult;
import cn.wildfirechat.model.ClientInfo;
import cn.wildfirechat.model.Conversation;
import cn.wildfirechat.remote.ChatManager;
import com.highdatas.madeasy.patient.ui.login.model.LoginResult;
import com.highdatas.madeasy.patient.ui.login.model.PCSession;
import com.highdatas.madeasy.patient.ui.main.model.BannerItem;
import okhttp3.MediaType;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.util.*;
public class AppService implements AppServiceProvider, ApiServiceProvider {
private static AppService Instance = new AppService();
/**
* App Server默认使用的是8888端口,替换为自己部署的服务时需要注意端口别填错了
*
*
* 正式商用时,建议用https,确保token安全
*
*
*/
// public static String APP_SERVER_ADDRESS/*请仔细阅读上面的注释*/ = "http://wildfirechat.cn:8888";
public static String APP_SERVER_ADDRESS/*请仔细阅读上面的注释*/ = "http://im.highdatas.com:8888";
// public static String APP_SERVER_ADDRESS/*请仔细阅读上面的注释*/ = "http://192.168.43.30:8888";
public static String API_TEST_SERVER_ADDRESS = "http://api-test.medeasy123.com";
public static String API_SERVER_ADDRESS = "http://api.medeasy123.com";
private AppService() {
}
public static AppService Instance() {
return Instance;
}
@Override
public void getBanner(BaseResultCallBack> callback) {
String url = API_SERVER_ADDRESS + "/content/api/banner/redis/list/1";
HashMap params = new HashMap<>();
params.put("status", "4");
OKHttpHelper.get(url, params, callback);
}
@Override
public void clientInfoById(String clientId, BaseResultCallBack callBack) {
String url = API_SERVER_ADDRESS + "/client/api/getById";
HashMap params = new HashMap<>();
params.put("id", clientId);
OKHttpHelper.post(url, params, callBack);
}
public interface LoginCallback {
void onUiSuccess(LoginResult loginResult);
void onUiFailure(int code, String msg);
}
@Deprecated //"已经废弃,请使用smsLogin"
public void namePwdLogin(String account, String password, LoginCallback callback) {
String url = APP_SERVER_ADDRESS + "/api/login";
Map params = new HashMap<>();
params.put("name", account);
params.put("password", password);
try {
params.put("clientId", ChatManagerHolder.gChatManager.getClientId());
} catch (Exception e) {
e.printStackTrace();
callback.onUiFailure(-1, "网络出来问题了。。。");
return;
}
OKHttpHelper.post(url, params, new SimpleCallback() {
@Override
public void onUiSuccess(LoginResult loginResult) {
callback.onUiSuccess(loginResult);
}
@Override
public void onUiFailure(int code, String msg) {
callback.onUiFailure(code, msg);
}
});
}
public void smsLogin(String phoneNumber, String authCode, LoginCallback callback) {
String url = APP_SERVER_ADDRESS + "/login";
Map params = new HashMap<>();
params.put("mobile", phoneNumber);
params.put("code", authCode);
//Platform_iOS = 1,
//Platform_Android = 2,
//Platform_Windows = 3,
//Platform_OSX = 4,
//Platform_WEB = 5,
//Platform_WX = 6,
params.put("platform", new Integer(2));
try {
params.put("clientId", ChatManagerHolder.gChatManager.getClientId());
} catch (Exception e) {
e.printStackTrace();
callback.onUiFailure(-1, "网络出来问题了。。。");
return;
}
OKHttpHelper.post(url, params, new SimpleCallback() {
@Override
public void onUiSuccess(LoginResult loginResult) {
callback.onUiSuccess(loginResult);
}
@Override
public void onUiFailure(int code, String msg) {
callback.onUiFailure(code, msg);
}
});
}
public interface SendCodeCallback {
void onUiSuccess();
void onUiFailure(int code, String msg);
}
public void requestAuthCode(String phoneNumber, SendCodeCallback callback) {
String url = APP_SERVER_ADDRESS + "/send_code";
Map params = new HashMap<>();
params.put("mobile", phoneNumber);
OKHttpHelper.post(url, params, new SimpleCallback() {
@Override
public void onUiSuccess(StatusResult statusResult) {
if (statusResult.getCode() == 0) {
callback.onUiSuccess();
} else {
callback.onUiFailure(statusResult.getCode(), "");
}
}
@Override
public void onUiFailure(int code, String msg) {
callback.onUiFailure(-1, msg);
}
});
}
public interface ScanPCCallback {
void onUiSuccess(PCSession pcSession);
void onUiFailure(int code, String msg);
}
public void scanPCLogin(String token, ScanPCCallback callback) {
String url = APP_SERVER_ADDRESS + "/scan_pc";
url += "/" + token;
OKHttpHelper.post(url, null, new SimpleCallback() {
@Override
public void onUiSuccess(PCSession pcSession) {
if (pcSession.getStatus() == 1) {
callback.onUiSuccess(pcSession);
} else {
callback.onUiFailure(pcSession.getStatus(), "");
}
}
@Override
public void onUiFailure(int code, String msg) {
callback.onUiFailure(-1, msg);
}
});
}
public interface PCLoginCallback {
void onUiSuccess();
void onUiFailure(int code, String msg);
}
public void confirmPCLogin(String token, String userId, PCLoginCallback callback) {
String url = APP_SERVER_ADDRESS + "/confirm_pc";
Map params = new HashMap<>(3);
params.put("user_id", userId);
params.put("token", token);
params.put("quick_login", 1);
OKHttpHelper.post(url, params, new SimpleCallback() {
@Override
public void onUiSuccess(PCSession pcSession) {
if (pcSession.getStatus() == 2) {
callback.onUiSuccess();
} else {
callback.onUiFailure(pcSession.getStatus(), "");
}
}
@Override
public void onUiFailure(int code, String msg) {
callback.onUiFailure(-1, msg);
}
});
}
public void cancelPCLogin(String token, PCLoginCallback callback) {
String url = APP_SERVER_ADDRESS + "/cancel_pc";
Map params = new HashMap<>(3);
params.put("token", token);
OKHttpHelper.post(url, params, new SimpleCallback() {
@Override
public void onUiSuccess(PCSession pcSession) {
if (pcSession.getStatus() == 2) {
callback.onUiSuccess();
} else {
callback.onUiFailure(pcSession.getStatus(), "");
}
}
@Override
public void onUiFailure(int code, String msg) {
callback.onUiFailure(-1, msg);
}
});
}
@Override
public void getGroupAnnouncement(String groupId, AppServiceProvider.GetGroupAnnouncementCallback callback) {
//从SP中获取到历史数据callback回去,然后再从网络刷新
String url = APP_SERVER_ADDRESS + "/get_group_announcement";
Map params = new HashMap<>(2);
params.put("groupId", groupId);
OKHttpHelper.post(url, params, new SimpleCallback() {
@Override
public void onUiSuccess(GroupAnnouncement announcement) {
callback.onUiSuccess(announcement);
}
@Override
public void onUiFailure(int code, String msg) {
callback.onUiFailure(-1, msg);
}
});
}
@Override
public void updateGroupAnnouncement(String groupId, String announcement, AppServiceProvider.UpdateGroupAnnouncementCallback callback) {
//更新到应用服务,再保存到本地SP中
String url = APP_SERVER_ADDRESS + "/put_group_announcement";
Map params = new HashMap<>(2);
params.put("groupId", groupId);
params.put("author", ChatManagerHolder.gChatManager.getUserId());
params.put("text", announcement);
OKHttpHelper.post(url, params, new SimpleCallback() {
@Override
public void onUiSuccess(GroupAnnouncement announcement) {
callback.onUiSuccess(announcement);
}
@Override
public void onUiFailure(int code, String msg) {
callback.onUiFailure(-1, msg);
}
});
}
@Override
public void showPCLoginActivity(String userId, String token, int platform) {
Intent intent = new Intent(BuildConfig.APPLICATION_ID + ".pc.login");
intent.putExtra("token", token);
intent.putExtra("isConfirmPcLogin", true);
intent.putExtra("platform", platform);
WfcUIKit.startActivity(ChatManager.Instance().getApplicationContext(), intent);
}
@Override
public void uploadLog(SimpleCallback callback) {
List filePaths = ChatManager.Instance().getLogFilesPath();
if (filePaths == null || filePaths.isEmpty()) {
if (callback != null) {
callback.onUiFailure(-1, "没有日志文件");
}
return;
}
Context context = ChatManager.Instance().getApplicationContext();
if (context == null) {
if (callback != null) {
callback.onUiFailure(-1, "not init");
}
return;
}
SharedPreferences sp = context.getSharedPreferences("log_history", Context.MODE_PRIVATE);
String userId = ChatManager.Instance().getUserId();
String url = APP_SERVER_ADDRESS + "/logs/" + userId + "/upload";
int toUploadCount = 0;
Collections.sort(filePaths);
for (int i = 0; i < filePaths.size(); i++) {
String path = filePaths.get(i);
File file = new File(path);
if (!file.exists()) {
continue;
}
// 重复上传最后一个日志文件,因为上传之后,还会追加内容
if (!sp.contains(path) || i == filePaths.size() - 1) {
toUploadCount++;
OKHttpHelper.upload(url, null, file, MediaType.get("application/octet-stream"), new SimpleCallback() {
@Override
public void onUiSuccess(Void aVoid) {
if (callback != null) {
callback.onSuccess(url);
}
sp.edit().putBoolean(path, true).commit();
}
@Override
public void onUiFailure(int code, String msg) {
if (callback != null) {
callback.onUiFailure(code, msg);
}
}
});
}
}
if (toUploadCount == 0) {
if (callback != null) {
callback.onUiFailure(-1, "所有日志都已上传");
}
}
}
@Override
public void changeName(String newName, SimpleCallback callback) {
String url = APP_SERVER_ADDRESS + "/change_name";
Map params = new HashMap<>(2);
params.put("newName", newName);
OKHttpHelper.post(url, params, new SimpleCallback() {
@Override
public void onUiSuccess(Void aVoid) {
callback.onUiSuccess(null);
}
@Override
public void onUiFailure(int code, String msg) {
callback.onUiFailure(-1, msg);
}
});
}
@Override
public void getFavoriteItems(int startId, int count, GetFavoriteItemCallback callback) {
if (callback == null) {
return;
}
String url = APP_SERVER_ADDRESS + "/fav/list";
Map params = new HashMap<>();
params.put("id", startId);
params.put("count", count);
OKHttpHelper.post(url, params, new SimpleCallback() {
@Override
public void onUiSuccess(String s) {
try {
JSONObject obj = new JSONObject(s);
JSONObject result = obj.getJSONObject("result");
boolean hasMore = result.getBoolean("hasMore");
JSONArray items = result.getJSONArray("items");
List favoriteItems = new ArrayList<>();
for (int i = 0; i < items.length(); i++) {
JSONObject itemObj = items.getJSONObject(i);
Conversation conversation = new Conversation(Conversation.ConversationType.type(itemObj.getInt("convType")), itemObj.getString("convTarget"), itemObj.getInt("convLine"));
FavoriteItem item = new FavoriteItem(itemObj.getInt("id"),
itemObj.getInt("type"),
itemObj.getLong("timestamp"),
conversation,
itemObj.getString("origin"),
itemObj.getString("sender"),
itemObj.getString("title"),
itemObj.getString("url"),
itemObj.getString("thumbUrl"),
itemObj.getString("data")
);
favoriteItems.add(item);
}
callback.onUiSuccess(favoriteItems, hasMore);
} catch (JSONException e) {
e.printStackTrace();
callback.onUiFailure(-1, e.getMessage());
}
}
@Override
public void onUiFailure(int code, String msg) {
callback.onUiFailure(code, msg);
}
});
}
@Override
public void addFavoriteItem(FavoriteItem item, SimpleCallback callback) {
String url = APP_SERVER_ADDRESS + "/fav/add";
Map params = new HashMap<>();
params.put("type", item.getFavType());
params.put("convType", item.getConversation().type.getValue());
params.put("convTarget", item.getConversation().target);
params.put("convLine", item.getConversation().line);
params.put("origin", item.getOrigin());
params.put("sender", item.getSender());
params.put("title", item.getTitle());
params.put("url", item.getUrl());
params.put("thumbUrl", item.getThumbUrl());
params.put("data", item.getData());
OKHttpHelper.post(url, params, callback);
}
@Override
public void removeFavoriteItem(int favId, SimpleCallback callback) {
String url = APP_SERVER_ADDRESS + "/fav/del/" + favId;
OKHttpHelper.post(url, null, callback);
}
public static void validateConfig(Context context) {
if (TextUtils.isEmpty(Config.IM_SERVER_HOST)
|| Config.IM_SERVER_HOST.startsWith("http")
|| Config.IM_SERVER_HOST.contains(":")
|| TextUtils.isEmpty(APP_SERVER_ADDRESS)
|| (!APP_SERVER_ADDRESS.startsWith("http") && !APP_SERVER_ADDRESS.startsWith("https"))
|| Config.IM_SERVER_HOST.equals("127.0.0.1")
|| APP_SERVER_ADDRESS.contains("127.0.0.1")
|| (!Config.IM_SERVER_HOST.contains("wildfirechat.cn") && APP_SERVER_ADDRESS.contains("wildfirechat.cn"))
|| (Config.IM_SERVER_HOST.contains("wildfirechat.cn") && !APP_SERVER_ADDRESS.contains("wildfirechat.cn"))
) {
Toast.makeText(context, "配置错误,请检查配置,应用即将关闭...", Toast.LENGTH_LONG).show();
new Handler().postDelayed(() -> {
throw new IllegalArgumentException("config error\n 参数配置错误\n请仔细阅读配置相关注释,并检查配置!\n");
}, 5 * 1000);
}
for (String[] ice : Config.ICE_SERVERS) {
if (!ice[0].startsWith("turn")) {
Toast.makeText(context, "Turn配置错误,请检查配置,应用即将关闭...", Toast.LENGTH_LONG).show();
new Handler().postDelayed(() -> {
throw new IllegalArgumentException("config error\n 参数配置错误\n请仔细阅读配置相关注释,并检查配置!\n");
}, 5 * 1000);
}
}
}
}