Просмотр исходного кода

设备管理系统初始版本完成

shuij 4 лет назад
Родитель
Сommit
9873648d66
100 измененных файлов с 2584 добавлено и 80 удалено
  1. 23 0
      app_core/common/src/main/java/com/core/utils/CommonUtil.java
  2. 1 2
      app_core/common/src/main/res/layout/action_data_inquiry_list.xml
  3. 20 0
      app_core/common/src/main/res/layout/action_device_manager.xml
  4. 1 1
      app_modular/appme/src/main/res/values/colors.xml
  5. 23 0
      app_modular/appworks/src/main/java/com/uas/appworks/CRM/erp/activity/DeviceManageActivity.java
  6. 17 2
      devicemanager/src/main/AndroidManifest.xml
  7. 28 0
      devicemanager/src/main/java/com/yingtang/devicemanager/Constant.java
  8. 0 75
      devicemanager/src/main/java/com/yingtang/devicemanager/SplashActivity.java
  9. 101 0
      devicemanager/src/main/java/com/yingtang/devicemanager/adapter/IpAddressAdapter.java
  10. 95 0
      devicemanager/src/main/java/com/yingtang/devicemanager/adapter/IpHistoryAdapter.java
  11. 15 0
      devicemanager/src/main/java/com/yingtang/devicemanager/bean/IPPORT.java
  12. 101 0
      devicemanager/src/main/java/com/yingtang/devicemanager/bean/LoginDataBean.java
  13. 36 0
      devicemanager/src/main/java/com/yingtang/devicemanager/bean/Master.java
  14. 412 0
      devicemanager/src/main/java/com/yingtang/devicemanager/ui/ConnectServerActivity.java
  15. 360 0
      devicemanager/src/main/java/com/yingtang/devicemanager/ui/LoginActivity.java
  16. 490 0
      devicemanager/src/main/java/com/yingtang/devicemanager/ui/SettingActivity.java
  17. 148 0
      devicemanager/src/main/java/com/yingtang/devicemanager/ui/SplashActivity.java
  18. 66 0
      devicemanager/src/main/java/com/yingtang/devicemanager/utils/CookieUtil.java
  19. 219 0
      devicemanager/src/main/java/com/yingtang/devicemanager/utils/DataSourceManager.java
  20. 27 0
      devicemanager/src/main/java/com/yingtang/devicemanager/utils/JsonTools.java
  21. 32 0
      devicemanager/src/main/java/com/yingtang/devicemanager/utils/RegexUtil.java
  22. 226 0
      devicemanager/src/main/java/com/yingtang/devicemanager/widget/ClearableEditText.java
  23. 11 0
      devicemanager/src/main/res/anim/anim_spinner.xml
  24. 9 0
      devicemanager/src/main/res/anim/notice_in.xml
  25. 9 0
      devicemanager/src/main/res/anim/notice_out.xml
  26. 15 0
      devicemanager/src/main/res/anim/popup_fade_in.xml
  27. 16 0
      devicemanager/src/main/res/anim/popup_fade_out.xml
  28. 40 0
      devicemanager/src/main/res/anim/progress_round.xml
  29. 11 0
      devicemanager/src/main/res/anim/reverse.xml
  30. 11 0
      devicemanager/src/main/res/anim/rotate.xml
  31. 7 0
      devicemanager/src/main/res/color/selector_cancel_text_color.xml
  32. 7 0
      devicemanager/src/main/res/color/selector_collect_type_bg.xml
  33. 7 0
      devicemanager/src/main/res/color/selector_collect_type_text.xml
  34. BIN
      devicemanager/src/main/res/drawable-hdpi/about_us.png
  35. BIN
      devicemanager/src/main/res/drawable-hdpi/actionbar_back.png
  36. BIN
      devicemanager/src/main/res/drawable-hdpi/app_splash_pic.png
  37. BIN
      devicemanager/src/main/res/drawable-hdpi/cleancollect_48.png
  38. BIN
      devicemanager/src/main/res/drawable-hdpi/close.png
  39. BIN
      devicemanager/src/main/res/drawable-hdpi/close_loading.png
  40. BIN
      devicemanager/src/main/res/drawable-hdpi/delete.png
  41. BIN
      devicemanager/src/main/res/drawable-hdpi/exchange.png
  42. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_about_us.png
  43. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_add_white_48dp.png
  44. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_advanced_filter.png
  45. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_calendar.png
  46. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_default_head.png
  47. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_delete.png
  48. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_detail_page.png
  49. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_early_warning.png
  50. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_edittext_scan.png
  51. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_empty.png
  52. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_error.png
  53. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_finish_out.png
  54. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_finished_goods_storage.png
  55. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_job_stock.png
  56. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_jump_smt_query.png
  57. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_material_out.png
  58. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_material_storage.png
  59. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_menu_head.png
  60. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_menu_list.png
  61. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_menu_retract.png
  62. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_menu_spread.png
  63. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_merge_batch.png
  64. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_modify_quantity.png
  65. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_next_details.png
  66. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_print_barcode.png
  67. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_random_check.png
  68. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_realtime_monitor.png
  69. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_scan_barcode.png
  70. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_search_material.png
  71. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_selected.png
  72. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_selected_not.png
  73. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_setting_default.png
  74. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_setting_master.png
  75. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_setting_printer.png
  76. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_setting_sound.png
  77. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_setting_style.png
  78. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_setting_update.png
  79. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_smt_feed.png
  80. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_split_batch.png
  81. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_stock_barcode.png
  82. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_storage_finish_in.png
  83. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_storage_in.png
  84. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_storage_inspection.png
  85. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_storage_iqc.png
  86. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_storage_material_in.png
  87. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_storage_out.png
  88. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_storage_random_check.png
  89. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_storage_recharge.png
  90. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_submit.png
  91. BIN
      devicemanager/src/main/res/drawable-hdpi/ic_undo_split.png
  92. BIN
      devicemanager/src/main/res/drawable-hdpi/icon_search.png
  93. BIN
      devicemanager/src/main/res/drawable-hdpi/index_smt_change.png
  94. BIN
      devicemanager/src/main/res/drawable-hdpi/index_smt_check.png
  95. BIN
      devicemanager/src/main/res/drawable-hdpi/index_smt_down.png
  96. BIN
      devicemanager/src/main/res/drawable-hdpi/index_smt_downall.png
  97. BIN
      devicemanager/src/main/res/drawable-hdpi/index_smt_joint.png
  98. BIN
      devicemanager/src/main/res/drawable-hdpi/index_smt_machine.png
  99. BIN
      devicemanager/src/main/res/drawable-hdpi/index_smt_query.png
  100. BIN
      devicemanager/src/main/res/drawable-hdpi/index_smt_switch.png

+ 23 - 0
app_core/common/src/main/java/com/core/utils/CommonUtil.java

@@ -31,6 +31,7 @@ import android.util.Base64;
 import android.util.Log;
 import android.view.Gravity;
 import android.view.View;
+import android.view.WindowManager;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.EditText;
 import android.widget.ImageView;
@@ -400,6 +401,14 @@ public class CommonUtil {
         String value = sPreferences.getString(key, null);
         return value;
     }
+    public static String getSharedPreferencesString(Context ct, String key,String defValue) {
+        if (key == null) {
+            return null;
+        }
+        SharedPreferences sPreferences = ct.getSharedPreferences(AppShareName, Context.MODE_PRIVATE);
+        String value = sPreferences.getString(key, defValue);
+        return value;
+    }
 
     public static boolean getSharedPreferencesBoolean(Context ct, String key) {
         if (key == null) {
@@ -1482,4 +1491,18 @@ public class CommonUtil {
                 .fadeColor(Color.DKGRAY).build();
     }
 
+    /**
+     * 设置屏幕背景透明度
+     */
+    public static void setBackgroundAlpha(Activity activity, float alpha) {
+        WindowManager.LayoutParams attributes = activity.getWindow().getAttributes();
+        attributes.alpha = alpha;
+        if (alpha == 1) {
+            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
+        } else {
+            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
+        }
+        activity.getWindow().setAttributes(attributes);
+    }
+
 }

+ 1 - 2
app_core/common/src/main/res/layout/action_data_inquiry_list.xml

@@ -2,7 +2,7 @@
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/top"
     android:layout_width="match_parent"
-    android:layout_height="?attr/actionBarSize"
+    android:layout_height="50dp"
     android:focusable="true"
     android:focusableInTouchMode="true"
     android:paddingRight="10dp">
@@ -58,7 +58,6 @@
             android:id="@+id/data_inquiry_voice_iv"
             android:layout_width="10dp"
             android:layout_height="16dp"
-            android:layout_alignRight="@+id/search_edit"
             android:layout_alignParentRight="true"
             android:layout_centerVertical="true"
             android:layout_marginRight="6dp"

+ 20 - 0
app_core/common/src/main/res/layout/action_device_manager.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/top"
+    android:layout_width="match_parent"
+    android:layout_height="?attr/actionBarSize"
+    android:focusable="true"
+    android:focusableInTouchMode="true">
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center">
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="设备管理系统"
+            android:textSize="18sp"
+            android:layout_marginLeft="-12dp"
+            android:textColor="@color/white" />
+    </LinearLayout>
+</RelativeLayout>

+ 1 - 1
app_modular/appme/src/main/res/values/colors.xml

@@ -172,7 +172,7 @@
     <color name="goldenrod">#DAA520</color> <!-- 金麒麟色 -->
     <color name="orchid">#DA70D6</color> <!-- 淡紫色 -->
     <color name="thistle">#D8BFD8</color> <!-- 蓟色 -->
-    <color name="lightgrey">#D3D3D3</color> <!-- 亮灰色 -->
+    <color name="lightgrey">#CCD3D3D3</color> <!-- 亮灰色 -->
     <color name="tan">#D2B48C</color> <!-- 茶色 -->
     <color name="chocolate">#D2691E</color> <!-- 巧可力色 -->
     <color name="peru">#CD853F</color> <!-- 秘鲁色 -->

+ 23 - 0
app_modular/appworks/src/main/java/com/uas/appworks/CRM/erp/activity/DeviceManageActivity.java

@@ -4,9 +4,12 @@ import android.Manifest;
 import android.app.Activity;
 import android.content.Intent;
 import android.os.Bundle;
+import android.support.v7.app.ActionBar;
 import android.support.v7.widget.GridLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
 
 import com.afollestad.materialdialogs.MaterialDialog;
 import com.common.data.StringUtil;
@@ -35,6 +38,19 @@ public class DeviceManageActivity extends BaseActivity {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_device_manage);
         initView();
+        View view = LayoutInflater.from(ct).inflate(R.layout.action_device_manager, null);
+        setActionTitle(view);
+    }
+    protected void setActionTitle(View view) {
+        setTitle("");
+        ActionBar bar = this.getSupportActionBar();
+        bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
+        bar.setCustomView(view);
+    }
+
+    @Override
+    public boolean needNavigation() {
+        return false;
     }
 
     private void initView() {
@@ -84,6 +100,8 @@ public class DeviceManageActivity extends BaseActivity {
         //统计分析
         models.add(new DeviceManage(12, R.drawable.ic_statistical_analysis, StringUtil.getMessage(R.string.text_statistical_analysis))
                 .setCazz(RealTimeFormActivity.class));
+        //设置
+        models.add(new DeviceManage(13, R.drawable.icon_uu_setting, StringUtil.getMessage(R.string.setting)));
         DeviceManageAdapter adapter = new DeviceManageAdapter(this, models);
         contantRv.setAdapter(adapter);
         adapter.setItemClickListener(new DeviceManageAdapter.ItemClickListener() {
@@ -128,6 +146,10 @@ public class DeviceManageActivity extends BaseActivity {
                 } else {
                     startActivity(intent);
                 }
+            }else{
+                Intent intent = new Intent();
+                intent.setAction("com.yingtang.devicemanager.ui.SettingActivity");
+                startActivity(intent);
             }
         }
     }
@@ -171,4 +193,5 @@ public class DeviceManageActivity extends BaseActivity {
                     }
                 }).show();
     }
+
 }

+ 17 - 2
devicemanager/src/main/AndroidManifest.xml

@@ -106,7 +106,7 @@
     <application
         android:name="com.core.app.MyApplication"
         android:allowBackup="true"
-        android:icon="@mipmap/ic_launcher"
+        android:icon="@mipmap/icon"
         android:label="@string/app_model_name"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
@@ -115,13 +115,28 @@
         tools:replace="icon,label,theme">
         <uses-library android:name="org.apache.http.legacy" android:required="false" />
         <activity
-            android:name=".SplashActivity">
+            android:name=".ui.SplashActivity"
+            android:launchMode="singleTask">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+        <activity
+            android:name=".ui.LoginActivity"
+            android:launchMode="singleTask"/>
+        <activity
+            android:name=".ui.ConnectServerActivity"
+            android:launchMode="singleTask"/>
+        <activity
+            android:name=".ui.SettingActivity"
+            android:launchMode="singleTask">
+            <intent-filter>
+             <action android:name="com.yingtang.devicemanager.ui.SettingActivity" />
+             <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
         <service android:name="com.core.service.InitializeService" />
     </application>
 

+ 28 - 0
devicemanager/src/main/java/com/yingtang/devicemanager/Constant.java

