weizhengliang 3 лет назад
Родитель
Сommit
9f031d4f99
21 измененных файлов с 823 добавлено и 66 удалено
  1. 4 0
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/ContactUpdateActivity.kt
  2. 4 0
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchEventDetailActivity.kt
  3. 40 6
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchHome2Activity.kt
  4. 56 0
      home/src/main/code/com/wdkl/ncs/android/component/home/adapter/NumAdapter.java
  5. 0 2
      home/src/main/code/com/wdkl/ncs/android/component/home/service/PhoneStateReceiver.java
  6. 2 2
      home/src/main/code/com/wdkl/ncs/android/component/home/ui/CallSingleActivity.java
  7. 159 0
      home/src/main/code/com/wdkl/ncs/android/component/home/util/ServerConfigDialogHelper.java
  8. 17 0
      home/src/main/res/layout/digital_item.xml
  9. 188 0
      home/src/main/res/layout/server_config_dialog_lay.xml
  10. 13 0
      home/src/main/res/layout/watch_activity_register.xml
  11. 22 22
      janus/src/main/java/com/wdkl/rtc/rtc/WebRTCEngine.java
  12. 0 15
      janus/src/main/java/com/wdkl/rtc/util/Constant.java
  13. 16 0
      janus/src/main/java/com/wdkl/rtc/util/JanusConstant.java
  14. 12 7
      middleware/src/main/code/com/wdkl/ncs/android/middleware/api/UrlManager.kt
  15. 4 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/api/WatchDeviceInfoAndTCPMailingAddressApi.kt
  16. 5 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/home/WatchHomeActivityContract.kt
  17. 17 4
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/home/WatchHomeActivityPresenter.kt
  18. 178 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/model/ServerIpInfo.java
  19. 15 8
      middleware/src/main/code/com/wdkl/ncs/android/middleware/server/ServerInfoUtil.java
  20. 70 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/utils/CommonUtils.java
  21. 1 0
      resource/src/main/res/values/colors.xml

+ 4 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/activity/ContactUpdateActivity.kt

@@ -14,6 +14,7 @@ import com.wdkl.ncs.android.lib.vo.MessageEvent
 import com.wdkl.ncs.android.middleware.common.Constants
 import com.wdkl.ncs.android.middleware.logic.contract.home.WatchHomeActivityContract
 import com.wdkl.ncs.android.middleware.logic.presenter.home.WatchHomeActivityPresenter
+import com.wdkl.ncs.android.middleware.model.ServerIpInfo
 import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
 import com.wdkl.ncs.android.middleware.model.dos.ChannelDO
 import com.wdkl.ncs.android.middleware.model.dos.PartSettingDO
@@ -83,6 +84,9 @@ class ContactUpdateActivity: BaseActivity<WatchHomeActivityPresenter, ActivityCo
     override fun setTcpServerHost(tcpSeverDTO: TcpSeverDTO) {
     }
 
+    override fun setServerInfo(serverIpInfo: ServerIpInfo) {
+    }
+
     override fun setDeviceSettingData(partSettingDO: PartSettingDO) {
     }
 

+ 4 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchEventDetailActivity.kt

@@ -29,6 +29,7 @@ import com.wdkl.ncs.android.lib.vo.MessageEvent
 import com.wdkl.ncs.android.middleware.api.ApiManager
 import com.wdkl.ncs.android.middleware.logic.contract.home.WatchHomeActivityContract
 import com.wdkl.ncs.android.middleware.logic.presenter.home.WatchHomeActivityPresenter
+import com.wdkl.ncs.android.middleware.model.ServerIpInfo
 import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
 import com.wdkl.ncs.android.middleware.model.dos.ChannelDO
 import com.wdkl.ncs.android.middleware.model.dos.PartSettingDO
@@ -285,6 +286,9 @@ class WatchEventDetailActivity : BaseActivity<WatchHomeActivityPresenter, WatchA
     override fun setTcpServerHost(tcpSeverDTO: TcpSeverDTO) {
     }
 
+    override fun setServerInfo(serverIpInfo: ServerIpInfo) {
+    }
+
     override fun setDeviceVoiceChannel(channelList: ArrayList<ChannelDO>) {
     }
 

+ 40 - 6
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchHome2Activity.kt

@@ -39,6 +39,7 @@ import com.wdkl.ncs.android.lib.vo.MessageEvent
 import com.wdkl.ncs.android.middleware.common.Constants
 import com.wdkl.ncs.android.middleware.logic.contract.home.WatchHomeActivityContract
 import com.wdkl.ncs.android.middleware.logic.presenter.home.WatchHomeActivityPresenter
+import com.wdkl.ncs.android.middleware.model.ServerIpInfo
 import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
 import com.wdkl.ncs.android.middleware.model.dos.ChannelDO
 import com.wdkl.ncs.android.middleware.model.dos.PartSettingDO
@@ -49,9 +50,11 @@ import com.wdkl.ncs.android.middleware.model.vo.WatchContactVO
 import com.wdkl.ncs.android.middleware.tcp.NettyClient
 import com.wdkl.ncs.android.middleware.tcp.TcpClientHandler
 import com.wdkl.ncs.android.middleware.tcp.enums.CommunicationEnum
+import com.wdkl.ncs.android.middleware.utils.CommonUtils
 import com.wdkl.ncs.android.middleware.utils.ContactHelper
 import com.wdkl.ncs.keepbackground.utils.SpManager
 import com.wdkl.ncs.keepbackground.work.DaemonEnv
