Explorar o código

添加版本升级模块~

shuij %!s(int64=4) %!d(string=hai) anos
pai
achega
7fd1a0175d

+ 4 - 4
app_core/common/src/main/java/com/core/net/ProgressDownloader.java

@@ -1,7 +1,7 @@
 package com.core.net;
 
-import com.alibaba.fastjson.JSON;
-import com.common.LogUtil;
+import com.core.app.MyApplication;
+import com.core.utils.CommonUtil;
 
 import java.io.File;
 import java.io.IOException;
@@ -41,9 +41,11 @@ public class ProgressDownloader {
 
     //每次下载需要新建新的Call对象
     private Call newCall(long startPoints) {
+        String cookieCache = CommonUtil.getSharedPreferencesString(MyApplication.getInstance(), "Cookie", "");
         Request request = new Request.Builder()
                 .url(url)
                 .header("RANGE", "bytes=" + startPoints + "-")//断点续传要用到的,指示下载的区间
+                .header("Cookie", cookieCache)
                 .build();
         return client.newCall(request);
     }
@@ -105,8 +107,6 @@ public class ProgressDownloader {
 
     protected void save(Response response, long startsPoint) {
         String fileName = response.headers().get("Content-Disposition");
-        LogUtil.i("fileName=" + fileName);
-        LogUtil.i("response.headers()=" + JSON.toJSONString(response.headers()));
         ResponseBody body = response.body();
         InputStream in = body.byteStream();
         FileChannel channelOut = null;

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

@@ -672,6 +672,16 @@ public class CommonUtil {
 
     }
 
+    public static String ApkVersionName(Context context) {
+        PackageManager packageManager = context.getPackageManager();
+        PackageInfo packInfo = null;
+        try {
+            packInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
+        } catch (Exception e) {
+        }
+        return packInfo.versionName;
+    }
+
 
     /**
      * 对话框是否展示

+ 44 - 0
app_core/common/src/main/java/com/core/xmpp/utils/flie/FileUtils.java

@@ -532,4 +532,48 @@ public class FileUtils {
         intent.addCategory(Intent.CATEGORY_OPENABLE);
         return intent;
     }
+
+    public static boolean delAllFile(String path) {
+        boolean flag = false;
+        File file = new File(path);
+        if (!file.exists()) {
+            return flag;
+        }
+        if (!file.isDirectory()) {
+            return flag;
+        }
+        String[] tempList = file.list();
+        File temp = null;
+        for (int i = 0; i < tempList.length; i++) {
+            if (path.endsWith(File.separator)) {
+                temp = new File(path + tempList[i]);
+            } else {
+                temp = new File(path + File.separator + tempList[i]);
+            }
+            if (temp.isFile()) {
+                temp.delete();
+            }
+            if (temp.isDirectory()) {
+                delAllFile(path + "/" + tempList[i]);//先删除文件夹里面的文件
+                delFolder(path + "/" + tempList[i]);//再删除空文件夹
+                flag = true;
+            }
+        }
+        return flag;
+    }
+
+    //删除文件夹
+    //param folderPath 文件夹完整绝对路径
+    public static void delFolder(String folderPath) {
+        try {
+            delAllFile(folderPath); //删除完里面所有内容
+            String filePath = folderPath;
+            filePath = filePath.toString();
+            java.io.File myFilePath = new java.io.File(filePath);
+            myFilePath.delete(); //删除空文件夹
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
 }

+ 3 - 7
app_modular/appme/src/main/java/com/uas/appme/settings/activity/SettingActivity.java

@@ -9,7 +9,6 @@ import android.app.ProgressDialog;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
-import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.drawable.BitmapDrawable;
 import android.net.Uri;
@@ -17,7 +16,6 @@ import android.os.AsyncTask;
 import android.os.Build;
 import android.os.Bundle;
 import android.support.v4.app.NotificationCompat;
-import android.support.v4.app.NotificationManagerCompat;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.Gravity;
@@ -36,7 +34,6 @@ import android.widget.TextView;
 import android.widget.Toast;
 
 import com.alibaba.fastjson.JSON;
-import com.baidu.aip.excep.activity.FaceManageActivity;
 import com.baidu.android.pushservice.PushManager;
 import com.baidu.autoupdatesdk.AppUpdateInfo;
 import com.baidu.autoupdatesdk.AppUpdateInfoForInstall;
@@ -69,7 +66,6 @@ import com.core.utils.ToastUtil;
 import com.core.utils.helper.LoginHelper;
 import com.core.utils.sp.UserSp;
 import com.core.widget.view.SwitchView;
-import com.hss01248.notifyutil.NotifyUtil;
 import com.me.network.app.http.HttpClient;
 import com.me.network.app.http.Method;
 import com.me.network.app.http.rx.ResultListener;
@@ -501,9 +497,9 @@ public class SettingActivity extends SupportToolBarActivity implements View.OnCl
             startActivityForResult(intent, 0x12);
             closePopupWindow();
         } else if (v.getId() == R.id.face_setting_tv) {
-            intent = new Intent(mContext, FaceManageActivity.class);
-            startActivityForResult(intent, 0x13);
-            closePopupWindow();
+//            intent = new Intent(mContext, FaceManageActivity.class);
+//            startActivityForResult(intent, 0x13);
+//            closePopupWindow();
         } else if (v.getId() == R.id.office_addr_setting_tv) {
             startActivityForResult(new Intent(mContext, OfficeAddressSettingsActivity.class), 0x12);
             closePopupWindow();

+ 1 - 1
devicemanager/build.gradle

@@ -9,7 +9,7 @@ android {
         minSdkVersion rootProject.ext.android.minSdkVersion
         targetSdkVersion rootProject.ext.android.targetSdkVersion
         versionCode 1
-        versionName "1.0"
+        versionName "v1.0"
         multiDexEnabled true
         ndk {
             abiFilters "armeabi", "armeabi-v7a", "x86", "mips", "x86_64", "mips64"

+ 12 - 0
devicemanager/src/main/AndroidManifest.xml

@@ -137,6 +137,18 @@
              <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>
+        <activity
+            android:name=".ui.VersionUpdateActivity"
+            android:launchMode="singleTask"/>
+        <provider
+            android:name="android.support.v4.content.FileProvider"
+            android:authorities="com.yingtang.devicemanager.fileprovider"
+            android:exported="false"
+            android:grantUriPermissions="true">
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/file_paths" />
+        </provider>
         <service android:name="com.core.service.InitializeService" />
     </application>
 

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

@@ -1,5 +1,7 @@
 package com.yingtang.devicemanager;
 
+import android.os.Environment;
+
 /**
  * Created by jsxiaoshui on 2021/7/14
  */
@@ -24,5 +26,7 @@ public class Constant {
     public static final String HEAD_PWD = "j_password";
     public static final String HEAD_MASTER= "master";
     public static final String HEAD_VERSION_CODE= "versioncode";
+   public static String APK_FILE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/pda_smart_sa/apk";
+    public static String APK_FILE_NAME = "pda_smart_sa.apk";
 
 }

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

@@ -185,7 +185,7 @@ public class ConnectServerActivity extends BaseActivity implements View.OnFocusC
         String port = portEditText.getText().toString().trim();
         String site = siteEditText.getText().toString().trim();
         isRightIp();
-        isRightPort();
+        //isRightPort();
         if (ip == null || ip.equals("")) {
             showNotice(getResources().getString(R.string.notice_serverconnect_ip_blank));
             return;
@@ -198,7 +198,7 @@ public class ConnectServerActivity extends BaseActivity implements View.OnFocusC
             showNotice(getResources().getString(R.string.notice_serverconnect_port_blank));
             return;
         }
-        //IP和Port格式验证通过
+        //只检测IP,不检测端口
         if (uriRight) {
            // progressDialog.show();
             //连接服务器

+ 3 - 2
devicemanager/src/main/java/com/yingtang/devicemanager/ui/SettingActivity.java

@@ -98,7 +98,7 @@ public class SettingActivity extends BaseActivity implements View.OnClickListene
         userNameTv.setText(mUserName);
         mAccountBookTv.setText(mAccountName);
         mIpAddressTv.setText(mAccountName + "(" + mIp + ")");
-        mVersionTextView.setText("V"+CommonUtil.ApkVersionCode(this));
+        mVersionTextView.setText(CommonUtil.ApkVersionName(this));
         //切换账套,地址
         findViewById(R.id.setting_account_book_rl).setOnClickListener(this);
         findViewById(R.id.setting_ip_address_rl).setOnClickListener(this);
@@ -121,7 +121,8 @@ public class SettingActivity extends BaseActivity implements View.OnClickListene
                 changeIpAddress();
                 break;
             case R.id.setting_check_update_ll:
-                showToast("当前版本:V"+CommonUtil.ApkVersionCode(this));
+                //showToast("当前版本:V"+CommonUtil.ApkVersionCode(this));
+                startActivity(new Intent(SettingActivity.this,VersionUpdateActivity.class));
                 break;
             case R.id.setting_about_us_ll:
                 Intent intent=new Intent(this, CommonWebviewActivity.class);

+ 207 - 0
devicemanager/src/main/java/com/yingtang/devicemanager/ui/VersionUpdateActivity.java

@@ -0,0 +1,207 @@
+package com.yingtang.devicemanager.ui;
+
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.support.v4.content.FileProvider;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.Button;
+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.net.ProgressDownloader;
+import com.core.net.ProgressResponseBody;
+import com.core.utils.CommonUtil;
+import com.core.xmpp.utils.flie.FileUtils;
+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.datainquiry.Constants;
+import com.yingtang.devicemanager.Constant;
+import com.yingtang.devicemanager.R;
+import com.yingtang.devicemanager.utils.CookieUtil;
+import com.yingtang.devicemanager.widget.CommonProgressPop;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Map;
+
+/**
+ * Created by jsxiaoshui on 2021/7/19
+ */
+public class VersionUpdateActivity extends BaseActivity 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;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_version_upgrade);
+        setTitle("版本升级");
+        mOldVersionTv = findViewById(R.id.version_upgrade_oldVersion_tv);
+        mNewVersionTv = findViewById(R.id.version_upgrade_newVersion_tv);
+        mMsgTextView = findViewById(R.id.version_upgrade_msg_tv);
+        mUpgradeButton = findViewById(R.id.version_upgrade_upgrade_btn);
+        mUpgradeButton.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (mProgressPop == null) {
+                    mProgressPop = new CommonProgressPop(VersionUpdateActivity.this, "正在下载新版本");
+                }
+                mProgressPop.showPopupWindow();
+
+                breakPoints = 0L;
+                File directory = new File(Constant.APK_FILE_PATH);
+                if (!directory.exists() && !directory.isDirectory()) {
+                    boolean mkdirs = directory.mkdirs();
+                } else {
+                    FileUtils.delAllFile(Constant.APK_FILE_PATH);
+                }
+                file = new File(Constant.APK_FILE_PATH,Constant.APK_FILE_NAME);
+                try {
+                    file.createNewFile();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+                String downloadUrl = CommonUtil.getAppBaseUrl(VersionUpdateActivity.this)+"common/downloadbyId.action" + "?id=" + mAttachId;
+                mDownloader = new ProgressDownloader(downloadUrl, file, VersionUpdateActivity.this);
+                mDownloader.download(0L);
+            }
+        });
+
+        mOldVersionTv.setText(CommonUtil.ApkVersionName(this));
+        getNewVersionMsg();
+
+    }
+
+    private void getNewVersionMsg() {
+        progressDialog.show();
+        Map<String ,String> headMap= CookieUtil.getHeadersMap(VersionUpdateActivity.this);
+        HttpRequest.getInstance().sendRequest(CommonUtil.getAppBaseUrl(this),
+                new HttpParams.Builder()
+                        .url("api/pda/outMaterial/getPdaVersion.action")
+                        .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))
+                        .connectTimeOut(5)
+                        .readTimeOut(5)
+                        .method(Method.GET)
+                        .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&&!dataObject.isEmpty()) {
+                            mNewVersionTv.setText(JSONUtil.getText(dataObject, "pp_versionname"));
+                            mMsgTextView.setText(JSONUtil.getText(dataObject, "pp_remark"));
+
+                            mAttachId = JSONUtil.getText(dataObject, "pp_attach");
+                            if (!TextUtils.isEmpty(mAttachId)) {
+                                mUpgradeButton.setVisibility(View.VISIBLE);
+                            } else {
+                                mUpgradeButton.setVisibility(View.GONE);
+                            }
+                        }else{
+                            showToast("线上升级功能暂未开放,请通过线下手动安装APK升级.");
+                        }
+                    }
+
+                    @Override
+                    public void onFail(int flag, String failStr) throws Exception {
+                        progressDialog.dismiss();
+                        if(failStr.equals("服务器异常")){
+                            showToast("线上升级功能暂未开放,请通过线下手动安装APK升级.");
+                        }else{
+                            showToast(failStr);
+                        }
+                    }
+                });
+    }
+
+    @Override
+    public void onPreExecute(long 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);
+                    } catch (Exception e) {
+
+                    }
+                    break;
+                case Constants.CONSTANT.DOWNLOAD_SUCCESS:
+                   // CommonUtil.toastNoRepeat(mActivity, "下载完成");
+                    showToast("下载完成");
+                    mProgressPop.dismiss();
+                    try {
+                        File apk = new File(Constant.APK_FILE_PATH, Constant.APK_FILE_NAME);
+                        Intent intent = new Intent(Intent.ACTION_VIEW);
+                        if (Build.VERSION.SDK_INT >= 24) {
+                            Uri apkUri = FileProvider.getUriForFile(VersionUpdateActivity.this,
+                                    "com.yingtang.devicemanager.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);
+                        }
+                        VersionUpdateActivity.this.startActivity(intent);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    break;
+                case Constants.CONSTANT.DOWNLOAD_FAILED:
+                    mProgressPop.dismiss();
+                    showToast("下载失败");
+                    break;
+                default:
+                    break;
+            }
+        }
+    };
+}

+ 72 - 0
devicemanager/src/main/java/com/yingtang/devicemanager/widget/CommonProgressPop.java

@@ -0,0 +1,72 @@
+package com.yingtang.devicemanager.widget;
+
+import android.content.Context;
+import android.view.View;
+import android.view.animation.Animation;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+
+import com.yingtang.devicemanager.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);
+    }
+
+}

+ 99 - 0
devicemanager/src/main/res/layout/activity_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="gone"
+        android:text="下载新版本 " />
+</LinearLayout>

+ 26 - 0
devicemanager/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>

+ 10 - 0
devicemanager/src/main/res/values/styles.xml

@@ -734,4 +734,14 @@
         <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>

+ 9 - 0
devicemanager/src/main/res/xml/file_paths.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<paths xmlns:android="http://schemas.android.com/apk/res/android">
+    <external-path
+        name="files_root"
+        path="Android/data/com.yingtang.devicemanager/" />
+    <external-path
+        name="external_storage_root"
+        path="." />
+</paths>