@@ -0,0 +1,28 @@
+package com.yingtang.devicemanager;
+
+/**
+ * Created by jsxiaoshui on 2021/7/14
+ */
+public class Constant {
+    public static  final String  ERP_LOGIN="erp_login";
+    public static  final String  ERP_BASEURL="erp_baseurl";
+    public static  final String  SESSIONID="sessionId";
+    public static  final String  ERP_USERNAME="erp_username";
+    public static  final String  ERP_MASTER="erp_master";
+    public static  final String  ERP_MASTER_ZH="erp_master_zh";
+    public static  final String  ERP_PWD="erp_pwd";
+    public static final String CACHE_IP_HISTORY = "cache_ip_history";
+    public static final String  HTTP_CACHE ="http_cache" ;
+    public static final String  SYSTEM_CACHE ="system_cache" ;
+    public static final String KEY_URI = "key_ip_port";
+
+    public static final String LOGIN_DATA_LIST = "login_data_list";
+    public static final String KEY_URI_LOGIN_INFO = "key_uri_login_info";
+    //Header params
+    public static final String HEAD_COOKIE = "Cookie";
+    public static final String HEAD_USER_NAME = "j_username";
+    public static final String HEAD_PWD = "j_password";
+    public static final String HEAD_MASTER= "master";
+    public static final String HEAD_VERSION_CODE= "versioncode";
+
+}

+ 0 - 75
devicemanager/src/main/java/com/yingtang/devicemanager/SplashActivity.java

@@ -1,75 +0,0 @@
-package com.yingtang.devicemanager;
-
-import android.Manifest;
-import android.content.Intent;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.TextView;
-
-import com.core.base.BaseActivity;
-import com.core.utils.CommonUtil;
-import com.uas.appworks.CRM.erp.activity.DeviceManageActivity;
-
-
-public class SplashActivity extends BaseActivity implements View.OnClickListener {
-
-    TextView tv_go;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_splash);
-        tv_go=findViewById(R.id.tv_go);
-        tv_go.setOnClickListener(this);
-        setDefaultUrl();
-        initPermission();
-    }
-
-    private void setDefaultUrl() {
-        CommonUtil.setSharedPreferences(ct, "erp_login", true);
-        CommonUtil.setSharedPreferences(ct, "erp_baseurl", "http://cmityj.gicp.net:8099/ERP/");
-        CommonUtil.setSharedPreferences(ct, "sessionId", "BC028BE4AE77CB7D6E5ED13D3CFF746E");
-        CommonUtil.setSharedPreferences(ct, "erp_username", "YJ268");
-        CommonUtil.setSharedPreferences(ct, "erp_master", "HC_TEST");
-    }
-
-    @Override
-    public void onClick(View v) {
-        switch (v.getId()){
-            case R.id.tv_go:
-                startActivity(new Intent(SplashActivity.this, DeviceManageActivity.class));
-                break;
-        }
-
-    }
-
-
-
-    private void initPermission() {
-        initPermission(1);
-    }
-
-    private void initPermission(int item) {
-        Runnable runnable = new Runnable() {
-            @Override
-            public void run() {
-                initPermission(item + 1);
-            }
-        };
-        String permission = null;
-        switch (item) {
-            case 0:
-                permission = android.Manifest.permission.ACCESS_FINE_LOCATION;
-                break;
-            case 1:
-                permission = android.Manifest.permission.RECORD_AUDIO;
-                break;
-            case 2:
-                permission = Manifest.permission.WRITE_EXTERNAL_STORAGE;
-                break;
-        }
-        if (item <= 2) {
-            requestPermission(permission, runnable, runnable);
-        }
-    }
-}

+ 101 - 0
devicemanager/src/main/java/com/yingtang/devicemanager/adapter/IpAddressAdapter.java

@@ -0,0 +1,101 @@
+package com.yingtang.devicemanager.adapter;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.alibaba.fastjson.JSON;
+import com.core.utils.CommonUtil;
+import com.yingtang.devicemanager.Constant;
+import com.yingtang.devicemanager.R;
+import com.yingtang.devicemanager.bean.LoginDataBean;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class IpAddressAdapter extends BaseAdapter {
+
+    private List<LoginDataBean> objects = new ArrayList<LoginDataBean>();
+
+    private Context context;
+    private LayoutInflater layoutInflater;
+    private String currentMaster, currentIp;
+
+    public IpAddressAdapter(Context context, List<LoginDataBean> objects) {
+        this.context = context;
+        this.layoutInflater = LayoutInflater.from(context);
+        this.objects = objects;
+    }
+
+    public void setCurrent(String master, String ip) {
+        currentMaster = master;
+        currentIp = ip;
+    }
+
+    @Override
+    public int getCount() {
+        return objects.size();
+    }
+
+    @Override
+    public LoginDataBean getItem(int position) {
+        return objects.get(position);
+    }
+
+    @Override
+    public long getItemId(int position) {
+        return position;
+    }
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        if (convertView == null) {
+            convertView = layoutInflater.inflate(R.layout.item_list_ip_address, null);
+            convertView.setTag(new ViewHolder(convertView));
+        }
+        initializeViews((LoginDataBean) getItem(position), (ViewHolder) convertView.getTag(), position);
+        return convertView;
+    }
+
+    private void initializeViews(final LoginDataBean object, ViewHolder holder, final int position) {
+        String masterName = object.getMasterName();
+        String ip = object.getIp();
+
+        if (masterName != null && masterName.equals(currentMaster) && ip != null && ip.equals(currentIp)) {
+            holder.itemIpAddressTv.setTextColor(Color.GRAY);
+        } else {
+            holder.itemIpAddressTv.setTextColor(Color.BLACK);
+        }
+
+        holder.itemIpAddressTv.setText(masterName + "(" + ip + ")");
+        holder.itemIpAddressDeleteIv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                objects.remove(position);
+                notifyDataSetChanged();
+                if (objects.size() == 0) {
+                    CommonUtil.setSharedPreferences(context, Constant.LOGIN_DATA_LIST,"");
+                } else {
+                    String loginCache = JSON.toJSONString(objects);
+                    CommonUtil.setSharedPreferences(context, Constant.LOGIN_DATA_LIST,loginCache);
+                }
+            }
+        });
+    }
+
+    protected class ViewHolder {
+        private TextView itemIpAddressTv;
+        private ImageView itemIpAddressDeleteIv;
+
+        public ViewHolder(View view) {
+            itemIpAddressTv = (TextView) view.findViewById(R.id.item_ip_address_tv);
+            itemIpAddressDeleteIv = (ImageView) view.findViewById(R.id.item_ip_address_delete_iv);
+        }
+    }
+
+}

+ 95 - 0
devicemanager/src/main/java/com/yingtang/devicemanager/adapter/IpHistoryAdapter.java

@@ -0,0 +1,95 @@
+package com.yingtang.devicemanager.adapter;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.alibaba.fastjson.JSON;
+import com.core.utils.CommonUtil;
+import com.yingtang.devicemanager.Constant;
+import com.yingtang.devicemanager.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class IpHistoryAdapter extends BaseAdapter {
+
+    private List<String> objects = new ArrayList<String>();
+
+    private Context context;
+    private LayoutInflater layoutInflater;
+
+    private OnDeleteItemListener mOnDeleteItemListener;
+
+    public IpHistoryAdapter(Context context, List<String> objects) {
+        this.context = context;
+        this.layoutInflater = LayoutInflater.from(context);
+
+        this.objects = objects;
+    }
+
+    public void setOnDeleteItemListener(OnDeleteItemListener onDeleteItemListener) {
+        mOnDeleteItemListener = onDeleteItemListener;
+    }
+
+    @Override
+    public int getCount() {
+        return objects.size();
+    }
+
+    @Override
+    public String getItem(int position) {
+        return objects.get(position);
+    }
+
+    @Override
+    public long getItemId(int position) {
+        return position;
+    }
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        if (convertView == null) {
+            convertView = layoutInflater.inflate(R.layout.item_list_ip_history, null);
+            convertView.setTag(new ViewHolder(convertView));
+        }
+        initializeViews((String) getItem(position), (ViewHolder) convertView.getTag(), position);
+        return convertView;
+    }
+
+    private void initializeViews(final String object, ViewHolder holder, final int position) {
+        holder.itemIpHistoryTextTv.setText(object);
+        holder.itemIpHistoryDeleteIv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                objects.remove(position);
+                notifyDataSetChanged();
+                if (objects.size() == 0) {
+                    CommonUtil.setSharedPreferences(context, Constant.CACHE_IP_HISTORY, null);
+                    mOnDeleteItemListener.onDeleteItem(true);
+                } else {
+                    String historyResult = JSON.toJSONString(objects);
+                    CommonUtil.setSharedPreferences(context, Constant.CACHE_IP_HISTORY, historyResult);
+                }
+            }
+        });
+    }
+
+    protected class ViewHolder {
+        private TextView itemIpHistoryTextTv;
+        private ImageView itemIpHistoryDeleteIv;
+
+        public ViewHolder(View view) {
+            itemIpHistoryTextTv = (TextView) view.findViewById(R.id.item_ip_history_text_tv);
+            itemIpHistoryDeleteIv = (ImageView) view.findViewById(R.id.item_ip_history_delete_iv);
+        }
+    }
+
+    public interface OnDeleteItemListener {
+        void onDeleteItem(boolean isEmpty);
+    }
+}

+ 15 - 0
devicemanager/src/main/java/com/yingtang/devicemanager/bean/IPPORT.java

@@ -0,0 +1,15 @@
+package com.yingtang.devicemanager.bean;
+
+import java.util.List;
+
+/**
+ * Created by Administrator on 2016/3/4.
+ */
+public class IPPORT {
+    public List<Uri> uriArray;
+    public class Uri{
+        public String port;//外箱编号
+        public String ip;//总数
+
+    }
+}

+ 101 - 0
devicemanager/src/main/java/com/yingtang/devicemanager/bean/LoginDataBean.java

@@ -0,0 +1,101 @@
+package com.yingtang.devicemanager.bean;
+
+/**
+ * @author RaoMeng
+ * @describe 登录信息实体类
+ * @date 2018/4/23 14:48
+ */
+
+public class LoginDataBean {
+    private String mHttp;
+    private String mIp;
+    private String mPort;
+    private String mSite;
+    private String mMaster;
+    private String mMasterName;
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        LoginDataBean that = (LoginDataBean) o;
+
+        if (!mHttp.equals(that.mHttp)) {
+            return false;
+        }
+        if (!mIp.equals(that.mIp)) {
+            return false;
+        }
+        if (!mPort.equals(that.mPort)) {
+            return false;
+        }
+        if (!mSite.equals(that.mSite)) {
+            return false;
+        }
+        return mMaster.equals(that.mMaster) && mMasterName.equals(that.mMasterName);
+    }
+
+    @Override
+    public int hashCode() {
+        int result = mHttp.hashCode();
+        result = 31 * result + mIp.hashCode();
+        result = 31 * result + mPort.hashCode();
+        result = 31 * result + mSite.hashCode();
+        result = 31 * result + mMaster.hashCode();
+        result = 31 * result + mMasterName.hashCode();
+        return result;
+    }
+
+    public String getHttp() {
+        return mHttp;
+    }
+
+    public void setHttp(String http) {
+        mHttp = http;
+    }
+
+    public String getIp() {
+        return mIp;
+    }
+
+    public void setIp(String ip) {
+        mIp = ip;
+    }
+
+    public String getPort() {
+        return mPort;
+    }
+
+    public void setPort(String port) {
+        mPort = port;
+    }
+
+    public String getSite() {
+        return mSite;
+    }
+
+    public void setSite(String site) {
+        mSite = site;
+    }
+
+    public String getMaster() {
+        return mMaster;
+    }
+
+    public void setMaster(String master) {
+        mMaster = master;
+    }
+
+    public String getMasterName() {
+        return mMasterName;
+    }
+
+    public void setMasterName(String masterName) {
+        mMasterName = masterName;
+    }
+}

+ 36 - 0
devicemanager/src/main/java/com/yingtang/devicemanager/bean/Master.java

@@ -0,0 +1,36 @@
+package com.yingtang.devicemanager.bean;
+
+/**
+ * @param :maId       账套ID
+ * @param :maFunction 账套信息
+ * @param :maName     账套编号
+ * @注释:账套类
+ */
+public class Master {
+    private String maId;
+    private String maFunction;
+    private String maName;
+
+    /*构造函数*/
+    public Master() {}
+
+    public Master(String pMaId, String pMaName, String pMaFunction) {
+        maId = pMaId;
+        maFunction = pMaFunction;
+        maName = pMaName;
+    }
+
+
+    public String getMaName() {
+        return maName;
+    }
+
+    public String getMaFunction() {
+        return maFunction;
+    }
+
+    public String getMaId() {
+
+        return maId;
+    }
+}

+ 412 - 0
devicemanager/src/main/java/com/yingtang/devicemanager/ui/ConnectServerActivity.java