+import com.wdkl.rtc.util.JanusConstant
 import io.reactivex.Observable
 import kotlinx.android.synthetic.main.watch_activity_home2.*
 import kotlinx.android.synthetic.main.watch_activity_register.*
@@ -179,6 +182,8 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         if (SettingConfig.getVoiceCallType(BaseApplication.appContext) == SettingConfig.PHONE_CALL) {
             Constants.phoneType = CommunicationEnum.MOBILE_PHONE.value()
         }
+
+        tv_server_ip.text = CommonUtils.getUrl(BaseApplication.appContext)
     }
 
     private fun regReceiver() {
@@ -222,7 +227,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
      * 返回的tcp信息
      */
     override fun setTcpServerHost(tcpSeverDTO: TcpSeverDTO) {
-        Log.d(TAG, "获取服务器IP完成")
+        /*Log.d(TAG, "获取服务器IP完成")
         if (tcpSeverDTO.publicIp != null && tcpSeverDTO.tcpPort != null && tcpSeverDTO.readerIdleTime != null) {
             Constants.tcpServer = tcpSeverDTO.publicIp
             Constants.tcpPort = tcpSeverDTO.tcpPort
@@ -238,6 +243,29 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
             }
 
             presenter.getDeviceVO(Constants.imei)
+        }*/
+    }
+
+    override fun setServerInfo(serverIpInfo: ServerIpInfo) {
+        if (serverIpInfo.tcpPublicIp != null && serverIpInfo.tcpPort != null && serverIpInfo.tcpIdleSeconds != null) {
+            Constants.tcpServer = serverIpInfo.tcpPublicIp
+            Constants.tcpPort = serverIpInfo.tcpPort
+            Constants.heartBeat = serverIpInfo.tcpIdleSeconds
+            tv_server_ip.text = serverIpInfo.tcpPublicIp
+
+            JanusConstant.JANUS_URL = "ws://" + serverIpInfo.rtcPublicIp + ":" + serverIpInfo.rtcPort
+            JanusConstant.STUN_SERVER = arrayOf<String>(serverIpInfo.stunServer)
+            //JanusConstant.TURN_SERVER = data.turnServer
+
+            //成功获取到数据后再启动keepService并连接tcp服务器
+            if (DaemonEnv.app == null && !Strings.isNullOrEmpty(Constants.tcpServer) && !WdKeepAliveService.instanceCreated) {
+                Log.d(TAG, "开始 WdKeepAliveService")
+                //保活守护进程
+                DaemonEnv.init(this)
+                DaemonEnv.startServiceSafely(this, WdKeepAliveService::class.java)
+            }
+
+            presenter.getDeviceVO(Constants.imei)
         }
     }
 
@@ -426,8 +454,8 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
     }
 
     //写手机通讯录
