drew 5 年之前
父節點
當前提交
2ac3bd3f46

+ 10 - 5
app/build.gradle

@@ -1,5 +1,6 @@
 apply plugin: 'com.android.application'
-
+def app_version_code = 3
+def app_version_name = '1.0.1'
 android {
     compileSdkVersion 29
     buildToolsVersion "29.0.2"
@@ -7,8 +8,8 @@ android {
         applicationId "com.ht.gate"
         minSdkVersion 24
         targetSdkVersion 29
-        versionCode 1
-        versionName "1.0"
+        versionCode app_version_code
+        versionName app_version_name
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         javaCompileOptions {
             annotationProcessorOptions {
@@ -26,6 +27,12 @@ android {
         sourceCompatibility JavaVersion.VERSION_1_8
         targetCompatibility JavaVersion.VERSION_1_8
     }
+    android.applicationVariants.all {
+        variant ->
+            variant.outputs.all {
+                outputFileName = "会议预定-${variant.variantData.variantConfiguration.buildType.name}-${app_version_name}(${app_version_code}).apk"
+            }
+    }
 }
 
 dependencies {
@@ -57,6 +64,4 @@ dependencies {
     implementation 'com.blankj:utilcodex:1.28.4'
     implementation 'com.liulishuo.filedownloader:library:1.7.7'
     implementation group: 'org.apache.commons', name: 'commons-io', version: '1.3.2'
-    implementation 'com.liulishuo.okdownload:okdownload:1.0.7'
-    implementation 'com.liulishuo.okdownload:sqlite:1.0.7'
 }

+ 10 - 10
app/src/main/AndroidManifest.xml

@@ -31,6 +31,16 @@
             </intent-filter>
         </receiver>
 
+        <provider
+            android:name="androidx.core.content.FileProvider"
+            android:authorities="com.ht.gate.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=".DoorService"
             android:enabled="true"
@@ -47,16 +57,6 @@
         <activity android:name=".WelcomeActivity" />
         <activity android:name=".MainActivity" />
         <activity android:name=".LoginActivity" />
-
-        <provider
-            android:name="androidx.core.content.FileProvider"
-            android:authorities="com.ht.gate.fileProvider"
-            android:exported="false"
-            android:grantUriPermissions="true">
-            <meta-data
-                android:name="android.support.FILE_PROVIDER_PATHS"
-                android:resource="@xml/file_provider" />
-        </provider>
     </application>
 
 </manifest>

+ 11 - 0
app/src/main/assets/mockData/update.json

@@ -0,0 +1,11 @@
+{
+  "msg": "ok",
+  "code": "0",
+  "resultData": {
+    "needUpdate": true,
+    "softwareUrl": "https://beautiful-nanjing.oss-cn-hangzhou.aliyuncs.com/app-release.apk",
+    "class": "com.htsc.msp.softwaremng.dto.NewestVersionForHallDTO",
+    "newestVersion": 11
+  },
+  "class": "cn.com.htsc.boot.response.Response"
+}

+ 8 - 3
app/src/main/java/com/ht/gate/MockServer.java

@@ -18,19 +18,24 @@ public class MockServer {
         MockNet mockNet = MockNet.create();
         mockNet.addConnection(MockConnectionFactory.getInstance()
                 .createGeneralConnection(MockConnection.POST,
-                        "/meeting/service-api/crmnew/bind-device/111",
+                        "/getBindDeviceDataByDeviceId",
                         "text/json",
                         loadAssetTextAsString(context, "mockData/Room.json")))
                 .addConnection(MockConnectionFactory.getInstance()
                         .createGeneralConnection(MockConnection.POST,
-                                "/meeting/service-api/crmnew/find-room-meetings",
+                                "/getRoomMeetingsData",
                                 "text/json",
                                 loadAssetTextAsString(context, "mockData/RoomMeetings.json")))
                 .addConnection(MockConnectionFactory.getInstance()
                         .createGeneralConnection(MockConnection.POST,
-                                "/employee-center/EmpService/queryEmpInfoByEmpId",
+                                "/getEmpInfoData",
                                 "text/json",
                                 loadAssetTextAsString(context, "mockData/投顾.json")))
+                .addConnection(MockConnectionFactory.getInstance()
+                        .createGeneralConnection(MockConnection.POST,
+                                "/api/software/getLatestVersion",
+                                "text/json",
+                                loadAssetTextAsString(context, "mockData/update.json")))
                 .start(8080);
     }
 

+ 11 - 0
app/src/main/java/com/ht/gate/MyApplication.java

@@ -8,6 +8,7 @@ import android.util.Log;
 
 import androidx.annotation.NonNull;
 
+import com.blankj.utilcode.util.PathUtils;
 import com.ht.gate.domain.Meeting;
 import com.ht.gate.domain.Room;
 import com.ht.gate.domain.RoomMeetings;
@@ -16,6 +17,7 @@ import com.squareup.picasso.Picasso;
 import org.greenrobot.eventbus.EventBus;
 import org.xutils.x;
 
+import java.io.File;
 import java.io.IOException;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -101,6 +103,15 @@ public class MyApplication extends Application {
                 .minTimeBetweenCrashesMs(2000) //default: 3000
                 .restartActivity(LoginActivity.class) //default: null (your app's launch activity)
                 .apply();
+
+        try {
+            File file = new File(PathUtils.getExternalAppDownloadPath());
+            for (File child : file.listFiles()) {
+                child.delete();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
     }
 
     private void getMeetings() {

+ 3 - 2
app/src/main/java/com/ht/gate/RetrofitManager.java

@@ -12,8 +12,9 @@ import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
 import retrofit2.converter.gson.GsonConverterFactory;
 
 public class RetrofitManager {
-    public static final String BASE_URL = "http://168.63.70.94:30000/";
-    //    public static final String BASE_URL = "http://screen.crm.htsc:30000/";
+//    public static final String BASE_URL = "http://168.63.70.94:30000/";
+//    public static final String BASE_URL = "http://localhost:8080/";
+        public static final String BASE_URL = "http://screen.crm.htsc:30000/";
     private static RetrofitManager sInstance;
     private Retrofit mRetrofit;
 

+ 157 - 132
app/src/main/java/com/ht/gate/SettingsActivity.java

@@ -13,18 +13,14 @@ import android.content.ServiceConnection;
 import android.content.SharedPreferences;
 import android.content.pm.PackageInstaller;
 import android.net.Uri;
-import android.os.Build;
 import android.os.Bundle;
-import android.os.Environment;
 import android.os.IBinder;
+import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.View;
 import android.widget.TextView;
-import android.widget.Toast;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.core.content.FileProvider;
 
@@ -32,31 +28,23 @@ import com.blankj.utilcode.constant.PermissionConstants;
 import com.blankj.utilcode.util.AppUtils;
 import com.blankj.utilcode.util.PathUtils;
 import com.blankj.utilcode.util.PermissionUtils;
+import com.blankj.utilcode.util.ToastUtils;
 import com.blankj.utilcode.util.UtilsTransActivity;
 import com.ht.gate.domain.QueryUpdate;
 import com.ht.gate.domain.Room;
 import com.ht.gate.domain.UpdateInfo;
 import com.liulishuo.filedownloader.BaseDownloadTask;
+import com.liulishuo.filedownloader.DownloadTask;
 import com.liulishuo.filedownloader.FileDownloadListener;
+import com.liulishuo.filedownloader.FileDownloadSampleListener;
 import com.liulishuo.filedownloader.FileDownloader;
-import com.liulishuo.okdownload.DownloadListener;
-import com.liulishuo.okdownload.DownloadTask;
-import com.liulishuo.okdownload.StatusUtil;
-import com.liulishuo.okdownload.core.breakpoint.BreakpointInfo;
-import com.liulishuo.okdownload.core.cause.EndCause;
-import com.liulishuo.okdownload.core.cause.ResumeFailedCause;
 
 import org.apache.commons.io.FilenameUtils;
-import org.xutils.x;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.nio.file.Paths;
-import java.util.List;
-import java.util.Map;
 
 import butterknife.BindView;
 import butterknife.ButterKnife;
@@ -86,6 +74,8 @@ public class SettingsActivity extends AppCompatActivity {
     private SharedPreferences sharedPreferences;
     private DoorService.DoorBinder mDoorBinder;
 
+    private ProgressDialog progressDialog;
+
     private ServiceConnection connection = new ServiceConnection() {
         @Override
         public void onServiceConnected(ComponentName name, IBinder service) {
@@ -107,6 +97,13 @@ public class SettingsActivity extends AppCompatActivity {
         ButterKnife.bind(this);
         sharedPreferences = getSharedPreferences(PREF_NAME_SETTINGS, MODE_PRIVATE);
         bindService(new Intent(this, DoorService.class), connection, BIND_AUTO_CREATE);
+
+        progressDialog = new ProgressDialog(this, AlertDialog.THEME_DEVICE_DEFAULT_DARK);
+        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
+        progressDialog.setCanceledOnTouchOutside(false);
+        progressDialog.setCancelable(false);
+        progressDialog.setMessage("下载中");
+        progressDialog.setProgress(0);
     }
 
     @Override
@@ -184,140 +181,168 @@ public class SettingsActivity extends AppCompatActivity {
 
     @OnClick(R.id.btn_update)
     void checkUpdate() {
-//        try {
-//
-//            Room room = Room.fromBase64(sharedPreferences.getString(Constants.PREF_ROOM_INFO, null));
-//            RetrofitManager.getInstance().getRetrofit().create(ApiService.class)
-//                    .checkUpdate(new QueryUpdate(room.getSiteCode(), "02", AppUtils.getAppVersionCode() + ""))
-//                    .enqueue(new Callback<UpdateInfo>() {
-//                        @Override
-//                        public void onResponse(Call<UpdateInfo> call, Response<UpdateInfo> response) {
-//                            if (response.code() == 200) {
-//                                if (response.body() == null) {
-//                                    return;
-//                                }
-//                                if (response.body().getResultData().isNeedUpdate()) {
-//                                    PermissionUtils.permission(PermissionConstants.STORAGE).rationale(new PermissionUtils.OnRationaleListener() {
-//                                        @Override
-//                                        public void rationale(UtilsTransActivity activity, ShouldRequest shouldRequest) {
-//                                        }
-//                                    }).callback(new PermissionUtils.SimpleCallback() {
-//                                        @Override
-//                                        public void onGranted() {
-//                                            startDownload(RetrofitManager.BASE_URL.replaceAll("/$", "") + response.body().getResultData().getSoftwareUrl());
-//                                        }
-//
-//                                        @Override
-//                                        public void onDenied() {
-//
-//                                        }
-//                                    }).request();
-//                                }
-//                            }
-//                        }
+        try {
+            Room room = Room.fromBase64(sharedPreferences.getString(Constants.PREF_ROOM_INFO, null));
+            RetrofitManager.getInstance().getRetrofit().create(ApiService.class)
+                    .checkUpdate(new QueryUpdate(room.getSiteCode(), "02", AppUtils.getAppVersionCode() + ""))
+                    .enqueue(new Callback<UpdateInfo>() {
+                        @Override
+                        public void onResponse(Call<UpdateInfo> call, Response<UpdateInfo> response) {
+                            if (response.code() == 200) {
+                                if (response.body() == null) {
+                                    return;
+                                }
+                                if (response.body().getResultData().isNeedUpdate()) {
+                                    new AlertDialog.Builder(SettingsActivity.this, AlertDialog.THEME_DEVICE_DEFAULT_DARK)
+                                            .setTitle("新版本")
+                                            .setMessage("检测到新版本" + response.body().getResultData().getNewestVersion() + ",是否立即下载更新?")
+                                            .setNegativeButton("取消", (dialog0, which0) -> {
+                                                dialog0.dismiss();
+                                            })
+                                            .setPositiveButton("下载", (dialog0, which0) -> {
+                                                dialog0.dismiss();
+                                                PermissionUtils.permission(PermissionConstants.STORAGE)
+                                                        .rationale((activity, shouldRequest) -> new AlertDialog.Builder(activity, AlertDialog.THEME_DEVICE_DEFAULT_DARK)
+                                                                .setTitle("无写入权限")
+                                                                .setMessage("请前往设置打开存储权限")
+                                                                .setNegativeButton("取消", (dialog, which) -> {
+                                                                    dialog.dismiss();
+                                                                    activity.finish();
+                                                                })
+                                                                .setPositiveButton("打开设置", (dialog, which) -> {
+                                                                    dialog.dismiss();
+                                                                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+                                                                    Uri uri = Uri.fromParts("package", getPackageName(), null);
+                                                                    intent.setData(uri);
+                                                                    intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+                                                                    intent.addCategory(Intent.CATEGORY_DEFAULT);
+                                                                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                                                                    intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
+                                                                    intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+                                                                    activity.startActivity(intent);
+                                                                    activity.finish();
+                                                                }).show())
+                                                        .callback(new PermissionUtils.SimpleCallback() {
+                                                            @Override
+                                                            public void onGranted() {
+                                                                String url;
+                                                                if (response.body().getResultData().getSoftwareUrl().startsWith("http")) {
+                                                                    url = response.body().getResultData().getSoftwareUrl();
+                                                                } else {
+                                                                    url = RetrofitManager.BASE_URL.replaceAll("/$", "") + response.body().getResultData().getSoftwareUrl();
+                                                                }
+                                                                startDownload(url);
+                                                            }
+
+                                                            @Override
+                                                            public void onDenied() {
+
+                                                            }
+                                                        }).request();
+                                            }).show();
+                                }
+                            }
+                        }
+
+                        @Override
+                        public void onFailure(Call<UpdateInfo> call, Throwable t) {
+
+                        }
+                    });
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+
+//        PermissionUtils.permission(PermissionConstants.STORAGE)
+//                .rationale((activity, shouldRequest) -> new AlertDialog.Builder(activity, AlertDialog.THEME_DEVICE_DEFAULT_DARK)
+//                        .setTitle("无写入权限")
+//                        .setMessage("请前往设置打开存储权限")
+//                        .setNegativeButton("取消", (dialog, which) -> {
+//                            dialog.dismiss();
+//                            activity.finish();
+//                        })
+//                        .setPositiveButton("打开设置", (dialog, which) -> {
+//                            dialog.dismiss();
+//                            Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+//                            Uri uri = Uri.fromParts("package", getPackageName(), null);
+//                            intent.setData(uri);
+//                            intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+//                            intent.addCategory(Intent.CATEGORY_DEFAULT);
+//                            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+//                            intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
+//                            intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+//                            activity.startActivity(intent);
+//                            activity.finish();
+//                        }).show())
+//                .callback(new PermissionUtils.SimpleCallback() {
+//                    @Override
+//                    public void onGranted() {
+//                        startDownload("https://beautiful-nanjing.oss-cn-hangzhou.aliyuncs.com/Coolapk-v10.2-2005181-coolapk-app-release.apk");
+//                    }
 //
-//                        @Override
-//                        public void onFailure(Call<UpdateInfo> call, Throwable t) {
+//                    @Override
+//                    public void onDenied() {
 //
-//                        }
-//                    });
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        }
-//        startDownload("http://dl-cdn.coolapkmarket.com/down/apk_file/2020/0518/Coolapk-v10.2-2005181-coolapk-app-release.apk");
-        installApk(new File("file:///sdcard/Android/data/com.ht.gate/files/Download/1589872246972.apk"));
+//                    }
+//                }).request();
     }
 
     private void startDownload(String url) {
         FileDownloader.setup(SettingsActivity.this);
-        ProgressDialog progressDialog = new ProgressDialog(this, AlertDialog.THEME_DEVICE_DEFAULT_DARK);
-        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
-        progressDialog.setCanceledOnTouchOutside(false);
-        progressDialog.setCancelable(false);
-        progressDialog.setMessage("下载中");
-        progressDialog.setProgress(0);
         String ext = FilenameUtils.getExtension(url);
         String fileName = System.currentTimeMillis() + "." + ext;
-        progressDialog.show();
-        new DownloadTask.Builder(url, new File(PathUtils.getExternalAppDownloadPath()))
-                .setFilename(fileName)
-                // the minimal interval millisecond for callback progress
-                .setMinIntervalMillisCallbackProcess(16)
-                // ignore the same task has already completed in the past.
-                .setPassIfAlreadyCompleted(false)
-                .build()
-                .enqueue(new DownloadListener() {
-                    @Override
-                    public void taskStart(@NonNull DownloadTask task) {
+        String path = PathUtils.getExternalAppDownloadPath() + "/" + fileName;
+        BaseDownloadTask downloadTask = FileDownloader.getImpl().create(url).setPath(path).setListener(new FileDownloadListener() {
+            @Override
+            protected void pending(BaseDownloadTask task, int soFarBytes, int totalBytes) {
 
-                    }
-
-                    @Override
-                    public void connectTrialStart(@NonNull DownloadTask task, @NonNull Map<String, List<String>> requestHeaderFields) {
-
-                    }
-
-                    @Override
-                    public void connectTrialEnd(@NonNull DownloadTask task, int responseCode, @NonNull Map<String, List<String>> responseHeaderFields) {
-
-                    }
-
-                    @Override
-                    public void downloadFromBeginning(@NonNull DownloadTask task, @NonNull BreakpointInfo info, @NonNull ResumeFailedCause cause) {
-
-                    }
-
-                    @Override
-                    public void downloadFromBreakpoint(@NonNull DownloadTask task, @NonNull BreakpointInfo info) {
-
-                    }
-
-                    @Override
-                    public void connectStart(@NonNull DownloadTask task, int blockIndex, @NonNull Map<String, List<String>> requestHeaderFields) {
-
-                    }
-
-                    @Override
-                    public void connectEnd(@NonNull DownloadTask task, int blockIndex, int responseCode, @NonNull Map<String, List<String>> responseHeaderFields) {
-
-                    }
+            }
 
-                    @Override
-                    public void fetchStart(@NonNull DownloadTask task, int blockIndex, long contentLength) {
+            @Override
+            protected void progress(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+                progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
+                progressDialog.setProgress((int) (soFarBytes * 100L / totalBytes));
+            }
 
-                    }
+            @Override
+            protected void completed(BaseDownloadTask task) {
+                progressDialog.dismiss();
+                ToastUtils.showShort("下载完成");
+                installApk(new File(task.getPath()));
+            }
 
-                    @Override
-                    public void fetchProgress(@NonNull DownloadTask task, int blockIndex, long increaseBytes) {
-                        long total = StatusUtil.getCurrentInfo(task).getTotalLength();
-                        long current = StatusUtil.getCurrentInfo(task).getTotalOffset();
-                        if (total != 0)
-                            progressDialog.setProgress((int) (current * 100 / total));
-                    }
+            @Override
+            protected void paused(BaseDownloadTask task, int soFarBytes, int totalBytes) {
+            }
 
-                    @Override
-                    public void fetchEnd(@NonNull DownloadTask task, int blockIndex, long contentLength) {
-                        progressDialog.dismiss();
-                        Log.d("xxxx", "fetchEnd");
+            @Override
+            protected void error(BaseDownloadTask task, Throwable e) {
+                progressDialog.dismiss();
+                ToastUtils.showShort(e.getMessage());
+            }
 
-                        installApk(new File(PathUtils.getExternalAppDownloadPath() + fileName));
-                    }
+            @Override
+            protected void warn(BaseDownloadTask task) {
 
-                    @Override
-                    public void taskEnd(@NonNull DownloadTask task, @NonNull EndCause cause, @Nullable Exception realCause) {
-                        progressDialog.dismiss();
-                        Log.d("xxxx", "taskEnd");
-                    }
-                });
+            }
+        });
+        progressDialog.setButton(ProgressDialog.BUTTON_NEGATIVE, "取消下载", (dialog, which) -> {
+            downloadTask.pause();
+            progressDialog.dismiss();
+        });
+        progressDialog.setProgress(0);
+        progressDialog.show();
+        downloadTask.start();
     }
 
     private void installApk(File apkFile) {
-        Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
-        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
-        intent.setDataAndType(FileProvider.getUriForFile(SettingsActivity.this,
-                "com.ht.gate.fileProvider", apkFile), "application/vnd.android.package-archive");
-        startActivity(intent);
-//        AppUtils.installApp(apkFile);
+//        Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
+//        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+//        intent.setDataAndType(FileProvider.getUriForFile(SettingsActivity.this,
+//                "com.ht.gate.fileProvider", apkFile), "application/vnd.android.package-archive");
+//        startActivity(intent);
+        AppUtils.installApp(apkFile);
 //        try {
 //            installPackage(apkFile.getPath());
 //        } catch (IOException e) {

+ 11 - 0
app/src/main/res/xml/file_paths.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <paths>
+        <root-path
+            name="root"
+            path="" />
+        <files-path
+            name="download"
+            path="Download/" />
+    </paths>
+</resources>

+ 0 - 56
app/src/main/res/xml/file_provider.xml

@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <paths>
-        <root-path
-            name="root_path"
-            path="" />
-
-        <files-path
-            name="files_path"
-            path="." />
-
-        <cache-path
-            name="cache_path"
-            path="." />
-
-        <external-path
-            name="external_path"
-            path="." />
-
-        <external-files-path
-            name="external_files_path"
-            path="." />
-
-        <external-cache-path
-            name="external_cache_path"
-            path="." />
-
-        <external-media-path
-            name="external_media_path"
-            path="." />
-
-        <files-path
-            name="files_path1"
-            path="Android/data/com.ht.gate/files/Download" />
-
-        <cache-path
-            name="cache_path1"
-            path="Android/data/com.ht.gate/files/Download" />
-
-        <external-path
-            name="external_path1"
-            path="Android/data/com.ht.gate/files/Download" />
-
-        <external-files-path
-            name="external_files_path1"
-            path="Android/data/com.ht.gate/files/Download" />
-
-        <external-cache-path
-            name="external_cache_path1"
-            path="Android/data/com.ht.gate/files/Download" />
-
-        <external-media-path
-            name="external_media_path1"
-            path="Android/data/com.ht.gate/files/Download" />
-    </paths>
-</resources>