@@ -0,0 +1,412 @@
+package com.yingtang.devicemanager.ui;
+
+import android.Manifest;
+import android.app.Dialog;
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.support.v7.app.AlertDialog;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.Spinner;
+import android.widget.SpinnerAdapter;
+import android.widget.TextView;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.common.data.JSONUtil;
+import com.core.base.BaseActivity;
+import com.core.utils.CommonUtil;
+import com.me.network.app.base.HttpCallback;
+import com.me.network.app.base.HttpParams;
+import com.me.network.app.http.HttpRequest;
+import com.me.network.app.http.Method;
+import com.yingtang.devicemanager.Constant;
+import com.yingtang.devicemanager.R;
+import com.yingtang.devicemanager.adapter.IpHistoryAdapter;
+import com.yingtang.devicemanager.utils.DataSourceManager;
+import com.yingtang.devicemanager.utils.RegexUtil;
+import com.yingtang.devicemanager.widget.ClearableEditText;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by jsxiaoshui on 2021/7/14
+ */
+public class ConnectServerActivity extends BaseActivity implements View.OnFocusChangeListener {
+    private TextView noticeTextView;
+    private Button submitButton;
+    private EditText ipEditText, portEditText, siteEditText;
+    private Spinner mSystemSpinner;
+    private Spinner mHttpSpinner;
+    private LinearLayout mIconTitleLinearLayout;
+    private ImageView mHistoryImageView;
+    private Dialog mHistoryDialog;
+    private ListView mHistoryListView;
+    private List<String> mHistoryList;
+    private IpHistoryAdapter mIpHistoryAdapter;
+    private ArrayList<String> mHttpStrings;
+    private ArrayAdapter mHttpAdapter;
+    private String mHttpCache;
+    boolean uriRight = false;
+    String cacheUri = null;
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_connectserver);
+        initView();
+        initEvent();
+        initData();
+        initPermission();
+    }
+
+
+
+    private void initView() {
+        //获取组件
+        submitButton = (Button) findViewById(R.id.btn_submit_conncetserver_fragment);
+        ipEditText = (EditText) findViewById(R.id.et_ip_connectserver_fragment);
+        portEditText = (EditText) findViewById(R.id.et_port_connectserver_fragment);
+        siteEditText = (EditText) findViewById(R.id.et_site_connectserver_fragment);
+        noticeTextView = (TextView) findViewById(R.id.textview_notice);
+        mSystemSpinner = (Spinner) findViewById(R.id.connect_system_sp);
+        mHttpSpinner = (Spinner) findViewById(R.id.connect_http_sp);
+        mIconTitleLinearLayout = (LinearLayout) findViewById(R.id.connectserver_icon_title_ll);
+        mHistoryImageView = (ImageView) findViewById(R.id.connectserver_ip_history_iv);
+        View historyView = View.inflate(ConnectServerActivity.this, R.layout.pop_ip_history, null);
+        mHistoryListView = (ListView) historyView.findViewById(R.id.pop_ip_history_lv);
+        mHistoryList = new ArrayList<>();
+        mIpHistoryAdapter = new IpHistoryAdapter(ConnectServerActivity.this, mHistoryList);
+        mHistoryListView.setAdapter(mIpHistoryAdapter);
+
+        mHistoryDialog = new AlertDialog.Builder(this).setView(historyView).create();
+        mHttpStrings = new ArrayList<>();
+        mHttpStrings.add("http");
+        mHttpStrings.add("https");
+        mHttpAdapter = new ArrayAdapter(ConnectServerActivity.this, R.layout.item_server_spinner, R.id.text_spinner, mHttpStrings);
+        mHttpSpinner.setAdapter(mHttpAdapter);
+        mHttpCache = CommonUtil.getSharedPreferencesString(ConnectServerActivity.this, Constant.HTTP_CACHE,"http");
+        if (mHttpCache != null) {
+            setSpinnerItemSelectedByValue(mHttpSpinner, mHttpCache);
+        }
+    }
+    private void initEvent() {
+        ipEditText.setOnFocusChangeListener(this);
+        portEditText.setOnFocusChangeListener(this);
+        submitButton.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                setIp();
+            }
+        });
+
+        mHttpSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+                if (mHttpStrings != null) {
+                    CommonUtil.setSharedPreferences(ConnectServerActivity.this,Constant.HTTP_CACHE,mHttpStrings.get(position).toString());
+                }
+            }
+
+            @Override
+            public void onNothingSelected(AdapterView<?> parent) {
+
+            }
+        });
+
+        mHistoryListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                String history = mHistoryList.get(position);
+                ipEditText.setText(history);
+                if (mHistoryDialog != null) {
+                    mHistoryDialog.dismiss();
+                }
+            }
+        });
+
+        mIpHistoryAdapter.setOnDeleteItemListener(new IpHistoryAdapter.OnDeleteItemListener() {
+            @Override
+            public void onDeleteItem(boolean isEmpty) {
+                if (isEmpty) {
+                    mHistoryDialog.dismiss();
+                }
+            }
+        });
+
+        mHistoryImageView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                String historyStr = CommonUtil.getSharedPreferencesString(ConnectServerActivity.this, Constant.CACHE_IP_HISTORY,"");
+                List<String> histories;
+                if (!TextUtils.isEmpty(historyStr)) {
+                    histories = JSON.parseArray(historyStr, String.class);
+                    mHistoryList.clear();
+                    mHistoryList.addAll(histories);
+                    mHttpAdapter.notifyDataSetChanged();
+                    mHistoryDialog.show();
+                }
+            }
+        });
+    }
+    private void initData() {
+        cacheUri = CommonUtil.getSharedPreferencesString(ConnectServerActivity.this, Constant.KEY_URI, null);
+        //Toast.makeText(getActivity(),cacheUri,Toast.LENGTH_SHORT).show();
+        //当缓存不为空
+        if (cacheUri != null) {
+            //将缓存数据加载到数据源UriList
+            DataSourceManager.getDataSourceManager().setUriList(cacheUri);
+            List<Map<String, String>> list = DataSourceManager.getDataSourceManager().getUriList();
+            String tmpIp = list.get(0).get(DataSourceManager.KEY_IP);
+            String tmpPort = list.get(0).get(DataSourceManager.KEY_PORT);
+            String tmpSite = CommonUtil.getSharedPreferencesString(ConnectServerActivity.this, Constant.SYSTEM_CACHE, "ERP");
+            ipEditText.setText(tmpIp);
+            portEditText.setText(tmpPort);
+            siteEditText.setText(tmpSite);
+            uriRight = true;
+        }
+    }
+
+    private void setIp() {
+        String mHttp=mHttpSpinner.getSelectedItem().toString();
+        String ip = ipEditText.getText().toString().trim();
+        String port = portEditText.getText().toString().trim();
+        String site = siteEditText.getText().toString().trim();
+        isRightIp();
+        isRightPort();
+        if (ip == null || ip.equals("")) {
+            showNotice(getResources().getString(R.string.notice_serverconnect_ip_blank));
+            return;
+        }
+        if (site == null || site.equals("")) {
+            showNotice(getResources().getString(R.string.notice_serverconnect_site_blank));
+            return;
+        }
+        if (port == null || port.equals("")) {
+            showNotice(getResources().getString(R.string.notice_serverconnect_port_blank));
+            return;
+        }
+        //IP和Port格式验证通过
+        if (uriRight) {
+           // progressDialog.show();
+            //连接服务器
+            connectIp(mHttp,ip, port, site);
+        }
+    }
+
+    private void connectIp(String mHttp,String ip, String port, String site) {
+        progressDialog.show();
+        String url = mHttp+"://" + ip + ":" + port + "/" + site+"/";
+        HttpRequest.getInstance().sendRequest(url,
+                new HttpParams.Builder()
+                        .url("api/pda/getAllMasters.action")
+                        .connectTimeOut(3)
+                        .readTimeOut(3)
+                        .writeTimeOut(3)
+                        .readTimeOut(3)
+                        .method(Method.POST)
+                        .build(), new HttpCallback() {
+                    @Override
+                    public void onSuccess(int flag, Object o) throws Exception {
+                        progressDialog.dismiss();
+                        String result = o.toString();
+                        JSONObject resultObject = JSON.parseObject(result);
+                        boolean success = JSONUtil.getBoolean(resultObject, "success");
+                        if(success){
+                            DataSourceManager.getDataSourceManager().setMasterList(result);
+                            CommonUtil.setSharedPreferences(ct, Constant.ERP_LOGIN, true);
+                            CommonUtil.setSharedPreferences(ct, Constant.ERP_BASEURL, url);
+                            CommonUtil.setSharedPreferences(ct,Constant.SYSTEM_CACHE,site);
+                            //JSon对象中保存一个还有ip和port的数组
+                            cacheUri = DataSourceManager.getDataSourceManager().addUriItem(ip, port);
+                            CommonUtil.setSharedPreferences(ConnectServerActivity.this,Constant.KEY_URI,cacheUri);
+                            //添加到历史记录
+                            String historyStr = CommonUtil.getSharedPreferencesString(ConnectServerActivity.this, Constant.CACHE_IP_HISTORY,null);
+                            List<String> histories;
+                            if (TextUtils.isEmpty(historyStr)) {
+                                histories = new ArrayList<>();
+                                histories.add(ip);
+                            } else {
+                                histories = JSON.parseArray(historyStr, String.class);
+                                for (String history : histories) {
+                                    if (ip.equals(history)) {
+                                        histories.remove(history);
+                                        break;
+                                    }
+                                }
+                                histories.add(0, ip);
+                            }
+                            String historyResult = JSON.toJSONString(histories);
+                            CommonUtil.setSharedPreferences(ConnectServerActivity.this,Constant.CACHE_IP_HISTORY,historyResult);
+                            //跳转到登录
+                            Intent intent=new Intent(ConnectServerActivity.this,LoginActivity.class);
+                            intent.putExtra(Constant.KEY_URI_LOGIN_INFO,ip+":"+port);
+                            startActivity(intent);
+                            finish();
+                        }
+                    }
+
+                    @Override
+                    public void onFail(int flag, String failStr) throws Exception {
+                         progressDialog.dismiss();
+                         showNotice("连接服务器失败");
+                    }
+                });
+
+
+    }
+
+    @Override
+    public boolean needCommonToolBar() {
+        return false;
+    }
+
+    public static void setSpinnerItemSelectedByValue(Spinner spinner, String value) {
+        SpinnerAdapter apsAdapter = spinner.getAdapter(); //得到SpinnerAdapter对象
+        int k = apsAdapter.getCount();
+        for (int i = 0; i < k; i++) {
+            if (value.equals(apsAdapter.getItem(i).toString())) {
+                spinner.setSelection(i, true);// 默认选中项
+                break;
+            }
+        }
+    }
+
+    @Override
+    public void onFocusChange(View v, boolean hasFocus) {
+        EditText et = (EditText) v;
+        if (hasFocus) {
+            et.setTextColor(getResources().getColor(R.color.text_normal));
+        } else {
+            String tempStr = et.getText().toString().trim();
+            //当没有字的时候
+            if (tempStr.equals("") || tempStr == null) {
+                switch (et.getId()) {
+                    case R.id.et_ip_connectserver_fragment:
+                        et.setHint(getResources().getString(R.string.hint_fragment_serverconnect_ip));
+                        break;
+                    case R.id.et_port_connectserver_fragment:
+                        et.setHint(getResources().getString(R.string.hint_fragment_serverconnect_port));
+                        break;
+                }
+            } else {
+                switch (et.getId()) {
+                    case R.id.et_ip_connectserver_fragment:
+                        isRightIp();
+                        break;
+                    case R.id.et_port_connectserver_fragment:
+                        isRightPort();
+                        break;
+                }
+            }
+        }
+    }
+
+    //判断是否是正确URI
+    private void isRightIp() {
+        String ip = ipEditText.getText().toString().trim();
+        //判断是否是正确的IP地址
+        boolean ipRight = RegexUtil.checkString(ip,  com.yingtang.devicemanager.utils.RegexUtil.IP_FORMAT);
+        Log.e("ConnectFragment", "ipRight" + ipRight);
+        if (!ipRight) {
+            //IP不正确,文字变红
+            ipEditText.setTextColor(getResources().getColor(R.color.red));
+            uriRight = false;
+            //显示输入错误图片
+            ((ClearableEditText) ipEditText).setWarnIconVisible();
+            showNotice(getResources().getString(R.string.notice_serverconnect_ip_error));
+        } else {
+            uriRight = true;
+        }
+    }
+
+    private void isRightPort() {
+        String port = portEditText.getText().toString().trim();
+
+        //判断是否是正确的port地址
+        boolean portRight = RegexUtil.checkString(port, RegexUtil.PORT_FORMAT);
+
+        if (!portRight) {
+            //Prot不正确,文字变红
+            portEditText.setTextColor(getResources().getColor(R.color.red));
+            uriRight = false;
+            ((ClearableEditText) portEditText).setWarnIconVisible();
+        } else {
+            uriRight = true;
+        }
+    }
+
+    /**
+     * @注释:显示错误提示
+     */
+    private void showNotice(String noticeMsg) {
+        noticeTextView.setText(noticeMsg);
+        Animation noticeIn = AnimationUtils.loadAnimation(ConnectServerActivity.this, R.anim.notice_in);
+        final Animation noticeOut = AnimationUtils.loadAnimation(ConnectServerActivity.this, R.anim.notice_out);
+        //控件保存在动画结束的状态
+        noticeIn.setFillAfter(true);
+        noticeOut.setFillAfter(true);
+        noticeTextView.setVisibility(View.VISIBLE);
+        noticeTextView.startAnimation(noticeIn);
+
+        new AsyncTask<String, Void, Float>() {
+            @Override
+            protected Float doInBackground(String... params) {
+                try {
+                    //notice显示1.5s
+                    Thread.sleep(1500);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+                return null;
+            }
+
+            @Override
+            protected void onPostExecute(Float aFloat) {
+                //notice退出
+                noticeTextView.startAnimation(noticeOut);
+                //  noticeTextView.setVisibility(View.GONE);
+            }
+        }.execute();
+    }
+
+    private void initPermission() {
+        initPermission(1);
+    }
+
+    private void initPermission(int item) {
+        Runnable runnable = new Runnable() {
+            @Override
+            public void run() {
+                initPermission(item + 1);
+            }
+        };
+        String permission = null;
+        switch (item) {
+            case 0:
+                permission = android.Manifest.permission.ACCESS_FINE_LOCATION;
+                break;
+            case 1:
+                permission = android.Manifest.permission.RECORD_AUDIO;
+                break;
+            case 2:
+                permission = Manifest.permission.WRITE_EXTERNAL_STORAGE;
+                break;
+        }
+        if (item <= 2) {
+            requestPermission(permission, runnable, runnable);
+        }
+    }
+}