-    override fun setContact(contactVOs: List<WatchContactVO>) {
-        if (contactVOs != null && contactVOs.size > 0) {
+    override fun setContact(contactsVOs: List<WatchContactVO>) {
+        if (contactsVOs != null && contactsVOs.size > 0) {
             if (!contactUpdating) {
                 contactUpdating = true
                 Thread {
@@ -438,7 +466,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
                                 ContactHelper.setContact(BaseApplication.appContext, contactVO.name, contactVO.phoneNumber)
                             }
                         }*/
-                        ContactHelper.setContact2(BaseApplication.appContext, contactVOs)
+                        ContactHelper.setContact2(BaseApplication.appContext, contactsVOs)
                         Log.e(TAG, "111 update contacts end...")
                         contactUpdating = false
                     } catch (ex: Exception) {
@@ -544,6 +572,10 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         tv_restart_app.setOnClickListener {
             AppUtils.restartApp()
         }
+
+        tv_config_server.setOnClickListener {
+            ServerConfigDialogHelper.showPasswordDialog(activity)
+        }
     }
 
     override fun enableHeadsetVoiceMsg(): Boolean {
@@ -552,7 +584,8 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
 
     fun initTcp() {
         if (!Strings.isNullOrEmpty(Constants.tcpServer)) {    //有网且得到了服务器IP
-            presenter.getTcpServerHost()
+            //presenter.getTcpServerHost()
+            presenter.getServerInfo()
             return
         }
 
@@ -561,7 +594,8 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
             while (isUnRegister && count > 0 && Strings.isNullOrEmpty(Constants.tcpServer)) {
                 //DaemonEnv.sendStopWorkBroadcast(this)
                 Log.i(TAG, "获取TCP服务器IP和端口")
-                presenter.getTcpServerHost()
+                //presenter.getTcpServerHost()
+                presenter.getServerInfo()
 
                 try {
                     Thread.sleep(10000)

+ 56 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/adapter/NumAdapter.java

@@ -0,0 +1,56 @@
+package com.wdkl.ncs.android.component.home.adapter;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.TextView;
+
+import com.wdkl.ncs.android.component.home.R;
+
+public class NumAdapter extends BaseAdapter {
+    private String[] num;
+    private Context context;
+
+    public NumAdapter(String[] numbers, Context context) {
+        this.num = numbers;
+        this.context = context;
+    }
+
+
+    @Override
+    public int getCount() {
+        return num.length;
+    }
+
+    @Override
+    public Object getItem(int position) {
+        return num[position];
+    }
+
+    @Override
+    public long getItemId(int position) {
+        return position;
+    }
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        ViewHolder viewHolder;
+        if (convertView == null) {
+            convertView = LayoutInflater.from(context).inflate(R.layout.digital_item, null);
+            viewHolder = new ViewHolder();
+            viewHolder.numTv = convertView.findViewById(R.id.tv_number);
+            convertView.setTag(viewHolder);
+        } else {
+            viewHolder = (ViewHolder) convertView.getTag();
+        }
+        viewHolder.numTv.setText(num[position]);
+
+        return convertView;
+    }
+
+    static class ViewHolder {
+        TextView numTv;
+    }
+}

+ 0 - 2
home/src/main/code/com/wdkl/ncs/android/component/home/service/PhoneStateReceiver.java

@@ -7,7 +7,6 @@ import android.telephony.TelephonyManager;
 import android.util.Log;
 
 import com.wdkl.ncs.android.component.home.util.HandleTcpConnect;
-import com.wdkl.ncs.android.component.home.util.MediaPlayHelper;
 import com.wdkl.ncs.android.component.home.util.PhoneCallUtil;
 import com.wdkl.ncs.android.component.home.util.RecordHelper;
 import com.wdkl.ncs.android.lib.vo.MessageEvent;
@@ -16,7 +15,6 @@ import com.wdkl.ncs.android.middleware.tcp.NettyClient;
 import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel;
 import com.wdkl.ncs.android.middleware.tcp.channel.PhoneUtil;
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel;
-import com.wdkl.rtc.util.Constant;
 
 import org.greenrobot.eventbus.EventBus;
 

+ 2 - 2
home/src/main/code/com/wdkl/ncs/android/component/home/ui/CallSingleActivity.java

@@ -45,7 +45,7 @@ import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel;
 import com.wdkl.ncs.android.middleware.tcp.enums.DeviceTypeEnum;
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction;
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpType;
-import com.wdkl.rtc.util.Constant;
+import com.wdkl.rtc.util.JanusConstant;
 import com.wdkl.rtc.entity.Room;
 import com.wdkl.rtc.janus.JanusClient;
 import com.wdkl.rtc.janus.VideoRoomCallback;
@@ -240,7 +240,7 @@ public class CallSingleActivity extends AppCompatActivity {
 
         //================ 信令
         //初始化 janusClient
-        janusClient = new JanusClient(Constant.JANUS_URL, localUserId);
+        janusClient = new JanusClient(JanusConstant.JANUS_URL, localUserId);
 
         //================ 信令
         videoRoomCallback = new VideoRoomCallback(janusClient,room, localUserId, isOutgoing, iLogUpload);

+ 159 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/util/ServerConfigDialogHelper.java

@@ -0,0 +1,159 @@
+package com.wdkl.ncs.android.component.home.util;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.AdapterView;
+import android.widget.EditText;
+import android.widget.GridView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.wdkl.ncs.android.component.home.R;
+import com.wdkl.ncs.android.component.home.adapter.NumAdapter;
+import com.wdkl.ncs.android.lib.base.BaseApplication;
+import com.wdkl.ncs.android.lib.utils.ExtendMethodsKt;
+import com.wdkl.ncs.android.middleware.utils.CommonUtils;
+
+
+public class ServerConfigDialogHelper {
+
+    private static AlertDialog callDialog;
+    private static String pwd = "";
+
+    public static void showPasswordDialog(final Activity activity) {
+        View contentView = LayoutInflater.from(activity).inflate(R.layout.server_config_dialog_lay, null);
+        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+        builder.setView(contentView);
+
+        final String[] numbers = {"1","2","3","4","5","6","7","8","9"};
+        final TextView password = contentView.findViewById(R.id.tv_psw_view);
+        final LinearLayout llPwd = contentView.findViewById(R.id.ll_password);
+        final LinearLayout llServer = contentView.findViewById(R.id.ll_server_config);
+        GridView gridView = contentView.findViewById(R.id.grid_psw);
+        NumAdapter adapter = new NumAdapter(numbers, activity);
+        gridView.setAdapter(adapter);
+        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                if (pwd.length() <= 2) {
+                    pwd = pwd + numbers[position];
+                    password.setText(pwd);
+                }
+                Log.d("serverIp", "input password len: " + pwd.length() + "--" + pwd);
+            }
+        });
+
+        TextView delete = contentView.findViewById(R.id.btn_delete);
+        TextView cancel = contentView.findViewById(R.id.btn_cancel);
+        TextView confirm = contentView.findViewById(R.id.btn_confirm);
+        delete.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Log.d("serverIp", "delete password len: " + pwd.length() + "--" + pwd);
+                if (pwd.length() > 1) {
+                    pwd = pwd.substring(0, pwd.length()-1);
+                    password.setText(pwd);
+                } else {
+                    pwd = "";
+                    password.setText(pwd);
+                    password.setHint("请输入密码");
+                }
+            }
+        });
+
+        cancel.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                dismissCallDialog();
+            }
+        });
+
+        confirm.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if ("666".equals(pwd)) {
+                    llPwd.setVisibility(View.GONE);
+                    llServer.setVisibility(View.VISIBLE);
+                } else {
+                    Toast.makeText(activity, "密码错误", Toast.LENGTH_SHORT).show();
+                }
+            }
+        });
+
+        final EditText editUrl = contentView.findViewById(R.id.edit_url);
+        final EditText editPort = contentView.findViewById(R.id.edit_port);
+        final EditText editSipUrl = contentView.findViewById(R.id.edit_sip_url);
+        final EditText editSipPort = contentView.findViewById(R.id.edit_sip_port);
+        TextView saveConfig = contentView.findViewById(R.id.btn_save_config);
+        TextView cancelConfig = contentView.findViewById(R.id.btn_cancel_config);
+        editUrl.setText(CommonUtils.getUrl(BaseApplication.appContext));
+        editPort.setText(CommonUtils.getUrlPort(BaseApplication.appContext));
+        //editSipUrl.setText(CommonUtils.getSipUrl(BaseApplication.appContext));
+        //editSipPort.setText(CommonUtils.getSipPort(BaseApplication.appContext));
+        saveConfig.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                String url = editUrl.getText().toString();
+                String port = editPort.getText().toString();
+                if (TextUtils.isEmpty(url) || TextUtils.isEmpty(port)) {
+                    ExtendMethodsKt.showMessage("参数不能为空");
+                } else {
+                    //保存配置
+                    CommonUtils.setUrl(BaseApplication.appContext, url);
+                    CommonUtils.setUrlPort(BaseApplication.appContext, port);
+                    //CommonUtils.setSipUrl(BaseApplication.appContext, editSipUrl.getText().toString());
+                    //CommonUtils.setSipPort(BaseApplication.appContext, editSipPort.getText().toString());
+                    dismissCallDialog();
+                }
+            }
+        });
+        cancelConfig.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                dismissCallDialog();
+            }
+        });
+
+
+        callDialog = builder.create();
+        //callDialog.setCanceledOnTouchOutside(false);
+        //callDialog.setCancelable(false);
+        callDialog.show();
+
+        //设置dialog宽高及位置
+        try {
+            Window window = callDialog.getWindow();
+            window.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
+            WindowManager.LayoutParams lp = window.getAttributes();
+            lp.width = 480;
+            lp.height = 720;
+            lp.gravity = Gravity.CENTER;
+            window.setAttributes(lp);
+
+            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
+                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
+                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+                    | View.SYSTEM_UI_FLAG_FULLSCREEN);
+            window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void dismissCallDialog() {
+        pwd = "";
+        if (callDialog != null && callDialog.isShowing()) {
+            callDialog.dismiss();
+        }
+    }
+}

