Procházet zdrojové kódy

更新升级(接口未联调),增加入库管理,修改了进站中输入框bug

Linlinxun před 3 roky
rodič
revize
d1bd340fc0

+ 5 - 0
app/src/main/java/com/uas/gdstorage/activity/FunctionActivity.java

@@ -28,6 +28,7 @@ import com.uas.gdstorage.fragment.QualityManageFragment;
 import com.uas.gdstorage.fragment.ReportDetailFragment;
 import com.uas.gdstorage.fragment.StepReceiveFragment;
 import com.uas.gdstorage.fragment.StepTransferFragment;
+import com.uas.gdstorage.fragment.StorageInFragment;
 import com.uas.gdstorage.fragment.WorkOrderSearchFragment;
 import com.uas.gdstorage.global.GloableParams;
 import com.uas.gdstorage.interfaces.BackHandlerInterface;
@@ -144,6 +145,10 @@ public class FunctionActivity extends BaseActivity implements View.OnClickListen
                 case GloableParams.GRIDNAME_SETTING:
                     mFragment = new IndexSettingFragment();
                     break;
+                case GloableParams.WAREHOUSINGMANAGEMENT:
+                    mFragment = new StorageInFragment();
+                    break;
+
             }
             //添加Fragment
             mbundle.putString(Constants.FLAG.SC_CODE, sc_code);

+ 15 - 2
app/src/main/java/com/uas/gdstorage/activity/HomeActivity.java

@@ -17,11 +17,13 @@ import android.widget.TextView;
 
 import com.uas.gdstorage.R;
 import com.uas.gdstorage.application.PdaApplication;
+import com.uas.gdstorage.fragment.BaseFragment;
 import com.uas.gdstorage.global.GloableParams;
 import com.uas.gdstorage.tools.DataSourceManager;
 import com.uas.gdstorage.tools.VolleyUtil;
 import com.uas.gdstorage.util.CommonUtil;
 import com.uas.gdstorage.util.PermissionUtil;
+import com.vincent.filepicker.ToastUtil;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -33,7 +35,7 @@ public class HomeActivity extends BaseActivity implements AdapterView.OnItemClic
     int pageType = VolleyUtil.ACTIVITY_MENU;
     private PopupWindow mExitPopupWindow;
     private TextView mCancelTextView, mMinimizeTextView, mExitTextView;