+ 360 - 0
devicemanager/src/main/java/com/yingtang/devicemanager/ui/LoginActivity.java

@@ -0,0 +1,360 @@
+package com.yingtang.devicemanager.ui;
+
+import android.Manifest;
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+import android.widget.Spinner;
+import android.widget.SpinnerAdapter;
+import android.widget.TextView;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.common.data.JSONUtil;
+import com.core.base.BaseActivity;
+import com.core.utils.CommonUtil;
+import com.me.network.app.base.HttpCallback;
+import com.me.network.app.base.HttpParams;
+import com.me.network.app.http.HttpRequest;
+import com.me.network.app.http.Method;
+import com.uas.appworks.CRM.erp.activity.DeviceManageActivity;
+import com.yingtang.devicemanager.Constant;
+import com.yingtang.devicemanager.R;
+import com.yingtang.devicemanager.bean.LoginDataBean;
+import com.yingtang.devicemanager.bean.Master;
+import com.yingtang.devicemanager.utils.DataSourceManager;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by jsxiaoshui on 2021/7/14
+ */
+public class LoginActivity extends BaseActivity implements View.OnClickListener {
+
+    private  TextView noticeTextView;
+    private Button btnLogin,mModifyIpButton;
+    private EditText userEditText, pwdEditText;
+    private  CheckBox rmbCheckBox, mCyCheckBox;
+    private  Spinner masterSpinner;
+    private ArrayList<Master> masterList;
+    private ArrayList<String> masterFuncList;
+    private  ArrayAdapter adapter;
+    private String maName;
+    private String maFunName;
+    private String userName,password;
+    private int request_login=111;
+    String cacheInfo;
+    private String ipKey;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+         setContentView(R.layout.activity_login);
+         initView();
+         initEvent();
+         initPermission();
+    }
+
+
+
+    private void initView() {
+        //获取组件
+        masterSpinner = (Spinner) findViewById(R.id.sp_login);
+        userEditText = (EditText) findViewById(R.id.et_user_login);
+        pwdEditText = (EditText) findViewById(R.id.et_pwd_login);
+        btnLogin = (Button) findViewById(R.id.button_login_login);
+        noticeTextView = (TextView) findViewById(R.id.textview_notice);
+        rmbCheckBox = (CheckBox) findViewById(R.id.chbx_login);
+        mModifyIpButton = (Button) findViewById(R.id.button_modify_ip_port);
+        mCyCheckBox = findViewById(R.id.cybx_login);
+        //获取ConnectServerFragment传递的uriKey以作为SharedPreference保存登录名的key值
+        ipKey = getIntent().getStringExtra(Constant.KEY_URI_LOGIN_INFO);
+        initData();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+    }
+
+    @Override
+    protected void onNewIntent(Intent intent) {
+        super.onNewIntent(intent);
+        ipKey = intent.getStringExtra(Constant.KEY_URI_LOGIN_INFO);
+        initData();
+    }
+
+    private void initEvent() {
+        masterSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+                //获得master的name
+                maName = masterList.get(position).getMaName();//N_HC
+                maFunName = masterFuncList.get(position);//海创科技
+            }
+
+            @Override
+            public void onNothingSelected(AdapterView<?> parent) {
+
+            }
+        });
+        btnLogin.setOnClickListener(this);
+        mModifyIpButton.setOnClickListener(this);
+
+    }
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()){
+            case R.id.button_login_login:
+                userName = userEditText.getText().toString().trim();
+                password = pwdEditText.getText().toString().trim();
+                if (maName == null || maName.equals("")) {
+                    showNotice(getResources().getString(R.string.notice_login_master));
+                    return;
+                }
+                if (userName == null || userName.equals("")) {
+                    showNotice(getResources().getString(R.string.notice_login_user));
+                    return;
+                }
+                if (password == null || password.equals("")) {
+                    showNotice(getResources().getString(R.string.notice_login_pwd));
+                    return;
+                }
+                if (maName != null && userName != null && password != null) {
+                    loginERP();
+                }
+                break;
+            case R.id.button_modify_ip_port:
+                Intent intent=new Intent(LoginActivity.this,ConnectServerActivity.class);
+                startActivity(intent);
+                break;
+        }
+
+    }
+
+
+
+    private void loginERP() {
+        progressDialog.show();
+        HttpRequest.getInstance().sendRequest(CommonUtil.getAppBaseUrl(this),
+                new HttpParams.Builder()
+                        .url("api/pda/login.action")
+                        .addParam("j_username",userName)
+                        .addParam("j_password",password)
+                        .addParam("master",maName)
+                        .addParam("versioncode",CommonUtil.ApkVersionCode(LoginActivity.this))
+                        .connectTimeOut(5)
+                        .readTimeOut(5)
+                        .method(Method.POST)
+                        .build(), new HttpCallback() {
+                    @Override
+                    public void onSuccess(int flag, Object o) throws Exception {
+                        progressDialog.dismiss();
+                        String result = o.toString();
+                        JSONObject resultObject = JSON.parseObject(result);
+                        boolean success = JSONUtil.getBoolean(resultObject, "success");
+                        if(success){
+                            String sessionId=JSONUtil.getText(resultObject,"sessionId");
+                            String erp_username=JSONUtil.getText(resultObject,"em_code");
+                            CommonUtil.setSharedPreferences(LoginActivity.this,Constant.SESSIONID,sessionId);
+                            CommonUtil.setSharedPreferences(LoginActivity.this,Constant.ERP_USERNAME,erp_username);
+                            CommonUtil.setSharedPreferences(LoginActivity.this,Constant.ERP_MASTER,maName);//N_HC
+                            CommonUtil.setSharedPreferences(LoginActivity.this,Constant.ERP_MASTER_ZH,maFunName);//海创科技
+                            CommonUtil.setSharedPreferences(LoginActivity.this,Constant.ERP_PWD,password);
+                            String pwd = null;
+                            if (rmbCheckBox.isChecked()) {
+                                pwd = pwdEditText.getText().toString().trim();
+                            }
+                            //保存登录信息
+                            cacheInfo = DataSourceManager.getDataSourceManager().addInfoItem(erp_username, pwd);
+                            CommonUtil.setSharedPreferences(LoginActivity.this,ipKey,cacheInfo);
+                            //保存登录数据,用于应用内切换登录
+                            if (mCyCheckBox.isChecked()) {
+                                saveLoginCache();
+                            }
+                            Intent intent = new Intent(LoginActivity.this, DeviceManageActivity.class);
+                            startActivity(intent);
+                            finish();
+                        }else{
+                            String reason=JSONUtil.getText(resultObject,"reason");
+                            if(!TextUtils.isEmpty(reason)){
+                                showNotice(reason);
+                            }else{
+                                showNotice(getResources().getString(R.string.notice_login_error));
+                            }
+                        }
+                    }
+                    @Override
+                    public void onFail(int flag, String failStr) throws Exception {
+                        progressDialog.dismiss();
+                        showNotice(getResources().getString(R.string.notice_login_error));
+                    }
+                });
+    }
+    private void saveLoginCache() {
+        String http = CommonUtil.getSharedPreferencesString(LoginActivity.this, Constant.HTTP_CACHE, "http");
+        LoginDataBean loginDataBean = new LoginDataBean();
+        loginDataBean.setMaster(maName);
+        loginDataBean.setMasterName(maFunName);
+        loginDataBean.setHttp(http);
+
+        String cacheUri = CommonUtil.getSharedPreferencesString(LoginActivity.this, Constant.KEY_URI, null);
+        if (cacheUri != null) {
+            DataSourceManager.getDataSourceManager().setUriList(cacheUri);
+            List<Map<String, String>> list = DataSourceManager.getDataSourceManager().getUriList();
+            String tmpIp = list.get(0).get(DataSourceManager.KEY_IP);
+            String tmpPort = list.get(0).get(DataSourceManager.KEY_PORT);
+            String tmpSite = CommonUtil.getSharedPreferencesString(LoginActivity.this,  Constant.SYSTEM_CACHE, "ERP");
+
+            loginDataBean.setIp(tmpIp);
+            loginDataBean.setPort(tmpPort);
+            loginDataBean.setSite(tmpSite);
+        }
+
+        List<LoginDataBean> loginListCache = DataSourceManager.getDataSourceManager().getLoginListCache(LoginActivity.this);
+        if (loginListCache == null) {
+            newLoginCache(loginDataBean);
+        } else {
+            boolean isExist = false;
+            for (int i = 0; i < loginListCache.size(); i++) {
+                LoginDataBean cacheLoginDataBean = loginListCache.get(i);
+                if (loginDataBean.equals(cacheLoginDataBean)) {
+                    isExist = true;
+                    break;
+                }
+            }
+            if (!isExist) {
+                loginListCache.add(0, loginDataBean);
+                String newLoginCache = JSON.toJSONString(loginListCache);
+                CommonUtil.setSharedPreferences(LoginActivity.this, Constant.LOGIN_DATA_LIST, newLoginCache);
+            }
+        }
+    }
+
+    private void newLoginCache(LoginDataBean loginDataBean) {
+        List<LoginDataBean> loginDataBeans = new ArrayList<>();
+        loginDataBeans.add(loginDataBean);
+        String loginDataJson = JSON.toJSONString(loginDataBeans);
+        CommonUtil.setSharedPreferences(LoginActivity.this,Constant.LOGIN_DATA_LIST,loginDataJson);
+    }
+
+    private void showNotice(String noticeMsg) {
+        noticeTextView.setText(noticeMsg);
+        Animation noticeIn = AnimationUtils.loadAnimation(LoginActivity.this, R.anim.notice_in);
+        final Animation noticeOut = AnimationUtils.loadAnimation(LoginActivity.this, R.anim.notice_out);
+        //控件保存在动画结束的状态
+        noticeIn.setFillAfter(true);
+        noticeOut.setFillAfter(true);
+        noticeTextView.setVisibility(View.VISIBLE);
+        noticeTextView.startAnimation(noticeIn);
+        new AsyncTask<String, Void, Float>() {
+            @Override
+            protected Float doInBackground(String... params) {
+                try {
+                    Thread.sleep(1500);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+                return null;
+            }
+            @Override
+            protected void onPostExecute(Float aFloat) {
+                noticeTextView.startAnimation(noticeOut);
+            }
+        }.execute();
+    }
+
+    private void initData() {
+        //获取MasterList集合
+        masterList = DataSourceManager.getDataSourceManager().getMasterList();
+        //绑定Master下拉框数据
+        masterFuncList = DataSourceManager.getDataSourceManager().getMasterFuncList();
+        adapter = new ArrayAdapter(LoginActivity.this, R.layout.item_spinner, R.id.text_spinner, masterFuncList);
+        masterSpinner.setAdapter(adapter);
+        maName = CommonUtil.getSharedPreferences(LoginActivity.this,Constant.ERP_MASTER);
+        maFunName = CommonUtil.getSharedPreferences(LoginActivity.this,Constant.ERP_MASTER_ZH);
+        if (maFunName != null) {
+            setSpinnerItemSelectedByValue(masterSpinner, maFunName);
+        }
+        //通过ipport获得登录名缓存
+        cacheInfo = CommonUtil.getSharedPreferencesString(LoginActivity.this,ipKey, null);
+        if (cacheInfo != null) {
+            DataSourceManager.getDataSourceManager().setInfoList(cacheInfo);
+            List<Map<String, String>> tmpList = DataSourceManager.getDataSourceManager().getInfoList();
+            String tmpUserName = tmpList.get(0).get(DataSourceManager.KEY_USERNAME).toString();
+            String tmpPwd = tmpList.get(0).get(DataSourceManager.KEY_PASSWORD).toString();
+            userEditText.setText(tmpUserName);
+            //当密码不等于“/t”,说明用户选择了保存密码
+            if (!tmpPwd.equals(DataSourceManager.NO_PWD)) {
+                pwdEditText.setText(tmpPwd);
+                rmbCheckBox.setChecked(true);
+            }
+        }
+    }
+
+
+
+    //不适用系统提供的CommonToolBar
+    @Override
+    public boolean needCommonToolBar() {
+        return false;
+    }
+
+    /**
+     * 根据值, 设置spinner默认选中:
+     *
+     * @param spinner
+     * @param value
+     */
+    public static void setSpinnerItemSelectedByValue(Spinner spinner, String value) {
+        SpinnerAdapter apsAdapter = spinner.getAdapter(); //得到SpinnerAdapter对象
+        int k = apsAdapter.getCount();
+        for (int i = 0; i < k; i++) {
+            if (value.equals(apsAdapter.getItem(i).toString())) {
+                spinner.setSelection(i, true);// 默认选中项
+                break;
+            }
+        }
+    }
+
+    private void initPermission() {
+        initPermission(1);
+    }
+
+    private void initPermission(int item) {
+        Runnable runnable = new Runnable() {
+            @Override
+            public void run() {
+                initPermission(item + 1);
+            }
+        };
+        String permission = null;
+        switch (item) {
+            case 0:
+                permission = android.Manifest.permission.ACCESS_FINE_LOCATION;
+                break;
+            case 1:
+                permission = android.Manifest.permission.RECORD_AUDIO;
+                break;
+            case 2:
+                permission = Manifest.permission.WRITE_EXTERNAL_STORAGE;
+                break;
+        }
+        if (item <= 2) {
+            requestPermission(permission, runnable, runnable);
+        }
+    }
+
+
+}