+ 17 - 0
home/src/main/res/layout/digital_item.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <TextView
+        android:id="@+id/tv_number"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/color_gray"
+        android:layout_margin="4dp"
+        android:padding="4dp"
+        android:gravity="center"
+        android:textSize="16sp"
+        android:textColor="@color/main_color"/>
+
+</LinearLayout>

+ 188 - 0
home/src/main/res/layout/server_config_dialog_lay.xml

@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <!--密码框-->
+    <LinearLayout
+        android:id="@+id/ll_password"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/tv_psw_view"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:textSize="16sp"
+            android:hint="请输入密码"
+            android:textColor="@color/main_color"/>
+
+        <GridView
+            android:id="@+id/grid_psw"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:verticalSpacing="5dp"
+            android:horizontalSpacing="5dp"
+            android:numColumns="3"/>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="20dp"
+            android:orientation="horizontal">
+            <TextView
+                android:id="@+id/btn_delete"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:padding="4dp"
+                android:gravity="center_horizontal"
+                android:text="删除"
+                android:textSize="16sp"
+                android:textColor="@color/main_color"/>
+
+            <TextView
+                android:id="@+id/btn_cancel"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:padding="4dp"
+                android:gravity="center_horizontal"
+                android:text="取消"
+                android:textSize="16sp"
+                android:textColor="@color/main_color"/>
+            <TextView
+                android:id="@+id/btn_confirm"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:padding="4dp"
+                android:gravity="center_horizontal"
+                android:text="确定"
+                android:textSize="16sp"
+                android:textColor="@color/main_color"/>
+        </LinearLayout>
+    </LinearLayout>
+
+
+    <!--服务器ip配置-->
+    <LinearLayout
+        android:id="@+id/ll_server_config"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginTop="20dp"
+        android:orientation="vertical"
+        android:visibility="gone">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:gravity="center"
+                android:text="Server IP:"
+                android:textSize="12sp"
+                android:textColor="@color/main_color"/>
+
+            <EditText
+                android:id="@+id/edit_url"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:inputType="textUri"
+                android:textSize="12sp"/>
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:gravity="center"
+                android:text="Port:"
+                android:textSize="12sp"
+                android:textColor="@color/main_color"/>
+
+            <EditText
+                android:id="@+id/edit_port"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:inputType="number"
+                android:textSize="12sp"/>
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:visibility="gone">
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:gravity="center"
+                android:text="Sip IP:"
+                android:textSize="12sp"
+                android:textColor="@color/main_color"/>
+
+            <EditText
+                android:id="@+id/edit_sip_url"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:inputType="textUri"
+                android:textSize="12sp"/>
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:visibility="gone">
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:gravity="center"
+                android:text="Sip port:"
+                android:textSize="12sp"
+                android:textColor="@color/main_color"/>
+
+            <EditText
+                android:id="@+id/edit_sip_port"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:inputType="number"
+                android:textSize="12sp" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="20dp">
+            <TextView
+                android:id="@+id/btn_cancel_config"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:gravity="center"
+                android:text="取消"
+                android:textSize="16sp"
+                android:textColor="@color/black"/>
+
+            <TextView
+                android:id="@+id/btn_save_config"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:gravity="center"
+                android:text="保存"
+                android:textSize="16sp"
+                android:textColor="@color/black" />
+        </LinearLayout>
+    </LinearLayout>
+</RelativeLayout>

+ 13 - 0
home/src/main/res/layout/watch_activity_register.xml

@@ -91,6 +91,19 @@
                 android:gravity="center"
                 android:text="重启app"
                 android:textSize="18sp" />