-
+    public BaseFragment fragment;
     @Override
     protected void onDestroy() {
         //清除全部App缓存
@@ -125,13 +127,24 @@ public class HomeActivity extends BaseActivity implements AdapterView.OnItemClic
     @Override
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
         String itemName = (String) gridItemList.get(position).get(DataSourceManager.KEY_GRID_ITEMNAME);
+        Intent intent = new Intent(HomeActivity.this, FunctionActivity.class);
         switch (itemName) {
+            case GloableParams.WAREHOUSINGMANAGEMENT://入库管理
+                intent.putExtra(DataSourceManager.KEY_GRID_ITEMNAME, itemName);
+                startActivity(intent);
+                break;
+            case GloableParams.OUTBOUNDMANAGEMENT://出库管理
+                ToastUtil.getInstance(this).showToast("出库管理-敬请期待");
+                break;
+            case GloableParams.WAREHOUSEMANAGEMENT://仓库管理
+                ToastUtil.getInstance(this).showToast("仓库管理-敬请期待");
+                break;
             case GloableParams.HOME_DISPATCH_MANAGE://工序管理
                 startActivity(new Intent(HomeActivity.this, IndexActivity.class));
                 break;
             case GloableParams.HOME_QUALITY_MANAGE://品质管理
             case GloableParams.GRIDNAME_SETTING://设置
-                Intent intent = new Intent(HomeActivity.this, FunctionActivity.class);
+
                 intent.putExtra(DataSourceManager.KEY_GRID_ITEMNAME, itemName);
                 startActivity(intent);
                 break;

+ 2 - 0
app/src/main/java/com/uas/gdstorage/fragment/ComeInSiteFragment.java

@@ -57,6 +57,8 @@ public class ComeInSiteFragment extends BaseFragment {
     }
     @Override
     protected void initEvents() {
+
+
         mScanImageView.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {

+ 5 - 0
app/src/main/java/com/uas/gdstorage/fragment/IndexSettingFragment.java

@@ -49,6 +49,7 @@ import com.uas.gdstorage.util.AndroidUtil;
 import com.uas.gdstorage.util.CommonUtil;
 import com.uas.gdstorage.util.Constants;
 import com.uas.gdstorage.util.FileUtils;
+import com.uas.gdstorage.util.FragmentUtils;
 import com.uas.gdstorage.util.JsonTools;
 import com.uas.gdstorage.util.LogUtil;
 
@@ -232,6 +233,7 @@ public class IndexSettingFragment extends BaseFragment implements View.OnClickLi
         mAccountBookTv = root.findViewById(R.id.setting_account_name_tv);
         mVersionTextView = root.findViewById(R.id.setting_current_version);
 
+        settingCheckUpdateLl.setOnClickListener(this);
         settingExitCurrentAccountLl.setOnClickListener(this);
         mRequestQueue = Volley.newRequestQueue(getActivity());
     }
@@ -457,6 +459,9 @@ public class IndexSettingFragment extends BaseFragment implements View.OnClickLi
             case R.id.setting_sound_rl:
                 mFragment = new SoundSettingFragment();
                 getFragmentManager().beginTransaction().addToBackStack(null).replace(R.id.container_function_fragment, mFragment).commit();
+            case R.id.setting_check_update_ll:
+                mFragment = new VersionUpgradeFragment();
+                FragmentUtils.switchFragment(this, mFragment);
                 break;
         }
     }

+ 263 - 0
app/src/main/java/com/uas/gdstorage/fragment/VersionUpgradeFragment.java

@@ -0,0 +1,263 @@
+package com.uas.gdstorage.fragment;
+
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Handler;
+import android.os.Message;
+import android.support.v4.content.FileProvider;
+import android.text.TextUtils;
+import android.view.KeyEvent;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.android.volley.Request;
+import com.android.volley.toolbox.StringRequest;
+import com.uas.gdstorage.R;
+import com.uas.gdstorage.global.GloableParams;
+import com.uas.gdstorage.util.AndroidUtil;
+import com.uas.gdstorage.util.CommonUtil;
+import com.uas.gdstorage.util.Constants;
+import com.uas.gdstorage.util.FastjsonUtil;
+import com.uas.gdstorage.util.FileUtils;
+import com.uas.gdstorage.util.HttpCallback;
+import com.uas.gdstorage.util.HttpParams;
+import com.uas.gdstorage.util.VollyRequest;
+import com.uas.gdstorage.util.down.CommonProgressPop;
+import com.uas.gdstorage.util.down.ProgressDownloader;
+import com.uas.gdstorage.util.down.ProgressResponseBody;
+
+import java.io.File;
+import java.io.IOException;
+
+import static com.uas.gdstorage.util.Constants.CONSTANT.APK_FILE_NAME;
+import static com.uas.gdstorage.util.Constants.CONSTANT.APK_FILE_PATH;
+
+
+/**
+ * Created by RaoMeng on 2020/4/9
+ * Desc: 版本升级页面
+ */
+public class VersionUpgradeFragment extends BaseFragment implements ProgressResponseBody.ProgressListener {
+    private TextView mOldVersionTv, mNewVersionTv, mMsgTextView;
+    private Button mUpgradeButton;
+    private CommonProgressPop mProgressPop;
+    private ProgressDownloader mDownloader;
+    private long breakPoints, contentLength, totalBytes;
+    private File file;
+    private String mAttachId;
+    private StringRequest mStringRequest;
+    @Override
+    protected int getLayout() {
+        return R.layout.fragment_version_upgrade;
+    }
+
+    @Override
+    protected void initViews() {
+        setTitle("版本升级");
+
+        mOldVersionTv = root.findViewById(R.id.version_upgrade_oldVersion_tv);
+        mNewVersionTv = root.findViewById(R.id.version_upgrade_newVersion_tv);
+        mMsgTextView = root.findViewById(R.id.version_upgrade_msg_tv);
+        mUpgradeButton = root.findViewById(R.id.version_upgrade_upgrade_btn);
+    }
+
+    @Override
+    protected void initEvents() {
+        mUpgradeButton.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (mProgressPop == null) {
+                    mProgressPop = new CommonProgressPop(mActivity, "正在下载新版本");
+                }
+                mProgressPop.showPopupWindow();
+
+                breakPoints = 0L;
+                File directory = new File(APK_FILE_PATH);
+                if (!directory.exists() && !directory.isDirectory()) {
+                    boolean mkdirs = directory.mkdirs();
+                } else {
+                    FileUtils.delAllFile(APK_FILE_PATH);
+                }
+                file = new File(APK_FILE_PATH, APK_FILE_NAME);
+                try {
+                    file.createNewFile();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+                String downloadUrl = GloableParams.ADDRESS_COMMON_DOWNLOADBYID + "?id=" + mAttachId;
+                mDownloader = new ProgressDownloader(downloadUrl, file, VersionUpgradeFragment.this);
+                mDownloader.download(0L);
+            }
+        });
+    }
+
+    @Override
+    protected void initDatas() {
+        mOldVersionTv.setText(AndroidUtil.getVersionName(mActivity));
+
+        getNewVersionMsg();
+    }
+
+    private void getNewVersionMsg() {
+        progressDialog.show();
+
+//        VolleyRequest.getInstance().stringRequest(new HttpParams.Builder()
+//                .url(GloableParams.ADDRESS_OUTMATERIAL_GETPDAVERSION)
+//                .method(Request.Method.GET)
+//                .addParam("code", "UAS_SMART")
+//                .build(), new HttpCallback() {
+//            @Override
+//            public void onSuccess(int flag, Object o) throws Exception {
+//                progressDialog.dismiss();
+//                String result = o.toString();
+//                JSONObject resultObject = JSON.parseObject(result);
+//                JSONObject dataObject = resultObject.getJSONObject("data");
+//                if (dataObject != null) {
+//                    mNewVersionTv.setText(FastjsonUtil.getText(dataObject, "pp_versionname"));
+//                    mMsgTextView.setText(FastjsonUtil.getText(dataObject, "pp_remark"));
+//
+//                    mAttachId = FastjsonUtil.getText(dataObject, "pp_attach");
+//                    if (!TextUtils.isEmpty(mAttachId)) {
+//                        mUpgradeButton.setVisibility(View.VISIBLE);
+//                    } else {
+//                        mUpgradeButton.setVisibility(View.VISIBLE);
+//                    }
+//                }
+//            }
+//
+//            @Override
+//            public void onFail(int flag, String failStr) throws Exception {
+//                progressDialog.dismiss();
+//                CommonUtil.toastNoRepeat(mActivity, failStr);
+//            }
+//        });
+
+        VollyRequest.getInstance().stringRequest(mStringRequest,
+                new HttpParams.Builder()
+                      .url(GloableParams.ADDRESS_OUTMATERIAL_GETPDAVERSION)
+                       // .url("http://usoft.f3322.net:11769/ERP/api/pda/outMaterial/getPdaVersion.action")
+                        .method(Request.Method.GET)
+                        .addParam("code", "UAS_SMART")
+                        .build(), new HttpCallback() {
+                    @Override
+                    public void onSuccess(int flag, Object o) throws Exception {
+                        progressDialog.dismiss();
+                        String result = o.toString();
+                        JSONObject resultObject = JSON.parseObject(result);
+                        JSONObject dataObject = resultObject.getJSONObject("data");
+                        if (dataObject != null) {
+                            mNewVersionTv.setText(FastjsonUtil.getText(dataObject, "pp_versionname"));
+                            mMsgTextView.setText(FastjsonUtil.getText(dataObject, "pp_remark"));
+
+                            mAttachId = FastjsonUtil.getText(dataObject, "pp_attach");
+                            if (!TextUtils.isEmpty(mAttachId)) {
+                                mUpgradeButton.setVisibility(View.VISIBLE);
+                            } else {
+                                mUpgradeButton.setVisibility(View.VISIBLE);
+                            }
+                        }
+                    }
+
+                    @Override
+                    public void onFail(int flag, String failStr) throws Exception {
+                        progressDialog.dismiss();
+                        CommonUtil.toastNoRepeat(mActivity, failStr);
+
+                    }
+
+                });
+
+
+
+
+
+    }
+
+    @Override
+    public void onPreExecute(long contentLength) {
+        // 文件总长只需记录一次,要注意断点续传后的contentLength只是剩余部分的长度
+        if (this.contentLength == 0L) {
+            this.contentLength = contentLength;
+            if (mProgressPop != null) {
+                mProgressPop.setProgressMax((int) (contentLength / 1024));
+            }
+        }
+    }
+
+    @Override
+    public void update(long totalBytes, boolean done) {
+        // 注意加上断点的长度
+        this.totalBytes = totalBytes + breakPoints;
+        int progress = (int) (totalBytes + breakPoints) / 1024;
+        Message message = Message.obtain();
+        message.what = Constants.CONSTANT.DOWNLOAD_PROGRESS;
+        message.obj = progress;
+        mHandler.sendMessage(message);
+        if (done) {
+            mHandler.sendEmptyMessage(Constants.CONSTANT.DOWNLOAD_SUCCESS);
+        }
+    }
+
+
+    private Handler mHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case Constants.CONSTANT.DOWNLOAD_PROGRESS:
+                    try {
+                        int progress = (int) msg.obj;
+                        mProgressPop.setProgress(progress);
+//                        long remain = 100 - (((progress * 1024 * 100) / contentLength));
+//                        if (remain < 0) {
+//                            remain = 0;
+//                        }
+                    } catch (Exception e) {
+
+                    }
+                    break;
+                case Constants.CONSTANT.DOWNLOAD_SUCCESS:
+                    CommonUtil.toastNoRepeat(mActivity, "下载完成");
+                    mProgressPop.dismiss();
+                    try {
+                        File apk = new File(APK_FILE_PATH, APK_FILE_NAME);
+                        Intent intent = new Intent(Intent.ACTION_VIEW);
+                        if (Build.VERSION.SDK_INT >= 24) {
+                            Uri apkUri = FileProvider.getUriForFile(mActivity,
+                                    "com.uas.pda_smart_sa.fileprovider", apk);
+                            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+                            intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
+                        } else {
+                            intent.setDataAndType(Uri.fromFile(apk), "application/vnd.android.package-archive");
+                            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                        }
+                        mActivity.startActivity(intent);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    break;
+                case Constants.CONSTANT.DOWNLOAD_FAILED:
+                    mProgressPop.dismiss();
+                    CommonUtil.makeNotice();
+                    CommonUtil.toastNoRepeat(mActivity, "下载失败");
+                    break;
+                default:
+                    break;
+            }
+        }
+    };
+
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        return false;
+    }
+
+    @Override
+    public boolean onFragmentBackPressed() {
+        return false;
+    }
+}