+ 490 - 0
devicemanager/src/main/java/com/yingtang/devicemanager/ui/SettingActivity.java

@@ -0,0 +1,490 @@
+package com.yingtang.devicemanager.ui;
+
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.graphics.drawable.BitmapDrawable;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.text.TextUtils;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.PopupWindow;
+import android.widget.TextView;
+
+import com.alibaba.fastjson.JSON;
+import com.android.volley.RequestQueue;
+import com.android.volley.toolbox.JsonRequest;
+import com.common.data.JSONUtil;
+import com.core.base.BaseActivity;
+import com.core.utils.CommonUtil;
+import com.core.widget.view.Activity.CommonWebviewActivity;
+import com.me.network.app.base.HttpCallback;
+import com.me.network.app.base.HttpParams;
+import com.me.network.app.http.HttpRequest;
+import com.me.network.app.http.Method;
+import com.yingtang.devicemanager.Constant;
+import com.yingtang.devicemanager.R;
+import com.yingtang.devicemanager.adapter.IpAddressAdapter;
+import com.yingtang.devicemanager.bean.IPPORT;
+import com.yingtang.devicemanager.bean.LoginDataBean;
+import com.yingtang.devicemanager.bean.Master;
+import com.yingtang.devicemanager.utils.CookieUtil;
+import com.yingtang.devicemanager.utils.DataSourceManager;
+import com.yingtang.devicemanager.utils.JsonTools;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by jsxiaoshui on 2021/7/15
+ */
+public class SettingActivity extends BaseActivity implements View.OnClickListener {
+    private static final Object TAG = "IndexSettingFragment";
+    public static final String KEY_URI = "key_uri";
+    private TextView userNameTv, mIpAddressTv, mAccountBookTv, mVersionTextView;
+    private LinearLayout settingCompanyNameLl;
+    private LinearLayout settingCheckUpdateLl;
+    private LinearLayout settingAboutUsLl;
+    private LinearLayout settingExitCurrentAccountLl;
+
+    private String mUserCache;
+    private String mUserName;
+    private String mPassword;
+    private String mAccountName;
+
+    private PopupWindow mAccountBookPop, mIpAddressPop;
+    private Fragment mFragment;
+    private ArrayAdapter<String> otherAccountAdapter;
+    private IpAddressAdapter mIpAddressAdapter;
+    private List<String> allFunname, allName;
+    private List<LoginDataBean> mLoginDataBeans;
+
+    private RequestQueue mRequestQueue;
+    private JsonRequest mJsonRequest;
+
+    private String cacheUri;
+    private String mIp, mPort;
+    private int mLoginPosition;
+    private boolean isSwitchComplete = true;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_new_setting);
+        setTitle(R.string.setting);
+        getUserName();
+        mAccountName = CommonUtil.getSharedPreferencesString(SettingActivity.this, Constant.ERP_MASTER_ZH, null);
+        userNameTv = (TextView) findViewById(R.id.user_name_tv);
+        settingCheckUpdateLl = (LinearLayout) findViewById(R.id.setting_check_update_ll);
+        settingAboutUsLl = (LinearLayout) findViewById(R.id.setting_about_us_ll);
+        settingExitCurrentAccountLl = (LinearLayout) findViewById(R.id.setting_exit_current_account_ll);
+        mIpAddressTv = (TextView) findViewById(R.id.setting_ip_address_name_tv);
+        mAccountBookTv = findViewById(R.id.setting_account_name_tv);
+        mVersionTextView = findViewById(R.id.setting_current_version);
+
+        //init data
+        userNameTv.setText(mUserName);
+        mAccountBookTv.setText(mAccountName);
+        mIpAddressTv.setText(mAccountName + "(" + mIp + ")");
+        mVersionTextView.setText("V"+CommonUtil.ApkVersionCode(this));
+        //切换账套,地址
+        findViewById(R.id.setting_account_book_rl).setOnClickListener(this);
+        findViewById(R.id.setting_ip_address_rl).setOnClickListener(this);
+        //当前版本,关于我们,退出账号
+        settingCheckUpdateLl.setOnClickListener(this);
+        settingAboutUsLl.setOnClickListener(this);
+        settingExitCurrentAccountLl.setOnClickListener(this);
+
+
+    }
+
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()) {
+            case R.id.setting_account_book_rl:
+                changeAccountBook();
+                break;
+            case R.id.setting_ip_address_rl:
+                changeIpAddress();
+                break;
+            case R.id.setting_check_update_ll:
+                showToast("当前版本:V"+CommonUtil.ApkVersionCode(this));
+                break;
+            case R.id.setting_about_us_ll:
+                Intent intent=new Intent(this, CommonWebviewActivity.class);
+                intent.putExtra("scan_url","https://www.ubtob.net/about");
+                intent.putExtra("title","关于我们");
+                startActivity(intent);
+                break;
+            case R.id.setting_exit_current_account_ll:
+                new AlertDialog.Builder(this).setTitle("提示").setMessage("确定要退出当前账号吗?")
+                        .setPositiveButton(getString(R.string.confirm), new DialogInterface.OnClickListener() {
+                            @Override
+                            public void onClick(DialogInterface dialog, int which) {
+                                progressDialog.show();
+                                //VolleyUtil.setVolleyHandler(mHandler);
+                                //VolleyUtil.getVolleyUtil().requestConnectServer(getActivity(), GloableParams.ADDRESS_LOGOUT_APPLY, VolleyUtil.METHOD_GET, VolleyUtil.FRAGMENT_LOGOUT);
+                                showToast("正在退出中...");
+                                Map<String ,String> headMap= CookieUtil.getHeadersMap(SettingActivity.this);
+                                HttpRequest.getInstance().sendRequest(CommonUtil.getAppBaseUrl(SettingActivity.this),
+                                        new HttpParams.Builder()
+                                                .url("api/pda/logout.action")
+                                                .connectTimeOut(5)
+                                                .readTimeOut(5)
+                                                .method(Method.GET)
+                                                .addHeader(Constant.HEAD_MASTER,headMap.get(Constant.HEAD_MASTER))
+                                                .addHeader(Constant.HEAD_USER_NAME,headMap.get(Constant.HEAD_USER_NAME))
+                                                .addHeader(Constant.HEAD_PWD,headMap.get(Constant.HEAD_PWD))
+                                                .addHeader(Constant.HEAD_COOKIE,headMap.get(Constant.HEAD_COOKIE))
+                                                .addHeader(Constant.HEAD_VERSION_CODE,headMap.get(Constant.HEAD_VERSION_CODE))
+                                                .build(), new HttpCallback() {
+                                            @Override
+                                            public void onSuccess(int flag, Object o) throws Exception {
+                                                progressDialog.dismiss();
+                                                com.alibaba.fastjson.JSONObject resultObject=JSON.parseObject(o.toString());
+                                                boolean success=JSONUtil.getBoolean(resultObject,"success");
+                                                if(success){
+                                                    DataSourceManager.getDataSourceManager().setMasterList(o.toString());
+                                                    Intent intent = new Intent();
+                                                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
+                                                    intent.setClass(SettingActivity.this, LoginActivity.class);
+                                                    intent.putExtra(Constant.KEY_URI_LOGIN_INFO,getIpAndPort());
+                                                    startActivity(intent);
+                                                }else{
+                                                    showToast("退出登录失败,请稍后重试!");
+                                                }
+                                            }
+
+                                            @Override
+                                            public void onFail(int flag, String failStr) throws Exception {
+                                                progressDialog.dismiss();
+                                            }
+                                        });
+
+
+
+                            }
+                        }).setNegativeButton(getString(R.string.cancel), null).create().show();
+
+                break;
+
+
+        }
+    }
+
+    /**
+     * 更换常用地址
+     */
+    private void changeIpAddress() {
+        View accountBookView = LayoutInflater.from(this).inflate(R.layout.popupwindow_ip_address_change, null);
+        ListView accountBookLv = (ListView) accountBookView.findViewById(R.id.ip_address_change_lv);
+        Button closeBtn = (Button) accountBookView.findViewById(R.id.ip_address_change_close_btn);
+        final String currentFunname = CommonUtil.getSharedPreferencesString(this, Constant.ERP_MASTER_ZH, null);
+        List<LoginDataBean> loginListCache = DataSourceManager.getLoginListCache(this);
+        mLoginDataBeans = new ArrayList<>();
+        if (loginListCache != null && mUserName != null) {
+            for (LoginDataBean loginDataBean : loginListCache) {
+                mLoginDataBeans.add(loginDataBean);
+            }
+        }
+        mIpAddressAdapter = new IpAddressAdapter(this, mLoginDataBeans);
+        mIpAddressAdapter.setCurrent(currentFunname, mIp);
+        accountBookLv.setAdapter(mIpAddressAdapter);
+        closeBtn.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                closeIpAddressPop();
+            }
+        });
+
+        accountBookLv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                LoginDataBean loginDataBean = mLoginDataBeans.get(position);
+                if (currentFunname != null && currentFunname.equals(loginDataBean.getMasterName())
+                        && mIp != null && mIp.equals(loginDataBean.getIp())) {
+                    return;
+                }
+                if (isSwitchComplete) {
+                    isSwitchComplete = false;
+                    mLoginPosition = position;
+                    switchLoginAccount(loginDataBean);
+                } else {
+                   showToast("地址正在切换中,请勿操作!");
+                }
+            }
+        });
+
+        if (mLoginDataBeans.size() == 0) {
+            showToast("您没有其他常用地址");
+        } else {
+            mIpAddressPop = new PopupWindow(accountBookView, LinearLayout.LayoutParams.WRAP_CONTENT,
+                    LinearLayout.LayoutParams.WRAP_CONTENT, true);
+            mIpAddressPop.setAnimationStyle(R.style.MenuAnimationFade);
+            mIpAddressPop.setBackgroundDrawable(new BitmapDrawable());
+            mIpAddressPop.showAtLocation(mIpAddressTv, Gravity.CENTER, 0, 0);
+            CommonUtil.setBackgroundAlpha(this, 0.5f);
+
+            mIpAddressPop.setOnDismissListener(new PopupWindow.OnDismissListener() {
+                @Override
+                public void onDismiss() {
+                    closeIpAddressPop();
+                }
+            });
+        }
+
+    }
+    private void closeIpAddressPop() {
+        if (mIpAddressPop != null) {
+            mIpAddressPop.dismiss();
+            mIpAddressPop = null;
+            CommonUtil.setBackgroundAlpha(this, 1f);
+        }
+    }
+    /**
+     * 切换登录账号
+     *
+     */
+    private void switchLoginAccount(LoginDataBean loginDataBean) {
+        progressDialog.show();
+        String httpUrl = loginDataBean.getHttp()+"://"+loginDataBean.getIp()+":"+loginDataBean.getPort()+"/"+loginDataBean.getSite()+"/";
+        Map<String ,String> headMap= CookieUtil.getHeadersMap(SettingActivity.this);
+        HttpRequest.getInstance().sendRequest(httpUrl,
+                new HttpParams.Builder()
+                        .url("api/pda/loginGetMasters.action")
+                        .connectTimeOut(5)
+                        .readTimeOut(5)
+                        .method(Method.POST)
+                        .addParam(Constant.HEAD_MASTER,loginDataBean.getMaster())
+                        .addParam(Constant.HEAD_USER_NAME,mUserName)
+                        .addParam(Constant.HEAD_PWD,mPassword)
+                        .addParam(Constant.HEAD_VERSION_CODE,headMap.get(Constant.HEAD_VERSION_CODE))
+                        .build(), new HttpCallback() {
+                    @Override
+                    public void onSuccess(int flag, Object o) throws Exception {
+                        isSwitchComplete = true;
+                        String result = o.toString();
+                        com.alibaba.fastjson.JSONObject resultObject = JSON.parseObject(result);
+                        boolean success=JSONUtil.getBoolean(resultObject,"success");
+                        if(success){
+                            showToast("地址切换成功");
+                            LoginDataBean loginDataBean = mLoginDataBeans.get(mLoginPosition);
+                            mAccountBookTv.setText(loginDataBean.getMasterName());
+                            mIpAddressTv.setText(loginDataBean.getMasterName() + "(" + loginDataBean.getIp() + ")");
+                            mIp = loginDataBean.getIp();
+                            mPort = loginDataBean.getPort();
+                            String cacheUri = DataSourceManager.getDataSourceManager().addUriItem(loginDataBean.getIp(), loginDataBean.getPort());
+                            CommonUtil.setSharedPreferences(SettingActivity.this,Constant.ERP_MASTER,loginDataBean.getMaster());
+                            CommonUtil.setSharedPreferences(SettingActivity.this,Constant.ERP_MASTER_ZH,loginDataBean.getMasterName());
+                            CommonUtil.setSharedPreferences(SettingActivity.this,Constant.HTTP_CACHE,loginDataBean.getHttp());
+                            CommonUtil.setSharedPreferences(SettingActivity.this,Constant.SYSTEM_CACHE,loginDataBean.getSite());
+                            CommonUtil.setSharedPreferences(SettingActivity.this,Constant.KEY_URI,cacheUri);
+                            //保存当前切换的地址
+                            CommonUtil.setSharedPreferences(SettingActivity.this,Constant.ERP_BASEURL,httpUrl);
+
+                        }else{
+                            String reason=JSONUtil.getText(resultObject,"reason");
+                            if(TextUtils.isEmpty(reason)){
+                                showToast("切换登录失败");
+                            }else{
+                                showToast("切换登录失败:"+reason);
+                            }
+                        }
+                        closeIpAddressPop();
+                        progressDialog.dismiss();
+                    }
+
+                    @Override
+                    public void onFail(int flag, String failStr) throws Exception {
+                        isSwitchComplete = true;
+                        showToast("切换登录失败");
+                        closeIpAddressPop();
+                        progressDialog.dismiss();
+                    }
+                });
+    }
+
+
+
+    /**
+     * 更换账套
+     */
+    private void changeAccountBook() {
+        View accountBookView = LayoutInflater.from(this).inflate(R.layout.popupwindow_account_book_change, null);
+        ListView accountBookLv = (ListView) accountBookView.findViewById(R.id.account_book_change_lv);
+        Button closeBtn = (Button) accountBookView.findViewById(R.id.account_book_change_close_btn);
+        String currentFunname = CommonUtil.getSharedPreferencesString(this, Constant.ERP_MASTER_ZH, null);
+        String currentName = CommonUtil.getSharedPreferencesString(this, Constant.ERP_MASTER, null);
+
+        List<String> masterFuncList = DataSourceManager.getDataSourceManager().getMasterFuncList();
+        allFunname = new ArrayList<>();
+        if (masterFuncList != null) {
+            for (int i = 0; i < masterFuncList.size(); i++) {
+                allFunname.add(masterFuncList.get(i));
+            }
+        }
+        allName = new ArrayList<>();
+        List<Master> masterList = DataSourceManager.getDataSourceManager().getMasterList();
+        if (masterList != null) {
+            for (int i = 0; i < masterList.size(); i++) {
+                allName.add(masterList.get(i).getMaName());
+            }
+        }
+
+        //移除当前账套
+        allFunname.remove(currentFunname);
+        allName.remove(currentName);
+
+        otherAccountAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, allFunname);
+        accountBookLv.setAdapter(otherAccountAdapter);
+
+        closeBtn.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                closeAccountBookPop();
+            }
+        });
+
+        accountBookLv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                changeMasterItemClick(position);
+            }
+        });
+
+        if (allFunname.size() == 0) {
+            showToast("您没有其他账套");
+        } else {
+            mAccountBookPop = new PopupWindow(accountBookView, LinearLayout.LayoutParams.WRAP_CONTENT,
+                    LinearLayout.LayoutParams.WRAP_CONTENT, true);
+            mAccountBookPop.setAnimationStyle(R.style.MenuAnimationFade);
+            mAccountBookPop.setBackgroundDrawable(new BitmapDrawable());
+            mAccountBookPop.showAtLocation(mAccountBookTv, Gravity.CENTER, 0, 0);
+            CommonUtil.setBackgroundAlpha(this, 0.5f);
+
+            mAccountBookPop.setOnDismissListener(new PopupWindow.OnDismissListener() {
+                @Override
+                public void onDismiss() {
+                    closeAccountBookPop();
+                }
+            });
+        }
+
+    }
+
+    private void closeAccountBookPop() {
+        if (mAccountBookPop != null) {
+            mAccountBookPop.dismiss();
+            mAccountBookPop = null;
+            CommonUtil.setBackgroundAlpha(this, 1f);
+        }
+    }
+
+    /**
+     * 账套切换提交事件
+     *
+     * @param position
+     */
+    private void changeMasterItemClick(int position) {
+        progressDialog.show();
+        Map<String ,String> headMap= CookieUtil.getHeadersMap(SettingActivity.this);
+        HttpRequest.getInstance().sendRequest(CommonUtil.getAppBaseUrl(this),
+                new HttpParams.Builder()
+                        .url("api/pda/changeMaster.action?master=" + allName.get(position))
+                        .connectTimeOut(5)
+                        .readTimeOut(5)
+                        .method(Method.GET)
+                        .addHeader(Constant.HEAD_COOKIE,headMap.get(Constant.HEAD_COOKIE))
+                        .addHeader(Constant.HEAD_MASTER,headMap.get(Constant.HEAD_MASTER))
+                        .addHeader(Constant.HEAD_USER_NAME,headMap.get(Constant.HEAD_USER_NAME))
+                        .addHeader(Constant.HEAD_PWD,headMap.get(Constant.HEAD_PWD))
+                        .addHeader(Constant.HEAD_VERSION_CODE,headMap.get(Constant.HEAD_VERSION_CODE))
+                        .build(), new HttpCallback() {
+                    @Override
+                    public void onSuccess(int flag, Object o) throws Exception {
+                        progressDialog.dismiss();
+                        String result = o.toString();
+                        com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(result);
+                        if (jsonObject != null) {
+                            if (JSONUtil.getBoolean(jsonObject, "success")) {
+                                com.alibaba.fastjson.JSONObject dataObject = JSONUtil.getJSONObject(jsonObject, "data");
+                                try {
+                                    String ma_function = dataObject.getString("ma_function");
+                                    String em_master = dataObject.getString("em_master");
+                                    if (!TextUtils.isEmpty(em_master) && !TextUtils.isEmpty(em_master)) {
+                                        CommonUtil.setSharedPreferences(SettingActivity.this, Constant.ERP_MASTER_ZH, ma_function);
+                                        CommonUtil.setSharedPreferences(SettingActivity.this, Constant.ERP_MASTER, em_master);
+                                        showToast("账套切换成功");
+                                        closeAccountBookPop();
+                                        mAccountBookTv.setText(ma_function);
+                                    } else {
+                                        showToast("账套切换失败");
+                                    }
+                                } catch (Exception e) {
+                                    e.printStackTrace();
+                                    closeAccountBookPop();
+                                    showToast("账套切换失败");
+                                }
+                            }
+
+                        }
+
+                    }
+
+                    @Override
+                    public void onFail(int flag, String failStr) throws Exception {
+                        progressDialog.dismiss();
+                        showToast("账套切换失败");
+                    }
+                });
+
+    }
+
+
+    /**
+     * 获取缓存中的用户名
+     */
+    private void getUserName() {
+        String str = CommonUtil.getSharedPreferencesString(this, Constant.KEY_URI, null);
+        IPPORT ip = JsonTools.parseJsonToBean(str, IPPORT.class);
+        mIp = ip.uriArray.get(0).ip;
+        mPort = ip.uriArray.get(0).port;
+        mUserCache = CommonUtil.getSharedPreferencesString(this, mIp + ":" + mPort, null);
+        try {
+            JSONObject userCacheJsonObject = new JSONObject(mUserCache);
+            JSONArray userCacheArray = userCacheJsonObject.getJSONArray(DataSourceManager.KEY_INFOARRAY);
+            JSONObject userCacheObject = (JSONObject) userCacheArray.get(0);
+            mUserName = userCacheObject.getString(DataSourceManager.KEY_USERNAME);
+            mPassword = userCacheObject.getString(DataSourceManager.KEY_PASSWORD);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+    }
+    public String getIpAndPort(){
+        cacheUri = CommonUtil.getSharedPreferencesString(this, Constant.KEY_URI, null);
+        //当缓存不为空
+        if (cacheUri != null) {
+            //将缓存数据加载到数据源UriList
+            DataSourceManager.getDataSourceManager().setUriList(cacheUri);
+            List<Map<String, String>> list = DataSourceManager.getDataSourceManager().getUriList();
+            mIp = list.get(0).get(DataSourceManager.KEY_IP);
+            mPort = list.get(0).get(DataSourceManager.KEY_PORT);
+        }
+        return mIp+":"+mPort;
+    }
+
+
+}