+
+            <TextView
+                android:id="@+id/tv_config_server"
+                android:layout_width="match_parent"
+                android:layout_height="40dp"
+                android:layout_marginLeft="30dp"
+                android:layout_marginTop="20dp"
+                android:layout_marginRight="30dp"
+                android:layout_marginBottom="20dp"
+                android:background="#ffffff"
+                android:gravity="center"
+                android:text="配置服务器"
+                android:textSize="18sp" />
         </LinearLayout>
     </ScrollView>
 </LinearLayout>

+ 22 - 22
janus/src/main/java/com/wdkl/rtc/rtc/WebRTCEngine.java

@@ -15,19 +15,17 @@ import android.util.Log;
 import android.view.View;
 
 import com.wdkl.rtc.rtc.observer.CreatePeerConnectionCallback;
-import com.wdkl.rtc.util.Constant;
+import com.wdkl.rtc.util.JanusConstant;
 import com.wdkl.rtc.render.ProxyVideoSink;
 
 import org.webrtc.AudioSource;
 import org.webrtc.AudioTrack;
 import org.webrtc.Camera1Enumerator;
-import org.webrtc.Camera2Enumerator;
 import org.webrtc.CameraEnumerator;
 import org.webrtc.CameraVideoCapturer;
 import org.webrtc.DefaultVideoDecoderFactory;
 import org.webrtc.DefaultVideoEncoderFactory;
 import org.webrtc.EglBase;
-import org.webrtc.IceCandidate;
 import org.webrtc.MediaConstraints;
 import org.webrtc.MediaStream;
 import org.webrtc.PeerConnection;