+ 20 - 4
app/src/main/java/com/uas/gdstorage/global/GloableParams.java

@@ -276,8 +276,10 @@ public class GloableParams {
     public static String ADDRESS_GET_MERGE_LOTNO;
     public static String ADDRESS_MERGE_LOTNO;
 
-
-
+    //下载附件
+    public static String ADDRESS_COMMON_DOWNLOADBYID;
+    //获取版本信息
+    public static String ADDRESS_OUTMATERIAL_GETPDAVERSION;
     /**
      * 高登
      */
@@ -773,7 +775,13 @@ public class GloableParams {
      * 工步接收
      */
     private static final String ADDRESSTAIL_WIPSTEPTURN_ACCEPT = "/api/pdashop/wipStepTurn/accept.action";
+    //下载附件
+    private static final String ADDRESSTAIL_COMMON_DOWNLOADBYID = "/common/downloadbyId.action";
 
+    //获取应用版本信息
+    private static final String ADDRESSTAIL_OUTMATERIAL_GETPDAVERSION = "/api/pda/outMaterial/getPdaVersion.action";
+
+//    private static final String ADDRESSTAIL_OUTMATERIAL_GETPDAVERSION = "/api/pda/getPdaVersion.action";
 
 
 
@@ -785,11 +793,14 @@ public class GloableParams {
     /***********************************************************************************************/
     /*界面文字和图片资源,控制后续数据一致*/
     //home主页面
+    public static final String WAREHOUSINGMANAGEMENT = "入库管理";
+    public static final String OUTBOUNDMANAGEMENT = "出库管理";
+    public static final String WAREHOUSEMANAGEMENT = "仓库管理";
     public static final String HOME_DISPATCH_MANAGE = "工序管理";
     public static final String HOME_QUALITY_MANAGE = "品质管理";
     public static final String GRIDNAME_SETTING = "设置";
-    public static String[] homeMenuNames = {HOME_DISPATCH_MANAGE, HOME_QUALITY_MANAGE,GRIDNAME_SETTING};
-    public static int[] homeMenuIcons = {R.drawable.ic_dispatch_manage,
+    public static String[] homeMenuNames = {WAREHOUSINGMANAGEMENT,OUTBOUNDMANAGEMENT,WAREHOUSEMANAGEMENT,HOME_DISPATCH_MANAGE,HOME_QUALITY_MANAGE,GRIDNAME_SETTING};
+    public static int[] homeMenuIcons = {R.drawable.ic_storage_in,R.drawable.ic_storage_out,R.drawable.mainmenu_storehousemanager,R.drawable.ic_dispatch_manage,
             R.drawable.ic_quality_manage,R.drawable.mainmenu_usersetting};
 
     //index界面
@@ -1219,5 +1230,10 @@ public class GloableParams {
         GloableParams.ADDRESS_JUMP_LOTNO = uriHead + GloableParams.ADDRESSTAIL_JUMP_LOTNO;
         GloableParams.ADDRESS_GET_MERGE_LOTNO = uriHead + GloableParams.ADDRESSTAIL_GET_MERGE_LOTNO;
         GloableParams.ADDRESS_MERGE_LOTNO = uriHead + GloableParams.ADDRESSTAIL_MERGE_LOTNO;
+        //下载
+        GloableParams.ADDRESS_COMMON_DOWNLOADBYID = uriHead + GloableParams.ADDRESSTAIL_COMMON_DOWNLOADBYID;
+        //获取应用版本信息
+        GloableParams.ADDRESS_OUTMATERIAL_GETPDAVERSION = uriHead + GloableParams.ADDRESSTAIL_OUTMATERIAL_GETPDAVERSION;
+
     }
 }

+ 11 - 1
app/src/main/java/com/uas/gdstorage/util/Constants.java

@@ -8,6 +8,7 @@ import android.os.Environment;
 public interface Constants {
 
     interface CONSTANT {
+
         String APP_DIR_NAME = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/";
         String PRINT_SHARE_PACKAGE = "com.dynamixsoftware.printershare";
         String PRINT_FILE_NAME = "print.pdf";
@@ -19,7 +20,8 @@ public interface Constants {
 
         String AUTHORITY_SHOP = "Shop";
         String AUTHORITY_PRODINOUT = "ProdInOut";
-
+        String APK_FILE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/uas_mes/apk";
+        String APK_FILE_NAME = "uas_mes.apk";
         // 修改首页应用 code;
         int REQUEST_CHANGE_APP = 100;
 
@@ -45,6 +47,14 @@ public interface Constants {
         String QUALITY_MANAGE_EXTRA = "quality_manage_extra";
 
         String WHICH_PAGE = "which_page";
+
+        //下载成功
+        int DOWNLOAD_SUCCESS = 11;
+        //下载失败
+        int DOWNLOAD_FAILED = 12;
+        //下载进度
+        int DOWNLOAD_PROGRESS = 13;
+
     }
 
     /**

+ 11 - 0
app/src/main/java/com/uas/gdstorage/util/StringUtil.java

@@ -11,6 +11,17 @@ import java.util.regex.Pattern;
 
 public class StringUtil {
 
+    public static String splitCookieString(String pCookie) {
+        String[] str = pCookie.split(";");
+        String cookie = str[0] + ";";
+        for (String value : str) {
+            if (value != null && value.contains("JSESSIONID")) {
+                cookie = value + ";";
+                break;
+            }
+        }
+        return cookie;
+    }
 
     public static boolean hasOneEqual(String messgae, String... keys) {
         if (isEmpty(messgae) || keys == null || keys.length <= 0) return false;

+ 184 - 0
app/src/main/java/com/uas/gdstorage/util/VolleyRequest.java

@@ -0,0 +1,184 @@
+package com.uas.gdstorage.util;
+
+import android.text.TextUtils;
+
+import com.android.volley.AuthFailureError;
+import com.android.volley.DefaultRetryPolicy;
+import com.android.volley.NetworkResponse;
+import com.android.volley.Request;
+import com.android.volley.Response;
+import com.android.volley.VolleyError;
+import com.android.volley.toolbox.StringRequest;
+import com.uas.gdstorage.R;
+import com.uas.gdstorage.application.PdaApplication;
+import com.uas.gdstorage.tools.SharedPreUtil;
+import com.uas.gdstorage.tools.VolleyUtil;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author RaoMeng
+ * @describe
+ * @date 2018/4/27 11:26
+ */
+
+public class VolleyRequest {
+    private static VolleyRequest instance;
+
+    private VolleyRequest() {
+
+    }
+
+    public static final VolleyRequest getInstance() {
+        if (instance == null) {
+            synchronized (VolleyRequest.class) {
+                if (instance == null) {
+                    return new VolleyRequest();
+                }
+            }
+        }
+        return instance;
+    }
+
+    public void stringRequest(StringRequest stringRequest, final HttpParams httpParams, final HttpCallback httpCallback) {
+        stringRequest(stringRequest, httpParams, 10 * 1000, httpCallback);
+    }
+
+    public void stringRequest(final HttpParams httpParams, final HttpCallback httpCallback) {
+        stringRequest(null, httpParams, 10 * 1000, httpCallback);
+    }
+
+    public void stringRequest(StringRequest stringRequest, final HttpParams httpParams, final int timeoutMs, final HttpCallback httpCallback) {
+        if (httpParams == null) {
+            throw new IllegalArgumentException("httpParams can not be NULL");
+        }
+        if (httpCallback == null) {
+            throw new IllegalArgumentException("callback can not be NULL");
+        }
+        if (httpParams.getUrl() == null) {
+            throw new IllegalArgumentException("requestUrl can not be NULL");
+        }
+
+        if (!CommonUtil.isNetWorkConnected((PdaApplication.getmContext()))) {
+            try {
+                httpCallback.onFail(httpParams.getFlag(), PdaApplication.getmContext().getString(R.string.net_not_connect));
+                return;
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+
+        String url = httpParams.getUrl();
+        if (!TextUtils.isEmpty(url) && httpParams.getMethod() == Request.Method.GET && httpParams.getParams().size() > 0) {
+            Set<Map.Entry<String, String>> entries = httpParams.getParams().entrySet();
+
+            int index = 1;
+            for (Map.Entry<String, String> paramEntry : entries) {
+                String value = paramEntry.getValue();
+                if (!TextUtils.isEmpty(value)
+                        && value.charAt(0) == 65279) {
+                    value = value.substring(1);
+                }
+                if (index == 1) {
+                    try {
+                        url += "?" + paramEntry.getKey() + "=" + (TextUtils.isEmpty(value) ? "" : URLEncoder.encode(value, "UTF-8"));
+                    } catch (UnsupportedEncodingException e) {
+                        url += "?" + paramEntry.getKey() + "=" + value;
+                    }
+                } else {
+                    try {
+                        url += "&" + paramEntry.getKey() + "=" + (TextUtils.isEmpty(value) ? "" : URLEncoder.encode(value, "UTF-8"));
+                    } catch (UnsupportedEncodingException e) {
+                        url += "&" + paramEntry.getKey() + "=" + value;
+                    }
+                }
+                index++;
+            }
+        }
+
+        PdaApplication.mRequestQueue.cancelAll(httpParams.getUrl());
+
+        stringRequest = new StringRequest(httpParams.getMethod(), url,
+                new Response.Listener<String>() {
+                    @Override
+                    public void onResponse(String s) {
+                        try {
+                            LogUtil.prinlnLongMsg("responseSucc", s);
+                            httpCallback.onSuccess(httpParams.getFlag(), s);
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                    }
+                },
+                new Response.ErrorListener() {
+                    @Override
+                    public void onErrorResponse(VolleyError volleyError) {
+                        String errorToast = CommonUtil.showErrorToast(volleyError, false);
+                        try {
+                            LogUtil.e("responErr", errorToast);
+                            if (errorToast.length() >= 500) {
+                                httpCallback.onFail(httpParams.getFlag(), "请求异常");
+                            } else {
+                                httpCallback.onFail(httpParams.getFlag(), errorToast);
+                            }
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }) {
+            @Override
+            protected Response<String> parseNetworkResponse(NetworkResponse response) {
+                String str = null;
+                try {
+                    Map<String, String> responseHeaders = response.headers;
+                    //保存cookies
+                    String cookies = responseHeaders.get("Set-Cookie");
+                    if (!TextUtils.isEmpty(cookies)) {
+                        cookies = StringUtil.splitCookieString(cookies);
+                        if (!";".equals(cookies)) {
+                            SharedPreUtil.saveString(PdaApplication.getmContext(), "cookie", cookies);
+                        }
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+                return super.parseNetworkResponse(response);
+            }
+
+            @Override
+            public Map<String, String> getHeaders() throws AuthFailureError {
+                if (httpParams.getHeaders().isEmpty()) {
+                    return VolleyUtil.getVolleyUtil().setCookies();
+                } else {
+                    return httpParams.getHeaders();
+                }
+            }
+
+            @Override
+            protected Map<String, String> getParams() throws AuthFailureError {
+                if (httpParams.getMethod() == Method.POST) {
+                    Map<String, String> params = httpParams.getParams();
+                    for (String key : params.keySet()) {
+                        String value = params.get(key);
+                        if (value == null) {
+                            params.put(key, "");
+                        } else if (!TextUtils.isEmpty(value)
+                                && value.charAt(0) == 65279) {
+                            value = value.substring(1);
+                            params.put(key, value);
+                        }
+                    }
+                    return params;
+                }
+                return super.getParams();
+            }
+        };
+
+        stringRequest.setRetryPolicy(new DefaultRetryPolicy(timeoutMs, 0, 1f));
+        stringRequest.setTag(httpParams.getUrl());
+        PdaApplication.mRequestQueue.add(stringRequest);
+    }
+}

+ 72 - 0
app/src/main/java/com/uas/gdstorage/util/down/CommonProgressPop.java

@@ -0,0 +1,72 @@
+package com.uas.gdstorage.util.down;
+
+import android.content.Context;
+import android.view.View;
+import android.view.animation.Animation;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+
+import com.uas.gdstorage.R;
+
+import razerdp.basepopup.BasePopupWindow;
+
+/**
+ * Created by RaoMeng on 2020/4/9
+ * Desc: 公共进度条弹框
+ */
+public class CommonProgressPop extends BasePopupWindow {
+    private TextView mTitleTextView;
+    private ProgressBar mProgressBar;
+    private String mTitle;
+    private int mProgress = 0, mProgressMax = 100;
+
+    public CommonProgressPop(Context context) {
+        this(context, "正在下载新版本");
+    }
+
+    public CommonProgressPop(Context context, String title) {
+        super(context);
+        setAllowDismissWhenTouchOutside(false);
+
+        mTitleTextView = findViewById(R.id.common_progress_title_tv);
+        mProgressBar = findViewById(R.id.common_progress_progress_pb);
+        mTitleTextView.setText(title);
+    }
+
+    public int getProgress() {
+        return mProgress;
+    }
+
+    public void setProgress(int progress) {
+        mProgress = progress;
+        mProgressBar.setProgress(mProgress);
+    }
+
+    public void setProgressMax(int progressMax) {
+        mProgressMax = progressMax;
+        mProgressBar.setMax(mProgressMax);
+    }
+
+    @Override
+    public void showPopupWindow() {
+        mProgress = 0;
+        mProgressBar.setProgress(mProgress);
+        super.showPopupWindow();
+    }
+
+    @Override
+    public View onCreateContentView() {
+        return createPopupById(R.layout.pop_common_progress);
+    }
+
+    @Override
+    protected Animation onCreateShowAnimation() {
+        return getDefaultScaleAnimation(true);
+    }
+
+    @Override
+    protected Animation onCreateDismissAnimation() {
+        return getDefaultScaleAnimation(false);
+    }
+
+}

+ 148 - 0
app/src/main/java/com/uas/gdstorage/util/down/ProgressDownloader.java

@@ -0,0 +1,148 @@
+package com.uas.gdstorage.util.down;
+
+import com.uas.gdstorage.application.PdaApplication;
+import com.uas.gdstorage.tools.SharedPreUtil;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.RandomAccessFile;
+import java.nio.MappedByteBuffer;
+import java.nio.channels.FileChannel;
+
+import okhttp3.Call;
+import okhttp3.Callback;
+import okhttp3.Interceptor;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import okhttp3.ResponseBody;
+
+/**
+ * Created by RaoMeng on 2017/9/25.
+ * okhttp实现的下载工具类
+ * 支持下载暂停以及断电续传
+ */
+
+public class ProgressDownloader {
+    private ProgressResponseBody.ProgressListener progressListener;
+    private String url;
+    private OkHttpClient client;
+    private File destination;
+    private Call call;
+
+    public ProgressDownloader(String url, File destination, ProgressResponseBody.ProgressListener progressListener) {
+        this.url = url;
+        this.destination = destination;
+        this.progressListener = progressListener;
+        //在下载、暂停后的继续下载中可复用同一个client对象
+        client = getProgressClient();
+    }
+
+    //每次下载需要新建新的Call对象
+    private Call newCall(long startPoints) {
+        String cookieCache = SharedPreUtil.getString(PdaApplication.getmContext(), "cookie", "");
+        Request request = new Request.Builder()
+                .url(url)
+                .header("RANGE", "bytes=" + startPoints + "-")//断点续传要用到的,指示下载的区间
+                .header("Cookie", cookieCache)
+                .build();
+        return client.newCall(request);
+    }
+
+    public OkHttpClient getProgressClient() {
+        // 拦截器,用上ProgressResponseBody
+        Interceptor interceptor = new Interceptor() {
+            @Override
+            public Response intercept(Chain chain) throws IOException {
+                Response originalResponse = chain.proceed(chain.request());
+                return originalResponse.newBuilder()
+                        .body(new ProgressResponseBody(originalResponse.body(), progressListener))
+                        .build();
+            }
+        };
+
+        return new OkHttpClient.Builder()
+                .addNetworkInterceptor(interceptor)
+                .build();
+    }
+
+    // startsPoint指定开始下载的点
+    public void download(final long startsPoint) {
+        call = newCall(startsPoint);
+        call.enqueue(new Callback() {
+            @Override
+            public void onFailure(Call call, IOException e) {
+
+            }
+
+            @Override
+            public void onResponse(Call call, Response response) throws IOException {
+                save(response, startsPoint);
+            }
+        });
+    }
+
+    public void download(final long startsPoint, final DownloadCallBack downloadCallBack) {
+        call = newCall(startsPoint);
+        call.enqueue(new Callback() {
+            @Override
+            public void onFailure(Call call, IOException e) {
+                downloadCallBack.onFailure(call, e);
+            }
+
+            @Override
+            public void onResponse(Call call, Response response) throws IOException {
+                downloadCallBack.onResponse(call, response);
+                save(response, startsPoint);
+            }
+        });
+    }
+
+    public void pause() {
+        if (call != null) {
+            call.cancel();
+        }
+    }
+
+    protected void save(Response response, long startsPoint) {
+        String fileName = response.headers().get("Content-Disposition");
+        ResponseBody body = response.body();
+        InputStream in = body.byteStream();
+        FileChannel channelOut = null;
+        // 随机访问文件,可以指定断点续传的起始位置
+        RandomAccessFile randomAccessFile = null;
+        try {
+            randomAccessFile = new RandomAccessFile(destination, "rwd");
+            //Chanel NIO中的用法,由于RandomAccessFile没有使用缓存策略,直接使用会使得下载速度变慢,亲测缓存下载3.3秒的文件,用普通的RandomAccessFile需要20多秒。
+            channelOut = randomAccessFile.getChannel();
+            // 内存映射,直接使用RandomAccessFile,是用其seek方法指定下载的起始位置,使用缓存下载,在这里指定下载位置。
+            MappedByteBuffer mappedBuffer = channelOut.map(FileChannel.MapMode.READ_WRITE, startsPoint, body.contentLength());
+            byte[] buffer = new byte[1024];
+            int len;
+            while ((len = in.read(buffer)) != -1) {
+                mappedBuffer.put(buffer, 0, len);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                in.close();
+                if (channelOut != null) {
+                    channelOut.close();
+                }
+                if (randomAccessFile != null) {
+                    randomAccessFile.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    public interface DownloadCallBack {
+        void onFailure(Call call, IOException e);
+
+        void onResponse(Call call, Response response);
+    }
+}

+ 74 - 0
app/src/main/java/com/uas/gdstorage/util/down/ProgressResponseBody.java

@@ -0,0 +1,74 @@
+package com.uas.gdstorage.util.down;
+
+import java.io.IOException;
+
+import okhttp3.MediaType;
+import okhttp3.ResponseBody;
+import okio.Buffer;
+import okio.BufferedSource;
+import okio.ForwardingSource;
+import okio.Okio;
+import okio.Source;
+
+/**
+ * Created by RaoMeng on 2017/9/25.
+ * okhttp下载返回体
+ */
+
+public class ProgressResponseBody extends ResponseBody {
+
+    private final ResponseBody responseBody;
+    private final ProgressListener progressListener;
+    private BufferedSource bufferedSource;
+
+    public ProgressResponseBody(ResponseBody responseBody,
+                                ProgressListener progressListener) {
+        this.responseBody = responseBody;
+        this.progressListener = progressListener;
+        if (progressListener != null) {
+            progressListener.onPreExecute(contentLength());
+        }
+    }
+
+    @Override
+    public MediaType contentType() {
+        return responseBody.contentType();
+    }
+
+    @Override
+    public long contentLength() {
+        return responseBody.contentLength();
+    }
+
+    @Override
+    public BufferedSource source() {
+        if (bufferedSource == null) {
+            bufferedSource = Okio.buffer(source(responseBody.source()));
+        }
+        return bufferedSource;
+    }
+
+    private Source source(Source source) {
+        return new ForwardingSource(source) {
+            long totalBytes = 0L;
+
+            @Override
+            public long read(Buffer sink, long byteCount) throws IOException {
+                long bytesRead = super.read(sink, byteCount);
+                // read() returns the number of bytes read, or -1 if this source is exhausted.
+                totalBytes += bytesRead != -1 ? bytesRead : 0;
+                if (null != progressListener) {
+                    progressListener.update(totalBytes, bytesRead == -1);
+                }
+                return bytesRead;
+            }
+        };
+    }
+
+    public interface ProgressListener {
+        void onPreExecute(long contentLength);
+
+        void update(long totalBytes, boolean done);
+    }
+
+}

+ 3 - 0
app/src/main/res/layout/fragment_come_in_site.xml

@@ -75,7 +75,10 @@
                 android:layout_width="wrap_content"
                 android:layout_weight="1"
                 android:hint="请输入"
+                android:lines="1"
                 android:textColor="@color/black"
+                android:inputType="text"
+                android:maxLines="1"
                 android:textSize="14sp" />
 
 

+ 99 - 0
app/src/main/res/layout/fragment_version_upgrade.xml

@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="center_horizontal"
+    android:orientation="vertical">
+
+    <ImageView
+        android:layout_width="64dp"
+        android:layout_height="64dp"
+        android:layout_marginTop="50dp"
+        android:src="@mipmap/icon" />
+
+    <TextView
+        android:id="@+id/version_upgrade_oldVersion_tv"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:padding="10dp"
+        android:textColor="#333333"
+        android:textSize="16sp"
+        tools:text="Version 1.0.0" />
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="16dp"
+        android:layout_marginRight="16dp"
+        android:orientation="horizontal"
+        android:padding="16dp">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="最新版本:"
+            android:textColor="#666666"
+            android:textSize="14sp" />
+
+        <TextView
+            android:id="@+id/version_upgrade_newVersion_tv"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textColor="#333333"
+            android:textSize="14sp"
+            tools:text="V1.1.1" />
+    </LinearLayout>
+
+    <View
+        style="@style/view_gray_line"
+        android:layout_marginLeft="26dp"
+        android:layout_marginRight="26dp"
+        android:background="#cccccc" />
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="16dp"
+        android:layout_marginRight="16dp"
+        android:orientation="horizontal"
+        android:padding="16dp">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="更新内容:"
+            android:textColor="#666666"
+            android:textSize="14sp" />
+
+        <TextView
+            android:id="@+id/version_upgrade_msg_tv"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:lineSpacingExtra="4dp"
+            android:maxHeight="240dp"
+            android:textColor="#333333"
+            android:textSize="14sp"
+            tools:text="解决已知bug解决已知bug解决已知bug
+            解决已知bug解决已知bug解决已知bug解决
+            已知bug解决已知bug解决已知bug解决已知bug解决已知bug解决已知bug" />
+    </LinearLayout>
+
+    <View
+        style="@style/view_gray_line"
+        android:layout_marginLeft="26dp"
+        android:layout_marginRight="26dp"
+        android:background="#cccccc" />
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1" />
+
+    <Button
+        android:id="@+id/version_upgrade_upgrade_btn"
+        style="@style/ButtonStyle"
+        android:layout_margin="32dp"
+        android:visibility="visible"
+        android:text="下载新版本 " />
+</LinearLayout>

+ 26 - 0
app/src/main/res/layout/pop_common_progress.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    style="@style/commonPopStyle">
+
+    <TextView
+        android:id="@+id/common_progress_title_tv"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="center"
+        android:padding="8dp"
+        android:textColor="#333"
+        android:textSize="14sp"
+        tools:text="正在下载新版本" />
+
+    <ProgressBar
+        android:id="@+id/common_progress_progress_pb"
+        style="@style/progressbar_download"
+        android:layout_width="match_parent"
+        android:layout_height="10dp"
+        android:layout_marginLeft="20dp"
+        android:layout_marginTop="12dp"
+        android:layout_marginRight="20dp"
+        android:layout_marginBottom="20dp"
+        android:progress="0" />
+</LinearLayout>

+ 22 - 0
app/src/main/res/values/styles.xml

@@ -749,4 +749,26 @@
         <item name="android:minHeight">20dip</item>
         <item name="android:maxHeight">20dip</item>
     </style>
+
+    <style name="commonPopStyle">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_gravity">center</item>
+        <item name="android:layout_marginLeft">30dp</item>
+        <item name="android:layout_marginRight">30dp</item>
+        <item name="android:background">@drawable/shape_msg_block</item>
+        <item name="android:orientation">vertical</item>
+        <item name="android:padding">12dp</item>
+    </style>
+
+    <style name="progressbar_download">
+        <item name="android:indeterminateOnly">false</item>
+        <item name="android:progressDrawable">@drawable/progressbar_diy
+        </item><!-- progress_horizontal -->
+        <item name="android:indeterminateDrawable">
+            @android:drawable/progress_indeterminate_horizontal
+        </item>
+        <item name="android:minHeight">20dip</item>
+        <item name="android:maxHeight">20dip</item>
+    </style>
 </resources>