+ 148 - 0
devicemanager/src/main/java/com/yingtang/devicemanager/ui/SplashActivity.java

@@ -0,0 +1,148 @@
+package com.yingtang.devicemanager.ui;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.TextView;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.common.data.JSONUtil;
+import com.core.base.BaseActivity;
+import com.core.utils.CommonUtil;
+import com.core.utils.StatusBarUtil;
+import com.me.network.app.base.HttpCallback;
+import com.me.network.app.base.HttpParams;
+import com.me.network.app.http.HttpRequest;
+import com.me.network.app.http.Method;
+import com.uas.appworks.CRM.erp.activity.DeviceManageActivity;
+import com.yingtang.devicemanager.Constant;
+import com.yingtang.devicemanager.R;
+import com.yingtang.devicemanager.utils.DataSourceManager;
+
+import java.util.List;
+import java.util.Map;
+
+
+public class SplashActivity extends BaseActivity implements View.OnClickListener {
+    TextView tv_go;
+    private long startLoginTime;
+    private long internalTime;
+    private String cacheUri,mIp,mPort;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_splash);
+        getSupportActionBar().hide();
+        StatusBarUtil.immersive(this, 0x00000000, 0.0f);
+        tv_go=findViewById(R.id.tv_go);
+        tv_go.setOnClickListener(this);
+        setDefaultUrl();
+        checkConnect();
+    }
+
+    private void checkConnect() {
+        startLoginTime=System.currentTimeMillis();
+        String baseUrl=CommonUtil.getAppBaseUrl(this);
+        if(!TextUtils.isEmpty(baseUrl)){
+            HttpRequest.getInstance().sendRequest(CommonUtil.getAppBaseUrl(this),
+                    new HttpParams.Builder()
+                            .url("api/pda/getAllMasters.action")
+                            .connectTimeOut(5)
+                            .readTimeOut(5)
+                            .method(Method.POST)
+                            .build(), new HttpCallback() {
+                        @Override
+                        public void onSuccess(int flag, Object o) throws Exception {
+                            internalTime=System.currentTimeMillis()-startLoginTime;
+                            String result = o.toString();
+                            JSONObject resultObject = JSON.parseObject(result);
+                            boolean success = JSONUtil.getBoolean(resultObject, "success");
+                            if(success){
+                                DataSourceManager.getDataSourceManager().setMasterList(result);
+                                if(internalTime>=1500){
+                                    goLoginActivity();
+                                }else{
+                                    new Handler().postDelayed(new Runnable() {
+                                        @Override
+                                        public void run() {
+                                            goLoginActivity();
+                                        }
+                                    },1500-internalTime);
+                                }
+
+                            }else{
+                                goConnectServerActivity();
+                            }
+                        }
+
+                        @Override
+                        public void onFail(int flag, String failStr) throws Exception {
+                              goConnectServerActivity();
+                        }
+                    });
+
+        }else{
+            new Handler().postDelayed(new Runnable() {
+                @Override
+                public void run() {
+                    goConnectServerActivity();
+                }
+            },1500);
+
+        }
+
+    }
+
+    private void goLoginActivity() {
+        cacheUri = CommonUtil.getSharedPreferencesString(this, Constant.KEY_URI, null);
+        //当缓存不为空
+        if (cacheUri != null) {
+            //将缓存数据加载到数据源UriList
+            DataSourceManager.getDataSourceManager().setUriList(cacheUri);
+            List<Map<String, String>> list = DataSourceManager.getDataSourceManager().getUriList();
+            mIp = list.get(0).get(DataSourceManager.KEY_IP);
+            mPort = list.get(0).get(DataSourceManager.KEY_PORT);
+        }
+        if(!TextUtils.isEmpty(mIp)&&!TextUtils.isEmpty(mPort)){
+            Intent intent = new Intent();
+            intent.setClass(SplashActivity.this, LoginActivity.class);
+            intent.putExtra(Constant.KEY_URI_LOGIN_INFO,mIp+":"+mPort);
+            startActivity(intent);
+            finish();
+        }else{
+            goConnectServerActivity();
+        }
+
+    }
+
+    private void goConnectServerActivity() {
+        Intent intent = new Intent();
+        intent.setClass(SplashActivity.this, ConnectServerActivity.class);
+        startActivity(intent);
+        finish();
+    }
+
+    private void setDefaultUrl() {
+      //  CommonUtil.setSharedPreferences(ct, "erp_login", true);
+     //   CommonUtil.setSharedPreferences(ct, "erp_baseurl", "http://cmityj.gicp.net:8099/ERP/");
+//        CommonUtil.setSharedPreferences(ct, "sessionId", "BC028BE4AE77CB7D6E5ED13D3CFF746E");
+//        CommonUtil.setSharedPreferences(ct, "erp_username", "YJ268");
+//        CommonUtil.setSharedPreferences(ct, "erp_master", "HC_TEST");
+    }
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()){
+            case R.id.tv_go:
+                startActivity(new Intent(SplashActivity.this, DeviceManageActivity.class));
+                break;
+        }
+
+    }
+
+
+}