@@ -113,27 +111,29 @@ public class WebRTCEngine {
     }
 
     private void initIceServer(){
-        PeerConnection.IceServer iceServer = null;
-        for(String stunServer: Constant.STUN_SERVER) {
-            if (stunServer.contains("|"))
-            {
-                String[] stunParams = stunServer.split("|");
-                iceServer = PeerConnection.IceServer
-                        .builder(stunParams[0])
-                        .setUsername(stunParams[1])
-                        .setPassword(stunParams[2])
-                        .setTlsCertPolicy(PeerConnection.TlsCertPolicy.TLS_CERT_POLICY_INSECURE_NO_CHECK)
-                        .createIceServer();
-            } else {
-                iceServer = PeerConnection.IceServer
-                        .builder(stunServer)
-                        .setTlsCertPolicy(PeerConnection.TlsCertPolicy.TLS_CERT_POLICY_INSECURE_NO_CHECK)
-                        .createIceServer();
+        PeerConnection.IceServer iceServer;
+        if (JanusConstant.STUN_SERVER != null) {
+            for (String stunServer : JanusConstant.STUN_SERVER) {
+                if (stunServer.contains("|")) {
+                    String[] stunParams = stunServer.split("|");
+                    iceServer = PeerConnection.IceServer
+                            .builder(stunParams[0])
+                            .setUsername(stunParams[1])
+                            .setPassword(stunParams[2])
+                            .setTlsCertPolicy(PeerConnection.TlsCertPolicy.TLS_CERT_POLICY_INSECURE_NO_CHECK)
+                            .createIceServer();
+                } else {
+                    iceServer = PeerConnection.IceServer
+                            .builder(stunServer)
+                            .setTlsCertPolicy(PeerConnection.TlsCertPolicy.TLS_CERT_POLICY_INSECURE_NO_CHECK)
+                            .createIceServer();
+                }
+                iceServers.add(iceServer);
             }
-            iceServers.add(iceServer);
         }
-        if (Constant.TURN_SERVER != null){
-            for(String turnServer:Constant.TURN_SERVER){
+
+        if (JanusConstant.TURN_SERVER != null){
+            for(String turnServer: JanusConstant.TURN_SERVER){
                 if (turnServer.contains("|"))
                 {
                     String[] turnParams = turnServer.split("|");

+ 0 - 15
janus/src/main/java/com/wdkl/rtc/util/Constant.java

@@ -1,15 +0,0 @@
-package com.wdkl.rtc.util;
-
-import com.wdkl.ncs.android.middleware.api.UrlManager;
-import com.wdkl.rtc.janus.JanusClient;
-
-import java.math.BigInteger;
-import java.util.Random;
-
-public class Constant {
-    public final static String GATEWAY_URL= UrlManager.Companion.build().getGateway();
-    public final static String JANUS_URL = "ws://"+Constant.GATEWAY_URL+":" + UrlManager.Companion.build().getWsPort();
-
-    public final static String[] STUN_SERVER = new String[]{"stun:"+GATEWAY_URL+":3478"};
-    public final static String[] TURN_SERVER = null; //new String[]{"turn:stun.l.google.com:19302|username|password"};
-}

+ 16 - 0
janus/src/main/java/com/wdkl/rtc/util/JanusConstant.java

@@ -0,0 +1,16 @@
+package com.wdkl.rtc.util;
+
+public class JanusConstant {
+    //public final static String GATEWAY_URL= UrlManager.Companion.build().getGateway();
+    //public final static String JANUS_URL = "ws://"+ JanusConstant.GATEWAY_URL+":" + UrlManager.Companion.build().getWsPort();
+
+    //public final static String[] STUN_SERVER = new String[]{"stun:"+GATEWAY_URL+":3478"};
+    //public final static String[] TURN_SERVER = null; //new String[]{"turn:stun.l.google.com:19302|username|password"};
+
+
+    public static String JANUS_URL = "ws://120.76.246.253:5089"; //默认的
+    //public static String STUN1 = "stun:" +GATEWAY_URL+ ":3478";
+    public static String[] STUN_SERVER = null; //new String[]{STUN1};
+
+    public static String[] TURN_SERVER = null; //new String[]{"turn:stun.l.google.com:19302|username|password"};
+}

+ 12 - 7
middleware/src/main/code/com/wdkl/ncs/android/middleware/api/UrlManager.kt

@@ -5,6 +5,7 @@ import com.wdkl.ncs.android.lib.utils.Util
 import com.wdkl.ncs.android.middleware.config.WdklNcsConfigCenter
 import com.wdkl.ncs.android.middleware.server.ServerInfoDetail
 import com.wdkl.ncs.android.middleware.server.ServerInfoUtil
+import com.wdkl.ncs.android.middleware.utils.CommonUtils
 
 /**
  * @author LDD
@@ -40,7 +41,7 @@ interface UrlManager {
          * @Note   构架Url控制器
          */
         fun build() : UrlManager{
-            when (WdklNcsConfigCenter.INSTANCE.APP_CHANNEL){
+            /*when (WdklNcsConfigCenter.INSTANCE.APP_CHANNEL){
                 "common"->{
                     return CommonUrlManager()
                 }
@@ -56,8 +57,8 @@ interface UrlManager {
                 "show"->{
                     return ShowUrlManager()
                 }
-            }
-            return DevUrlManager()
+            }*/
+            return CommonUrlManager()
         }
     }
 }
@@ -140,16 +141,20 @@ private class ProUrlManager : UrlManager{
 
 private class CommonUrlManager: UrlManager{
 
-    var serverInfoDetail:ServerInfoDetail = ServerInfoUtil.getDetail(Util.getIMEI(BaseApplication.appContext))
+    //var serverInfoDetail:ServerInfoDetail = ServerInfoUtil.getDetail(Util.getIMEI(BaseApplication.appContext))
+
+    val url: String = CommonUtils.getUrl(BaseApplication.appContext)
+    val httpPort: String = CommonUtils.getUrlPort(BaseApplication.appContext)
+    val rtcPort: String = CommonUtils.getSipPort(BaseApplication.appContext)
 
     override val gateway: String
-        get() = serverInfoDetail.httpPublicIp
+        get() = url
     override val wsPort: Int
-        get() = serverInfoDetail.rtcPort
+        get() = rtcPort.toInt()
     override val base: String
         get() = "http://${gateway}"
     override val device_url: String
-        get() = "http://${gateway}:" + serverInfoDetail.httpPort
+        get() = "http://${gateway}:" + httpPort
     override val basic: String
         get() = "http://${gateway}:7002"
 }

+ 4 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/api/WatchDeviceInfoAndTCPMailingAddressApi.kt

@@ -16,6 +16,10 @@ interface WatchDeviceInfoAndTCPMailingAddressApi {
     @GET("/ncs_url/getHostIP")
     fun getTcpServerHost(): Observable<ResponseBody>
 
+    //获取服务器地址
+    @GET("/ncs_url/server_info")
+    fun getServerInfo(): Observable<ResponseBody>
+
     //获取设备设置数据
     @GET("/watch/getPartSetting/{partId}")
     fun getDeviceSettingData(@Path("partId")partId:Int): Observable<ResponseBody>

+ 5 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/home/WatchHomeActivityContract.kt

@@ -1,6 +1,7 @@
 package com.wdkl.ncs.android.middleware.logic.contract.home
 
 import com.wdkl.ncs.android.lib.base.BaseContract
+import com.wdkl.ncs.android.middleware.model.ServerIpInfo
 import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
 import com.wdkl.ncs.android.middleware.model.dos.ChannelDO
 import com.wdkl.ncs.android.middleware.model.dos.DeviceDO
@@ -18,6 +19,8 @@ interface WatchHomeActivityContract{
         fun setDeviceDo(data : DeviceVO)
         //显示tcp通讯地址
         fun setTcpServerHost(tcpSeverDTO: TcpSeverDTO)
+        //设置服务器配置数据
+        fun setServerInfo(serverIpInfo: ServerIpInfo)
         //设置设备设置数据
         fun setDeviceSettingData(partSettingDO: PartSettingDO)
         //语音频道列表
@@ -34,6 +37,8 @@ interface WatchHomeActivityContract{
         fun getDeviceVO(ethMac:String)
         //获取tcp服务器地址
         fun getTcpServerHost()
+        //获取服务器配置
+        fun getServerInfo()
         //获取设备设置数据
         fun getDeviceSettingData(partId:Int)
         //获取该设备语音频道列表

+ 17 - 4
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/home/WatchHomeActivityPresenter.kt

@@ -17,6 +17,7 @@ import com.wdkl.ncs.android.middleware.api.WatchDeviceInfoAndTCPMailingAddressAp
 import com.wdkl.ncs.android.middleware.api.WatchManageDeviceApi
 import com.wdkl.ncs.android.middleware.di.MiddlewareDaggerComponent
 import com.wdkl.ncs.android.middleware.logic.contract.home.WatchHomeActivityContract
+import com.wdkl.ncs.android.middleware.model.ServerIpInfo
 import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
 import com.wdkl.ncs.android.middleware.model.dos.ChannelDO
 import com.wdkl.ncs.android.middleware.model.dos.PartSettingDO
@@ -56,25 +57,25 @@ class WatchHomeActivityPresenter @Inject constructor(): RxPresenter<WatchHomeAct
             when (result) {
                 is AppVersionDO -> {
                     //版本信息
-                    providerView().complete("")
                     providerView().handleAppVersion(result)
                 }
 
                 is DeviceVO -> {
                     //设备信息
-                    providerView().complete()
                     providerView().setDeviceDo(result)
                 }
 
                 is TcpSeverDTO -> {
                     //tcp服务器地址
-                    providerView().complete("")
                     providerView().setTcpServerHost(result)
                 }
 
+                is ServerIpInfo -> {
+                    providerView().setServerInfo(result)
+                }
+
                 is PartSettingDO -> {
                     //设备设置数据
-                    providerView().complete("")
                     providerView().setDeviceSettingData(result)
                 }
 
@@ -194,6 +195,18 @@ class WatchHomeActivityPresenter @Inject constructor(): RxPresenter<WatchHomeAct
                 .subscribe(observer)
     }
 
+    override fun getServerInfo() {
+        registerDeviceApi.getServerInfo()
+            .map {
+                val gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+                val serverIpInfo = gson.fromJson(it.getJsonString(), ServerIpInfo::class.java)
+
+                return@map serverIpInfo
+            }
+            .compose(ThreadFromUtils.defaultSchedulers())
+            .subscribe(observer)
+    }
+
     override fun getDeviceSettingData(partId: Int) {
         registerDeviceApi.getDeviceSettingData(partId)
             .map {

+ 178 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/model/ServerIpInfo.java

@@ -0,0 +1,178 @@
+package com.wdkl.ncs.android.middleware.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.PropertyNamingStrategy;
+import com.fasterxml.jackson.databind.annotation.JsonNaming;
+
+import java.io.Serializable;
+
+import io.swagger.annotations.ApiModelProperty;
+
+@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
+public class ServerIpInfo implements Serializable {
+    @ApiModelProperty(notes = "局域网TCP服务器IP")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String tcpLocalIp;
+
+    @ApiModelProperty(notes = "互联网TCP服务器IP")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String tcpPublicIp;
+
+    @ApiModelProperty(notes = "TCP端口")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private Integer tcpPort;
+
+    @ApiModelProperty(notes = "TCP体征数据库端口")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private Integer tcpVsPort;
+
+    @ApiModelProperty(notes = "TCP心跳间隔,单位:秒")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private Integer tcpIdleSeconds;
+
+    @ApiModelProperty(notes = "局域网HTTP服务器IP")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String httpLocalIp;
+
+    @ApiModelProperty(notes = "互联网HTTP服务器IP")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String httpPublicIp;
+
+    @ApiModelProperty(notes = "HTTP端口")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private Integer httpPort;
+
+    @ApiModelProperty(notes = "RTC Local IP")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String rtcLocalIp;
+
+    @ApiModelProperty(notes = "RTC Public IP")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String rtcPublicIp;
+
+    @ApiModelProperty(notes = "RTC 端口")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private Integer rtcPort;
+
+    @ApiModelProperty(notes = "stun地址", example = "stun:xxx.xxx.xxx.xxx:3478")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String stunServer;
+
+    @ApiModelProperty(notes = "turn地址", example = "turn:xxx.xxx.xxx.xxx:3478|username|password")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String[] turnServer;
+
+    private Long serverTime;
+
+    public String getTcpLocalIp() {
+        return tcpLocalIp;
+    }
+
+    public void setTcpLocalIp(String tcpLocalIp) {
+        this.tcpLocalIp = tcpLocalIp;
+    }
+
+    public String getTcpPublicIp() {
+        return tcpPublicIp;
+    }
+
+    public void setTcpPublicIp(String tcpPublicIp) {
+        this.tcpPublicIp = tcpPublicIp;
+    }
+
+    public Integer getTcpPort() {
+        return tcpPort;
+    }
+
+    public void setTcpPort(Integer tcpPort) {
+        this.tcpPort = tcpPort;
+    }
+
+    public Integer getTcpVsPort() {
+        return tcpVsPort;
+    }
+
+    public void setTcpVsPort(Integer tcpVsPort) {
+        this.tcpVsPort = tcpVsPort;
+    }
+
+    public Integer getTcpIdleSeconds() {
+        return tcpIdleSeconds;
+    }
+
+    public void setTcpIdleSeconds(Integer tcpIdleSeconds) {
+        this.tcpIdleSeconds = tcpIdleSeconds;
+    }
+
+    public String getHttpLocalIp() {
+        return httpLocalIp;
+    }
+
+    public void setHttpLocalIp(String httpLocalIp) {
+        this.httpLocalIp = httpLocalIp;
+    }
+
+    public String getHttpPublicIp() {
+        return httpPublicIp;
+    }
+
+    public void setHttpPublicIp(String httpPublicIp) {
+        this.httpPublicIp = httpPublicIp;
+    }
+
+    public Integer getHttpPort() {
+        return httpPort;
+    }
+
+    public void setHttpPort(Integer httpPort) {
+        this.httpPort = httpPort;
+    }
+
+    public String getRtcLocalIp() {
+        return rtcLocalIp;
+    }
+
+    public void setRtcLocalIp(String rtcLocalIp) {
+        this.rtcLocalIp = rtcLocalIp;
+    }
+
+    public String getRtcPublicIp() {
+        return rtcPublicIp;
+    }
+
+    public void setRtcPublicIp(String rtcPublicIp) {
+        this.rtcPublicIp = rtcPublicIp;
+    }
+
+    public Integer getRtcPort() {
+        return rtcPort;
+    }
+
+    public void setRtcPort(Integer rtcPort) {
+        this.rtcPort = rtcPort;
+    }
+
+    public String getStunServer() {
+        return stunServer;
+    }
+
+    public void setStunServer(String stunServer) {
+        this.stunServer = stunServer;
+    }
+
+    public String[] getTurnServer() {
+        return turnServer;
+    }
+
+    public void setTurnServer(String[] turnServer) {
+        this.turnServer = turnServer;
+    }
+
+    public Long getServerTime() {
+        return serverTime;
+    }
+
+    public void setServerTime(Long serverTime) {
+        this.serverTime = serverTime;
+    }
+}

+ 15 - 8
middleware/src/main/code/com/wdkl/ncs/android/middleware/server/ServerInfoUtil.java

@@ -39,12 +39,7 @@ public class ServerInfoUtil {
         }
      */
     public static ServerInfo get(String id){
-        //--------------------优先从文件获取
-        JsonResponse jsonResponse = getFromStorageFile();
-        if (jsonResponse != null && jsonResponse.success){
-            JSONObject jsonObject = JSON.parseObject(jsonResponse.data.toString());
-            return new ServerInfo(jsonObject.getString("third_server"), jsonObject.getInteger("third_server_port"));
-        }
+        JsonResponse jsonResponse;
 
         //--------------------HTTP请求全局服务器获取
         OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
@@ -74,14 +69,26 @@ public class ServerInfoUtil {
             JSONObject jsonObject = JSON.parseObject(jsonResponse.data.toString());
             return new ServerInfo(jsonObject.getString("third_server"), jsonObject.getInteger("third_server_port"));
         }
+
+        //--------------------从文件获取
+        jsonResponse = getFromStorageFile();
+        if (jsonResponse != null && jsonResponse.success){
+            JSONObject jsonObject = JSON.parseObject(jsonResponse.data.toString());
+            return new ServerInfo(jsonObject.getString("third_server"), jsonObject.getInteger("third_server_port"));
+        }
+
         return null;
     }
 
     private static JsonResponse getFromStorageFile(){
         String encoding = "UTF-8";
         File file = new File(Environment.getExternalStorageDirectory() + "/server_info.json");
-        Long filelength = file.length();
-        byte[] filecontent = new byte[filelength.intValue()];
+        if (!file.exists()) {
+            return JsonResponse.errorResponse("no file");
+        }
+
+        long filelength = file.length();
+        byte[] filecontent = new byte[(int) filelength];
         try {
             FileInputStream in = new FileInputStream(file);
             in.read(filecontent);

+ 70 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/utils/CommonUtils.java

@@ -0,0 +1,70 @@
+package com.wdkl.ncs.android.middleware.utils;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.text.TextUtils;
+
+public class CommonUtils {
+    private static final String SP_NAME = "SP_URL";
+    private static final String KEY_SP_URL = "KEY_SP_URL";
+    private static final String KEY_SP_URL_PORT = "KEY_SP_URL_PORT";
+    private static final String KEY_SP_SIP_URL = "KEY_SP_SIP_URL";
+    private static final String KEY_SP_SIP_PORT = "KEY_SP_SIP_PORT";
+
+    //默认服务器ip端口
+    private static final String DEFAULT_URL = "172.28.100.100";
+    //private static final String DEFAULT_URL = "8.129.220.143";
+    //private static final String DEFAULT_URL = "119.23.151.229";
+    //private static final String DEFAULT_URL = "47.107.28.109";  //维鼎云服
+    private static final String DEFAULT_URL_PORT = "8006";
+    private static final String DEFAULT_SIP_PORT = "8188";
+
+
+    public static String getUrl(Context context) {
+        if (TextUtils.isEmpty(getSP(context).getString(KEY_SP_URL, DEFAULT_URL))) {
+            return DEFAULT_URL;
+        }
+        return getSP(context).getString(KEY_SP_URL, DEFAULT_URL);
+    }
+
+    public static void setUrl(Context context, String url) {
+        getEditor(context).putString(KEY_SP_URL, url).apply();
+    }
+
+    public static String getUrlPort(Context context) {
+        if (TextUtils.isEmpty(getSP(context).getString(KEY_SP_URL_PORT, DEFAULT_URL_PORT))) {
+            return DEFAULT_URL_PORT;
+        }
+        return getSP(context).getString(KEY_SP_URL_PORT, DEFAULT_URL_PORT);
+    }
+
+    public static void setUrlPort(Context context, String port) {
+        getEditor(context).putString(KEY_SP_URL_PORT, port).apply();
+    }
+
+    public static String getSipUrl(Context context) {
+        return getSP(context).getString(KEY_SP_SIP_URL, DEFAULT_URL);
+    }
+
+    public static void setSipUrl(Context context, String url) {
+        getEditor(context).putString(KEY_SP_SIP_URL, url).apply();
+    }
+
+    public static String getSipPort(Context context) {
+        return getSP(context).getString(KEY_SP_SIP_PORT, DEFAULT_SIP_PORT);
+    }
+
+    public static void setSipPort(Context context, String port) {
+        getEditor(context).putString(KEY_SP_SIP_PORT, port).apply();
+    }
+
+
+
+    private static SharedPreferences getSP(Context context) {
+        return context.getSharedPreferences(SP_NAME, Context.MODE_PRIVATE);
+    }
+
+    private static SharedPreferences.Editor getEditor(Context context) {
+        return getSP(context).edit();
+    }
+}

+ 1 - 0
resource/src/main/res/values/colors.xml

@@ -82,4 +82,5 @@
     <color name="javashop_color_coupon_b">#ffffff</color>
 
     <color name="warn_orange">#F07928</color>
+    <color name="main_color">#FFBDC3</color>
 </resources>