Ver Fonte

新增版本更新功能

yangyang há 1 ano atrás
pai
commit
c122e9b88b

+ 2 - 1
app/build.gradle

@@ -97,7 +97,7 @@ dependencies {
     implementation 'androidx.appcompat:appcompat:1.2.0'
     implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
     implementation project(path: ':selector')
-
+    implementation 'com.zhy:okhttputils:2.6.2'
 //    implementation rootProject.ext.dependencies.MVVMHabit
     //内存泄漏测试
 //    debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.3'
@@ -108,6 +108,7 @@ dependencies {
     implementation 'com.github.mcxtzhang:SwipeDelMenuLayout:V1.2.5'
     implementation 'com.google.android.flexbox:flexbox:3.0.0'
     implementation 'com.jakewharton:butterknife:10.2.3'
+    implementation project(path: ':xupdate-lib')
     annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'
     implementation files('libs\\IPlaySDK.jar')
 }

+ 32 - 1
app/src/main/java/com/goldze/mvvmhabit/app/AppApplication.java

@@ -6,13 +6,21 @@ import com.goldze.mvvmhabit.BuildConfig;
 import com.goldze.mvvmhabit.R;
 import com.goldze.mvvmhabit.service.MediaService;
 import com.goldze.mvvmhabit.ui.login.LoginActivity;
+import com.goldze.mvvmhabit.utils.OKHttpUpdateHttpService;
 import com.scwang.smart.refresh.footer.ClassicsFooter;
 import com.scwang.smart.refresh.header.ClassicsHeader;
 import com.scwang.smart.refresh.layout.SmartRefreshLayout;
+import com.xuexiang.xupdate.XUpdate;
+import com.xuexiang.xupdate.entity.UpdateError;
+import com.xuexiang.xupdate.listener.OnUpdateFailureListener;
+import com.xuexiang.xupdate.utils.UpdateUtils;
 
 import me.goldze.mvvmhabit.base.BaseApplication;
 import me.goldze.mvvmhabit.crash.CaocConfig;
 import me.goldze.mvvmhabit.utils.KLog;
+import me.goldze.mvvmhabit.utils.ToastUtils;
+
+import static com.xuexiang.xupdate.entity.UpdateError.ERROR.CHECK_NO_NEW_VERSION;
 
 /**
  * Created by goldze on 2017/7/16.
@@ -34,6 +42,29 @@ public class AppApplication extends BaseApplication {
         SmartRefreshLayout.setDefaultRefreshHeaderCreator((context, refreshLayout) -> new ClassicsHeader(context));
         SmartRefreshLayout.setDefaultRefreshFooterCreator((context, refreshLayout) -> new ClassicsFooter(context));
         startService(new Intent(this, MediaService.class));
+        initUpdate();
+    }
+
+    private void initUpdate() {
+        XUpdate.get()
+                .debug(true)
+                .isWifiOnly(false)                                               //默认设置只在wifi下检查版本更新
+                .isGet(true)                                                    //默认设置使用get请求检查版本
+                .isAutoMode(false)                                              //默认设置非自动模式,可根据具体使用配置
+                .param("versionCode", UpdateUtils.getVersionCode(this))
+                .param("versionName", UpdateUtils.getVersionName(this)) //设置默认公共请求参数
+                .param("appKey", getPackageName())
+                .setOnUpdateFailureListener(new OnUpdateFailureListener() {     //设置版本更新出错的监听
+                    @Override
+                    public void onFailure(UpdateError error) {
+                        if (error.getCode() != CHECK_NO_NEW_VERSION) {          //对不同错误进行处理
+                            ToastUtils.showShort(error.toString());
+                        }
+                    }
+                })
+                .supportSilentInstall(true)                                     //设置是否支持静默安装,默认是true
+                .setIUpdateHttpService(new OKHttpUpdateHttpService())           //这个必须设置!实现网络请求功能。
+                .init(this);
     }
 
     private void initCrash() {
@@ -44,7 +75,7 @@ public class AppApplication extends BaseApplication {
                 .showRestartButton(true) //是否显示重启按钮
                 .trackActivities(true) //是否跟踪Activity
                 .minTimeBetweenCrashesMs(2000) //崩溃的间隔时间(毫秒)
-                .errorDrawable(R.mipmap.ic_launcher) //错误图标
+                .errorDrawable(R.drawable.logo) //错误图标
                 .restartActivity(LoginActivity.class) //重新启动后的activity
 //                .errorActivity(YourCustomErrorActivity.class) //崩溃后的错误activity
 //                .eventListener(new YourCustomEventListener()) //崩溃后的错误监听

+ 1 - 2
app/src/main/java/com/goldze/mvvmhabit/ui/login/LoginViewModel.java

@@ -167,12 +167,11 @@ public class LoginViewModel extends BaseViewModel<HttpModelRepository> {
                                 SPUtil.newInstance().saveData(SPUtil.phone,userName.get());
                                 SPUtil.newInstance().saveData(SPUtil.user,password.get());
                                 JSONObject user = object.getJSONObject("user");
+//                                SPUtil.newInstance().saveData(SPUtil.appUpdateVersion,data.getAppUpdateVersion());
                                 SPUtil.newInstance().saveData(SPUtil.tAppID,user.optString("sdkAppId"));
                                 SPUtil.newInstance().saveData(SPUtil.tSecretKey,user.optString("ttlSignKey"));
                                 LoginTask loginTask = new LoginTask();
                                 loginTask.execute();
-//                                startActivity(MainActivity.class);
-//                                finish();
                             }else {
                                 ToastUtils.showShort(object.optString("msg"));
                             }

+ 13 - 0
app/src/main/java/com/goldze/mvvmhabit/ui/main/activity/MainActivity.java

@@ -6,6 +6,7 @@ import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.graphics.Color;
 import android.graphics.drawable.ColorDrawable;
+import android.os.Build;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.Gravity;
@@ -39,20 +40,24 @@ import com.goldze.mvvmhabit.ui.main.fragment.WarningFragment;
 import com.goldze.mvvmhabit.utils.SPUtil;
 import com.goldze.mvvmhabit.utils.common.NetSDKLib;
 import com.goldze.mvvmhabit.utils.constant.Config;
+import com.xuexiang.xupdate.XUpdate;
 
 import java.util.ArrayList;
 import java.util.List;
 
+import androidx.annotation.RequiresApi;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentTransaction;
 import androidx.lifecycle.Observer;
 import androidx.lifecycle.ViewModelProviders;
 import me.goldze.mvvmhabit.base.BaseActivity;
+import me.goldze.mvvmhabit.utils.constant.ConstantPool;
 import me.majiajie.pagerbottomtabstrip.NavigationController;
 import me.majiajie.pagerbottomtabstrip.item.BaseTabItem;
 import me.majiajie.pagerbottomtabstrip.item.NormalItemView;
 import me.majiajie.pagerbottomtabstrip.listener.OnTabItemSelectedListener;
 
+@RequiresApi(api = Build.VERSION_CODES.M)
 public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewModel> {
 
     private List<Fragment> mFragments;
@@ -74,6 +79,14 @@ public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewMode
         //初始化底部Button
         initBottomTab();
         initAccessToken();
+        initUpdate();
+    }
+
+    private void initUpdate() {
+        XUpdate.newBuild(this)
+                .param("appRegion", "testdm")
+                .updateUrl(ConstantPool.updateBaseUrl)
+                .update();
     }
 
     @Override

+ 147 - 0
app/src/main/java/com/goldze/mvvmhabit/utils/OKHttpUpdateHttpService.java

@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2018 xuexiangjys(xuexiangjys@163.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.goldze.mvvmhabit.utils;
+
+import com.google.gson.Gson;
+import com.xuexiang.xupdate.proxy.IUpdateHttpService;
+import com.zhy.http.okhttp.OkHttpUtils;
+import com.zhy.http.okhttp.callback.FileCallBack;
+import com.zhy.http.okhttp.callback.StringCallback;
+import com.zhy.http.okhttp.request.RequestCall;
+
+import java.io.File;
+import java.util.Map;
+import java.util.TreeMap;
+
+import androidx.annotation.NonNull;
+import okhttp3.Call;
+import okhttp3.MediaType;
+import okhttp3.Request;
+
+/**
+ * 使用okhttp
+ *
+ * @author xuexiang
+ * @since 2018/7/10 下午4:04
+ */
+public class OKHttpUpdateHttpService implements IUpdateHttpService {
+
+    private boolean mIsPostJson;
+
+    public OKHttpUpdateHttpService() {
+        this(false);
+    }
+
+    public OKHttpUpdateHttpService(boolean isPostJson) {
+        mIsPostJson = isPostJson;
+    }
+
+
+    @Override
+    public void asyncGet(@NonNull String url, @NonNull Map<String, Object> params, final @NonNull Callback callBack) {
+        OkHttpUtils.get()
+                .url(url)
+                .params(transform(params))
+                .build()
+                .execute(new StringCallback() {
+                    @Override
+                    public void onError(Call call, Exception e, int id) {
+                        callBack.onError(e);
+                    }
+
+                    @Override
+                    public void onResponse(String response, int id) {
+                        callBack.onSuccess(response);
+                    }
+                });
+    }
+
+    @Override
+    public void asyncPost(@NonNull String url, @NonNull Map<String, Object> params, final @NonNull Callback callBack) {
+        //这里默认post的是Form格式,使用json格式的请修改 post -> postString
+        RequestCall requestCall;
+        if (mIsPostJson) {
+            requestCall = OkHttpUtils.postString()
+                    .url(url)
+                    .content(new Gson().toJson(params))
+                    .mediaType(MediaType.parse("application/json; charset=utf-8"))
+                    .build();
+        } else {
+            requestCall = OkHttpUtils.post()
+                    .url(url)
+                    .params(transform(params))
+                    .build();
+        }
+        requestCall
+                .execute(new StringCallback() {
+                    @Override
+                    public void onError(Call call, Exception e, int id) {
+                        callBack.onError(e);
+                    }
+
+                    @Override
+                    public void onResponse(String response, int id) {
+                        callBack.onSuccess(response);
+                    }
+                });
+    }
+
+    @Override
+    public void download(@NonNull String url, @NonNull String path, @NonNull String fileName, final @NonNull DownloadCallback callback) {
+        OkHttpUtils.get()
+                .url(url)
+                .tag(url)
+                .build()
+                .execute(new FileCallBack(path, fileName) {
+                    @Override
+                    public void inProgress(float progress, long total, int id) {
+                        callback.onProgress(progress, total);
+                    }
+
+                    @Override
+                    public void onError(Call call, Exception e, int id) {
+                        callback.onError(e);
+                    }
+
+                    @Override
+                    public void onResponse(File response, int id) {
+                        callback.onSuccess(response);
+                    }
+
+                    @Override
+                    public void onBefore(Request request, int id) {
+                        super.onBefore(request, id);
+                        callback.onStart();
+                    }
+                });
+    }
+
+    @Override
+    public void cancelDownload(@NonNull String url) {
+        OkHttpUtils.getInstance().cancelTag(url);
+    }
+
+    private Map<String, String> transform(Map<String, Object> params) {
+        Map<String, String> map = new TreeMap<>();
+        for (Map.Entry<String, Object> entry : params.entrySet()) {
+            map.put(entry.getKey(), entry.getValue().toString());
+        }
+        return map;
+    }
+
+
+}

+ 2 - 2
config.gradle

@@ -6,8 +6,8 @@ ext {
             applicationId    : "com.rk.temple",
             minSdkVersion    : 18,
             targetSdkVersion : 30,
-            versionCode      : 1,
-            versionName      : "1.0",
+            versionCode      : 3,
+            versionName      : "1.2",
     ]
     //version配置
     versions = [

+ 5 - 0
mvvmhabit/src/main/java/me/goldze/mvvmhabit/utils/constant/ConstantPool.java

@@ -0,0 +1,5 @@
+package me.goldze.mvvmhabit.utils.constant;
+
+public final class ConstantPool {
+    public static final String updateBaseUrl = "https://flowbb.top:6001/sp/phone/download";
+}

+ 1 - 0
settings.gradle

@@ -1,3 +1,4 @@
 include ':app', ':mvvmhabit'
 include ':ocr_ui'
 include ':selector'
+include ':xupdate-lib'