+ 66 - 0
devicemanager/src/main/java/com/yingtang/devicemanager/utils/CookieUtil.java

@@ -0,0 +1,66 @@
+package com.yingtang.devicemanager.utils;
+
+import android.content.Context;
+
+import com.core.utils.CommonUtil;
+import com.yingtang.devicemanager.Constant;
+import com.yingtang.devicemanager.bean.IPPORT;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by jsxiaoshui on 2021/7/16
+ */
+public  class CookieUtil {
+
+    //request携带cookies
+    public  static Map<String, String> getHeadersMap(Context context) {
+        Map<String, String> paramHead = new HashMap<>();
+        String username = null;
+        String password = null;
+        String currentMaster = CommonUtil.getSharedPreferencesString(context, Constant.ERP_MASTER,null);
+        try {
+            String str = CommonUtil.getSharedPreferencesString(context,Constant.KEY_URI,null);
+            if (str != null) {
+                IPPORT ip = JsonTools.parseJsonToBean(str, IPPORT.class);
+                String ipStr = ip.uriArray.get(0).ip;
+                String portStr = ip.uriArray.get(0).port;
+                String mUserCache =CommonUtil.getSharedPreferencesString(context,ipStr + ":" + portStr, null);
+                if (mUserCache != null) {
+                    JSONObject userCacheJsonObject = new JSONObject(mUserCache);
+                    JSONArray userCacheArray = userCacheJsonObject.getJSONArray(DataSourceManager.KEY_INFOARRAY);
+                    JSONObject userCacheObject = (JSONObject) userCacheArray.get(0);
+                    username = userCacheObject.getString(DataSourceManager.KEY_USERNAME);
+                    password = userCacheObject.getString(DataSourceManager.KEY_PASSWORD);
+                }
+            }
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        String cookieCache = CommonUtil.getSharedPreferencesString(context,Constant.SESSIONID,"");
+        StringBuffer cookieHeader;
+        if (cookieCache != null) {
+            cookieHeader = new StringBuffer("JSESSIONID="+cookieCache+";");
+        } else {
+            cookieHeader = new StringBuffer();
+        }
+        if (username != null && password != null && currentMaster != null) {
+            cookieHeader.append("j_username=" + username + ";j_password=" + password + ";master=" + currentMaster);
+            paramHead.put("j_username", username);
+            paramHead.put("j_password", password);
+            paramHead.put("master", currentMaster);
+        }
+        if (cookieHeader != null) {
+            paramHead.put("Cookie", cookieHeader.toString());
+        } else {
+            paramHead.put("Cookie", "");
+        }
+        paramHead.put("versioncode", CommonUtil.ApkVersionCode(context));
+        return paramHead;
+    }
+}

+ 219 - 0
devicemanager/src/main/java/com/yingtang/devicemanager/utils/DataSourceManager.java

@@ -0,0 +1,219 @@
+package com.yingtang.devicemanager.utils;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.os.Build;
+import android.text.TextUtils;
+
+import com.alibaba.fastjson.JSON;
+import com.core.utils.CommonUtil;
+import com.yingtang.devicemanager.Constant;
+import com.yingtang.devicemanager.bean.LoginDataBean;
+import com.yingtang.devicemanager.bean.Master;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @注释:数据源管理者类,单例模式
+ */
+public class DataSourceManager {
+    private static  DataSourceManager manager;
+    private ArrayList<Master> masterList;
+    private ArrayList<String> masterFuncList;
+
+    /*=======================================URI缓存=======================================*/
+    //Uri缓存
+    public static final String KEY_IP = "ip";
+    public static final String KEY_PORT = "port";
+    public static final String KEY_URIARRAY = "uriArray";
+    private List<Map<String, String>> uriList;
+    private List<String> uriIpList;
+    JSONArray uriJsonArray;
+
+    private DataSourceManager() {
+    }
+    public static DataSourceManager getDataSourceManager() {
+        if (manager == null) {
+            manager = new DataSourceManager();
+        }
+        return manager;
+    }
+
+    public void setMasterList(String masterListJson) {
+
+        masterList = new ArrayList<Master>();
+        JSONObject rootMaster = null;
+        try {
+            rootMaster = new JSONObject(masterListJson);
+            JSONArray masterJsonArray = rootMaster.getJSONArray("masters");
+            for (int i = 0; i < masterJsonArray.length(); i++) {
+                JSONObject masterJson = masterJsonArray.getJSONObject(i);
+                String maId = masterJson.getString("ma_id");
+                String maName = masterJson.getString("ma_name");
+                String maFunction = masterJson.getString("ma_function");
+                Master masterTmp = new Master(maId, maName, maFunction);
+                masterList.add(masterTmp);
+            }
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        //每次masterList更新后,同步更新masterFuncList
+        setMasterFuncList();
+    }
+    private void setMasterFuncList() {
+        masterFuncList = new ArrayList<String>();
+        if (masterList != null) {
+            for (int i = 0; i < masterList.size(); i++) {
+                masterFuncList.add(masterList.get(i).getMaFunction());
+            }
+        }
+    }
+    public ArrayList<Master> getMasterList() {
+        return masterList;
+    }
+
+    public ArrayList<String> getMasterFuncList() {
+        return masterFuncList;
+    }
+
+
+
+
+
+
+    //添加一个Uri记录到缓存Json数组
+    @TargetApi(Build.VERSION_CODES.KITKAT)
+    public String addUriItem(String ip, String port) {
+        JSONObject tmpJson = new JSONObject(), rootJson = new JSONObject();
+        try {
+            if (uriJsonArray == null) {
+                uriJsonArray = new JSONArray();
+            }
+
+            //将当前元素添加到第一个位置
+            tmpJson.put(KEY_IP, ip);
+            tmpJson.put(KEY_PORT, port);
+            uriJsonArray.put(0, tmpJson);
+            rootJson.put(KEY_URIARRAY, uriJsonArray);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        return rootJson.toString();
+    }
+
+    public void setUriList(String uriJsonString) {
+        uriList = new ArrayList<>();
+        try {
+            JSONObject rootJson = new JSONObject(uriJsonString);
+            uriJsonArray = rootJson.getJSONArray(KEY_URIARRAY);
+            for (int i = 0; i < uriJsonArray.length(); i++) {
+                JSONObject tmpJson = uriJsonArray.getJSONObject(i);
+                Map<String, String> map = new HashMap<String, String>();
+                map.put(KEY_IP, tmpJson.getString(KEY_IP));
+                map.put(KEY_PORT, tmpJson.getString(KEY_PORT));
+                uriList.add(map);
+            }
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        //Uri缓存更新,同步更新ipList
+        setUriIpList();
+    }
+
+    private void setUriIpList() {
+        uriIpList = new ArrayList<>();
+        for (int i = 0; i < uriList.size(); i++) {
+            uriIpList.add(uriList.get(i).get(KEY_IP));
+        }
+    }
+    public List<Map<String, String>> getUriList() {
+        return uriList;
+    }
+
+    public List<String> getUriIpList() {
+        return uriIpList;
+    }
+
+
+    /**
+     * 获取缓存中缓存的登录数据
+     */
+    public static List<LoginDataBean> getLoginListCache(Context context) {
+        String loginDataCache = CommonUtil.getSharedPreferencesString(context, Constant.LOGIN_DATA_LIST, null);
+
+        if (!TextUtils.isEmpty(loginDataCache)) {
+            try {
+                List<LoginDataBean> cacheLoginDataBeans = JSON.parseArray(loginDataCache, LoginDataBean.class);
+                return cacheLoginDataBeans;
+            } catch (Exception e) {
+                return null;
+            }
+        } else {
+            return null;
+        }
+    }
+
+
+    /*=======================================登录info=======================================*/
+
+    //登录info缓存
+    public static final String KEY_USERNAME = "key_username";
+    public static final String KEY_PASSWORD = "key_password";
+    public static final String KEY_INFOARRAY = "key_infoArray";
+    public static final String NO_PWD = "\\t";
+    private List<Map<String, String>> infoList;
+    JSONArray infoJsonArray;
+
+    /**
+     * @注释:配置登录info缓存的数据源
+     */
+    public void setInfoList(String infoJsonString) {
+        infoList = new ArrayList<>();
+        try {
+            JSONObject rootJson = new JSONObject(infoJsonString);
+            infoJsonArray = rootJson.getJSONArray(KEY_INFOARRAY);
+            for (int i = 0; i < infoJsonArray.length(); i++) {
+                JSONObject tmpJson = infoJsonArray.getJSONObject(i);
+                Map<String, String> map = new HashMap<String, String>();
+                map.put(KEY_USERNAME, tmpJson.getString(KEY_USERNAME));
+                map.put(KEY_PASSWORD, tmpJson.getString(KEY_PASSWORD));
+                infoList.add(map);
+            }
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public List getInfoList() {
+        return infoList;
+    }
+
+    //添加info缓存
+    public String addInfoItem(String pUsername, String pPwd) {
+        JSONObject tmpJson = new JSONObject(), rootJson = new JSONObject();
+        if (pPwd == null) {
+            pPwd = NO_PWD;
+        }
+        try {
+            if (infoJsonArray == null) {
+                infoJsonArray = new JSONArray();
+            }
+            tmpJson.put(KEY_USERNAME, pUsername);
+            tmpJson.put(KEY_PASSWORD, pPwd);
+            infoJsonArray.put(0, tmpJson);
+            rootJson.put(KEY_INFOARRAY, infoJsonArray);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        return rootJson.toString();
+    }
+
+
+}

+ 27 - 0
devicemanager/src/main/java/com/yingtang/devicemanager/utils/JsonTools.java

@@ -0,0 +1,27 @@
+package com.yingtang.devicemanager.utils;
+
+import com.google.gson.Gson;
+
+/**
+ *  @author zps 2016/3/4
+ */
+public class JsonTools {
+
+    /**
+     * 把一个json字符串变成对象
+     * @param json
+     * @param cls
+     * @return
+     */
+    public static <T> T parseJsonToBean(String json, Class<T> cls) {
+        Gson gson = new Gson();
+        T t = null;
+        try {
+            t = gson.fromJson(json, cls);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return t;
+    }
+
+}

+ 32 - 0
devicemanager/src/main/java/com/yingtang/devicemanager/utils/RegexUtil.java

@@ -0,0 +1,32 @@
+package com.yingtang.devicemanager.utils;
+
+/**
+ * @注释:字符串匹配工具类
+ */
+public class RegexUtil {
+
+    private static RegexUtil regexUtil = null;
+
+    //正则表达式
+//    public static String IP_FORMAT = "((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)";
+    public static String IP_FORMAT = "^((25[0-5])|(2[0-4]\\d)|(1\\d\\d)|([1-9]\\d)|\\d)(\\.((25[0-5])|(2[0-4]\\d)|(1\\d\\d)|([1-9]\\d)|\\d)){3}$|^([a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,6}$";
+    public static String PORT_FORMAT = "^[1-9]$|(^[1-9][0-9]$)|(^[1-9][0-9][0-9]$)|(^[1-9][0-9][0-9][0-9]$)|(^[1-6][0-5][0-5][0-3][0-5]$)";
+    // public static String PORT_FORMAT = "(\\d)+";
+
+    public static boolean checkString(String str, String regx) {
+        if (regexUtil == null) {
+            regexUtil = new RegexUtil();
+        }
+
+        boolean right = false;
+        if (str.matches(regx)) {
+            right = true;
+        }
+        return right;
+    }
+
+
+    private RegexUtil() {
+    }
+
+}

+ 226 - 0
devicemanager/src/main/java/com/yingtang/devicemanager/widget/ClearableEditText.java

@@ -0,0 +1,226 @@
+package com.yingtang.devicemanager.widget;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.support.v4.content.ContextCompat;
+import android.support.v4.graphics.drawable.DrawableCompat;
+import android.support.v7.widget.AppCompatEditText;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+
+import com.yingtang.devicemanager.R;
+
+
+/**
+ * @注释:输入框右边的清除按钮
+ */
+public class ClearableEditText extends AppCompatEditText implements View.OnTouchListener, View.OnFocusChangeListener, TextWatcher {
+
+    private Drawable mClearTextIcon;
+    private OnFocusChangeListener mOnFocusChangeListener;
+    private OnTouchListener mOnTouchListener;
+    Context context;
+
+    public ClearableEditText(Context context) {
+        super(context);
+        init(context);
+    }
+
+    public ClearableEditText(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init(context);
+    }
+
+    public ClearableEditText(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        init(context);
+    }
+
+    private void init(Context pContext){
+        context = pContext;
+        //封装drawable对象,系统默认图标:R.drawable.abc_ic_clear_mtrl_alpha
+        Drawable drawable = ContextCompat.getDrawable(context, R.drawable.wrong );
+        Drawable wrappedDrawable = DrawableCompat.wrap(drawable);
+        //简单着色
+        DrawableCompat.setTint(wrappedDrawable, getCurrentHintTextColor());
+
+        mClearTextIcon = wrappedDrawable;
+        //设置宽高
+        mClearTextIcon.setBounds(0, 0, mClearTextIcon.getIntrinsicHeight(), mClearTextIcon.getIntrinsicWidth());
+
+        setClearIconVisible(false);
+
+        super.setOnTouchListener(this);
+        super.setOnFocusChangeListener(this);
+        addTextChangedListener(this);
+//        setClearIconVisible(true);
+    }
+
+    private void setClearIconVisible(final boolean visible) {
+        mClearTextIcon.setVisible(visible, false);
+        final Drawable[] compoundDrawables = getCompoundDrawables();
+        //在edittext右侧设置图标
+        setCompoundDrawables(
+                compoundDrawables[0],
+                compoundDrawables[1],
+                visible ? mClearTextIcon : null,
+                compoundDrawables[3]);
+    }
+
+    //设置警告标志可见
+    public void setWarnIconVisible(){
+        Drawable warnDrawable = ContextCompat.getDrawable(context, R.drawable.warn);
+        Drawable wrapWarnDrawable = DrawableCompat.wrap(warnDrawable);
+        warnDrawable = wrapWarnDrawable;
+        int f = context.getResources().getDimensionPixelSize(R.dimen.hint_pic);
+        warnDrawable.setBounds(0, 0, f, f);
+
+        final Drawable[] compoundDrawables = getCompoundDrawables();
+        mClearTextIcon.setBounds(0, 0, mClearTextIcon.getIntrinsicHeight(), mClearTextIcon.getIntrinsicWidth());
+
+        //在edittext右侧设置图标
+        setCompoundDrawables(
+                compoundDrawables[0],
+                compoundDrawables[1],
+                warnDrawable,
+                compoundDrawables[3]);
+
+    }
+    //设置警告标志可见
+    public void setSmallWarnIconVisible(){
+        Drawable warnDrawable = ContextCompat.getDrawable(context, R.drawable.warn);
+        Drawable wrapWarnDrawable = DrawableCompat.wrap(warnDrawable);
+        warnDrawable = wrapWarnDrawable;
+        int f = context.getResources().getDimensionPixelSize(R.dimen.hint_pic_small);
+        warnDrawable.setBounds(0, 0, f, f);
+
+        final Drawable[] compoundDrawables = getCompoundDrawables(); mClearTextIcon.setBounds(0, 0, mClearTextIcon.getIntrinsicHeight(), mClearTextIcon.getIntrinsicWidth());
+
+        //在edittext右侧设置图标
+        setCompoundDrawables(
+                compoundDrawables[0],
+                compoundDrawables[1],
+                warnDrawable,
+                compoundDrawables[3]);
+
+    }
+    private void dismissOkIcon(final boolean visible){
+        mClearTextIcon.setVisible(visible, false);
+        final Drawable[] compoundDrawables = getCompoundDrawables();
+        //在edittext右侧设置图标
+        setCompoundDrawables(
+                compoundDrawables[0],
+                compoundDrawables[1],
+                visible ? mClearTextIcon : null,
+                compoundDrawables[3]);
+    }
+
+    boolean isOk = false;
+    //设置成功标志可见
+    public void setOkIconVisible(){
+        isOk = true;
+        Drawable warnDrawable = ContextCompat.getDrawable(context, R.drawable.ok);
+        Drawable wrapWarnDrawable = DrawableCompat.wrap(warnDrawable);
+        warnDrawable = wrapWarnDrawable;
+        warnDrawable.setBounds(0, 0, 48, 48);
+
+        final Drawable[] compoundDrawables = getCompoundDrawables();
+        mClearTextIcon.setBounds(0, 0, mClearTextIcon.getIntrinsicHeight(), mClearTextIcon.getIntrinsicWidth());
+
+        //在edittext右侧设置图标
+        setCompoundDrawables(
+                compoundDrawables[0],
+                compoundDrawables[1],
+                warnDrawable,
+                compoundDrawables[3]);
+
+    }
+
+    @Override
+    public void onFocusChange(View v, boolean hasFocus) {
+        if (hasFocus) {
+            setClearIconVisible(getText().length() > 0);
+        }
+        else {
+            //如果不是正确图片,则焦点消失清空图片
+            if(!isOk){
+                setClearIconVisible(false);
+            }
+            //如果是正确图片,则焦点消失后图片也不消失,显示正确图片
+            else{
+                setOkIconVisible();
+            }
+        }
+        if (mOnFocusChangeListener != null) {
+            mOnFocusChangeListener.onFocusChange(v, hasFocus);
+        }
+    }
+
+
+    /**
+     * 输入框获取焦点*/
+    private void editTextGetFocus(){
+        setFocusable(true);
+        setFocusableInTouchMode(true);
+        requestFocus();
+    }
+    @Override
+    public boolean onTouch(View v, MotionEvent event) {
+        final int x = (int) event.getX();
+        if (mClearTextIcon.isVisible() && x > getWidth() - getPaddingRight() - mClearTextIcon.getIntrinsicWidth()) {
+            if (event.getAction() == MotionEvent.ACTION_UP) {
+                setError(null);
+                setText("");
+                //EditText本身获得焦点
+                editTextGetFocus();
+                //外界btn使EditText自动获取焦点
+                if(etFocus!=null){
+                    etFocus.setFoucus();
+                }
+            }
+            return true;
+        }
+        return mOnTouchListener != null && mOnTouchListener.onTouch(v, event);
+    }
+
+    EditTextFocus etFocus;
+    public interface EditTextFocus{
+        void setFoucus();
+    }
+
+    public void setEtFocus(EditTextFocus etFocus) {
+        this.etFocus = etFocus;
+    }
+
+    @Override
+    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+    }
+
+    @Override
+    public void afterTextChanged(Editable s) {
+
+    }
+    @Override
+    public final void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
+        //如果文字被修改,则OK消失
+        isOk = false;
+        if (isFocused()) {
+            setClearIconVisible(s.length() > 0);
+        }
+    }
+
+    @Override
+    public void setOnFocusChangeListener(final OnFocusChangeListener onFocusChangeListener) {
+        mOnFocusChangeListener = onFocusChangeListener;
+    }
+
+    @Override
+    public void setOnTouchListener(final OnTouchListener onTouchListener) {
+        mOnTouchListener = onTouchListener;
+    }
+}
+                                                                                                                                                                                                                                                                                                                                                                               

+ 11 - 0
devicemanager/src/main/res/anim/anim_spinner.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+    <translate
+        android:duration="300"
+        android:fromXDelta="0"
+        android:toXDelta="-100%p"/>
+    <alpha
+        android:duration="300"
+        android:fromAlpha="3"
+        android:toAlpha="6"/>
+</set>

+ 9 - 0
devicemanager/src/main/res/anim/notice_in.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--notice出现动画-->
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <alpha
+        android:fromAlpha="0"
+        android:toAlpha="1"
+        android:duration="300"/>
+</set>

+ 9 - 0
devicemanager/src/main/res/anim/notice_out.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--notice消失动画-->
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <alpha
+        android:fromAlpha="1"
+        android:toAlpha="0"
+        android:duration="300"/>
+</set>

+ 15 - 0
devicemanager/src/main/res/anim/popup_fade_in.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <alpha
+        android:duration="500"
+        android:fromAlpha="0.0"
+        android:toAlpha="1.0" />
+    <translate
+        android:duration="500"
+        android:fromXDelta="0"
+        android:fromYDelta="100%"
+        android:toXDelta="0"
+        android:toYDelta="0" />
+
+</set>

+ 16 - 0
devicemanager/src/main/res/anim/popup_fade_out.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <alpha
+        android:duration="500"
+        android:fromAlpha="1.0"
+        android:toAlpha="0.0" />
+
+    <translate
+        android:duration="500"
+        android:fromXDelta="0"
+        android:fromYDelta="0"
+        android:toXDelta="0"
+        android:toYDelta="100%" />
+
+</set>

+ 40 - 0
devicemanager/src/main/res/anim/progress_round.xml

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
+    android:oneshot="false" >
+    <item
+        android:drawable="@drawable/loading_01"
+        android:duration="30"/>
+    <item
+        android:drawable="@drawable/loading_02"
+        android:duration="30"/>
+    <item
+        android:drawable="@drawable/loading_03"
+        android:duration="30"/>
+    <item
+        android:drawable="@drawable/loading_04"
+        android:duration="30"/>
+    <item
+        android:drawable="@drawable/loading_05"
+        android:duration="30"/>
+    <item
+        android:drawable="@drawable/loading_06"
+        android:duration="30"/>
+    <item
+        android:drawable="@drawable/loading_07"
+        android:duration="30"/>
+    <item
+        android:drawable="@drawable/loading_08"
+        android:duration="30"/>
+    <item
+        android:drawable="@drawable/loading_09"
+        android:duration="30"/>
+    <item
+        android:drawable="@drawable/loading_10"
+        android:duration="30"/>
+    <item
+        android:drawable="@drawable/loading_11"
+        android:duration="30"/>
+    <item
+        android:drawable="@drawable/loading_12"
+        android:duration="30"/>
+</animation-list>

+ 11 - 0
devicemanager/src/main/res/anim/reverse.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rotate xmlns:android="http://schemas.android.com/apk/res/android"
+    android:duration="100"
+    android:fillAfter="true"
+    android:fromDegrees="0"
+    android:pivotX="50%"
+    android:pivotY="50%"
+    android:repeatCount="0"
+    android:toDegrees="180" >
+
+</rotate>

+ 11 - 0
devicemanager/src/main/res/anim/rotate.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rotate xmlns:android="http://schemas.android.com/apk/res/android"
+    android:duration="1500"
+    android:fillAfter="true"
+    android:fromDegrees="0"
+    android:pivotX="50%"
+    android:pivotY="50%"
+    android:repeatCount="-1"
+    android:toDegrees="360" >
+
+</rotate>

+ 7 - 0
devicemanager/src/main/res/color/selector_cancel_text_color.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="@color/white" android:state_selected="true"/>
+    <item android:color="@color/white" android:state_pressed="true"/>
+    <item android:color="@color/white" android:state_checked="true"/>
+    <item android:color="@color/titleBlue"/>
+</selector>

+ 7 - 0
devicemanager/src/main/res/color/selector_collect_type_bg.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="@color/blue1" android:state_selected="true"/>
+    <item android:color="@color/blue1" android:state_pressed="true"/>
+    <item android:color="@color/blue1" android:state_checked="true"/>
+    <item android:color="@color/white" />
+</selector>

+ 7 - 0
devicemanager/src/main/res/color/selector_collect_type_text.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="@color/white" android:state_selected="true"/>
+    <item android:color="@color/white" android:state_pressed="true"/>
+    <item android:color="@color/white" android:state_checked="true"/>
+    <item android:color="@color/black" />
+</selector>

BIN
devicemanager/src/main/res/drawable-hdpi/about_us.png


BIN
devicemanager/src/main/res/drawable-hdpi/actionbar_back.png


BIN
devicemanager/src/main/res/drawable-hdpi/app_splash_pic.png


BIN
devicemanager/src/main/res/drawable-hdpi/cleancollect_48.png


BIN
devicemanager/src/main/res/drawable-hdpi/close.png


BIN
devicemanager/src/main/res/drawable-hdpi/close_loading.png


BIN
devicemanager/src/main/res/drawable-hdpi/delete.png


BIN
devicemanager/src/main/res/drawable-hdpi/exchange.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_about_us.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_add_white_48dp.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_advanced_filter.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_calendar.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_default_head.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_delete.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_detail_page.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_early_warning.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_edittext_scan.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_empty.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_error.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_finish_out.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_finished_goods_storage.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_job_stock.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_jump_smt_query.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_material_out.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_material_storage.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_menu_head.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_menu_list.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_menu_retract.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_menu_spread.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_merge_batch.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_modify_quantity.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_next_details.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_print_barcode.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_random_check.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_realtime_monitor.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_scan_barcode.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_search_material.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_selected.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_selected_not.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_setting_default.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_setting_master.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_setting_printer.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_setting_sound.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_setting_style.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_setting_update.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_smt_feed.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_split_batch.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_stock_barcode.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_storage_finish_in.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_storage_in.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_storage_inspection.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_storage_iqc.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_storage_material_in.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_storage_out.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_storage_random_check.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_storage_recharge.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_submit.png


BIN
devicemanager/src/main/res/drawable-hdpi/ic_undo_split.png


BIN
devicemanager/src/main/res/drawable-hdpi/icon_search.png


BIN
devicemanager/src/main/res/drawable-hdpi/index_smt_change.png


BIN
devicemanager/src/main/res/drawable-hdpi/index_smt_check.png


BIN
devicemanager/src/main/res/drawable-hdpi/index_smt_down.png


BIN
devicemanager/src/main/res/drawable-hdpi/index_smt_downall.png


BIN
devicemanager/src/main/res/drawable-hdpi/index_smt_joint.png


BIN
devicemanager/src/main/res/drawable-hdpi/index_smt_machine.png


BIN
devicemanager/src/main/res/drawable-hdpi/index_smt_query.png


BIN
devicemanager/src/main/res/drawable-hdpi/index_smt_switch.png


Некоторые файлы не были показаны из-за большого количества измененных файлов