Procházet zdrojové kódy

1.新增 版本更新功能

ZhangXinYu před 6 roky
rodič
revize
35a9d8d8d6

+ 1 - 1
app/build.gradle

@@ -24,7 +24,7 @@ android {
         targetSdkVersion rootProject.ext.targetSdkVersion
         multiDexEnabled true
         versionCode 1
-        versionName "1.0"
+        versionName "1.0.0"
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
         flavorDimensions "versionCode"
         ndk {

+ 9 - 3
app/src/main/AndroidManifest.xml

@@ -79,16 +79,22 @@
         <activity
             android:name=".ui.activity.image.CropperImageActivity"
             android:screenOrientation="portrait" />
-
+        <!--app 更新-->
         <provider
             android:name="android.support.v4.content.FileProvider"
-            android:authorities="${applicationId}.provider"
+            android:authorities="${applicationId}.update"
             android:exported="false"
             android:grantUriPermissions="true">
+            <!--元数据-->
             <meta-data
                 android:name="android.support.FILE_PROVIDER_PATHS"
-                android:resource="@xml/provider_paths" />
+                android:resource="@xml/file_paths" />
         </provider>
+        <receiver android:name=".broadcast.DownLoadBroadcastReceiver">
+            <intent-filter>
+                <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
+            </intent-filter>
+        </receiver>
     </application>
 
 </manifest>

+ 3 - 3
app/src/main/java/com/webrain/happywork/bean/VersionBean.java

@@ -5,7 +5,7 @@ public class VersionBean {
     private String version;
     private String description;
     private String downUrl;
-    private boolean isForceUpdate;
+    private int isForceUpdate;//0强制更新,1不强制更新
 
     public String getTitle() {
         return title;
@@ -39,11 +39,11 @@ public class VersionBean {
         this.downUrl = downUrl;
     }
 
-    public boolean isForceUpdate() {
+    public int isForceUpdate() {
         return isForceUpdate;
     }
 
-    public void setIsForceUpdate(boolean isForceUpdate) {
+    public void setIsForceUpdate(int isForceUpdate) {
         this.isForceUpdate = isForceUpdate;
     }
 }

+ 25 - 0
app/src/main/java/com/webrain/happywork/bean/api/ApiCheckVersion.java

@@ -0,0 +1,25 @@
+package com.webrain.happywork.bean.api;
+
+
+import com.webrain.happywork.bean.VersionBean;
+
+public class ApiCheckVersion {
+    private boolean isLatest;
+    private VersionBean hwVersion;
+
+    public boolean isLatest() {
+        return isLatest;
+    }
+
+    public void setLatest(boolean latest) {
+        isLatest = latest;
+    }
+
+    public VersionBean getHwVersion() {
+        return hwVersion;
+    }
+
+    public void setHwVersion(VersionBean hwVersion) {
+        this.hwVersion = hwVersion;
+    }
+}

+ 72 - 0
app/src/main/java/com/webrain/happywork/broadcast/DownLoadBroadcastReceiver.java

@@ -0,0 +1,72 @@
+package com.webrain.happywork.broadcast;
+
+import android.annotation.SuppressLint;
+import android.app.DownloadManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Environment;
+import android.support.v4.content.FileProvider;
+
+
+import com.webrain.baselibrary.utils.AppUtils;
+import com.webrain.baselibrary.utils.SharedPreferencesUtils;
+import com.webrain.happywork.R;
+import com.webrain.happywork.utils.FileUtils;
+
+import java.io.File;
+
+/**
+ * 监听下载广播如果是本APP更新版本下载则跳出安装界面
+ */
+public class DownLoadBroadcastReceiver extends BroadcastReceiver {
+
+    @SuppressLint("NewApi")
+    public void onReceive(final Context context, Intent intent) {
+        final long myDwonloadID = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
+        long refernece = SharedPreferencesUtils.getAppUpdateDownloadId(context);
+        if (refernece == myDwonloadID) {
+            File file = FileUtils.getFileFromPath(getDownloadFileName(context));
+            if (file != null)
+                install(context, file);
+        }
+    }
+
+    /**
+     * 安装
+     *
+     * @param file
+     */
+    private void install(Context mContext, File file) {
+        //7.0以上通过FileProvider
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            Uri apkUri = FileProvider.getUriForFile(mContext, AppUtils.getPackageName(mContext) + ".update", file);
+            Intent intent = new Intent(Intent.ACTION_VIEW);
+            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+            mContext.grantUriPermission(AppUtils.getPackageName(mContext), Uri.fromFile(file), Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
+            intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
+            mContext.startActivity(intent);
+        } else {
+            Intent intent = new Intent(Intent.ACTION_VIEW);
+            intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
+            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            mContext.startActivity(intent);
+        }
+    }
+
+    /**
+     * 获取下载文件名称
+     *
+     * @return
+     */
+    private String getDownloadFileName(Context mContext) {
+        File f = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
+        if (!f.exists()) {
+            f.mkdirs();
+        }
+        return f.getAbsolutePath() + File.separator + mContext.getString(R.string.install_name) + ".apk";
+    }
+}

+ 6 - 0
app/src/main/java/com/webrain/happywork/http/Api.java

@@ -4,6 +4,7 @@ import com.webrain.happywork.bean.AuthCodeBean;
 import com.webrain.happywork.bean.api.ApiApplyListBean;
 import com.webrain.happywork.bean.api.ApiAvatarBean;
 import com.webrain.happywork.bean.api.ApiBannerBean;
+import com.webrain.happywork.bean.api.ApiCheckVersion;
 import com.webrain.happywork.bean.api.ApiLoginBean;
 import com.webrain.happywork.bean.api.ApiOrderDetailBean;
 import com.webrain.happywork.bean.api.ApiOrderListBean;
@@ -102,4 +103,9 @@ public class Api {
         Observable<ApiResultBean<ApiRecordDetailBean>> getPaymentDetail(@QueryMap Map<String, Object> args);
     }
 
+    public interface VersionInterface {
+        //检查更新
+        @GET("api/hwVersion/checkVersion")
+        Observable<ApiResultBean<ApiCheckVersion>> checkVersion(@QueryMap Map<String, Object> args);
+    }
 }

+ 32 - 0
app/src/main/java/com/webrain/happywork/http/subscribe/VersionSubscribe.java

@@ -0,0 +1,32 @@
+package com.webrain.happywork.http.subscribe;
+
+import android.content.Context;
+
+import com.webrain.happywork.bean.api.ApiCheckVersion;
+import com.webrain.happywork.bean.base.ApiResultBean;
+import com.webrain.happywork.http.Api;
+import com.webrain.happywork.http.ApiObserver;
+import com.webrain.happywork.http.ServiceGenerator;
+
+import java.util.Map;
+
+import io.reactivex.Observable;
+
+public class VersionSubscribe extends BaseSubscribe {
+
+    public VersionSubscribe(Context context) {
+        super(context);
+    }
+
+    /**
+     * 检查版本更新
+     *
+     * @param args
+     * @param mObservable
+     */
+    public void requestCheckVersion(Map<String, Object> args, ApiObserver<ApiCheckVersion> mObservable) {
+        Api.VersionInterface apiService = ServiceGenerator.createService(Api.VersionInterface.class);
+        Observable<ApiResultBean<ApiCheckVersion>> observable = apiService.checkVersion(args);
+        subscribe(observable, mObservable);
+    }
+}

+ 0 - 1
app/src/main/java/com/webrain/happywork/ui/activity/MainActivity.java

@@ -91,7 +91,6 @@ public class MainActivity extends BaseActivity<MainPresenter> implements MainCon
         initView();
         setTitle(R.string.need_home);
         setActionBarMenu(onActionBarMenuClickListener, R.mipmap.ic_mine_center);
-        new UpdateAppDialog(mContext, null).show();
     }
 
     @Override

+ 9 - 5
app/src/main/java/com/webrain/happywork/ui/activity/MineCenterActivity.java

@@ -1,7 +1,6 @@
 package com.webrain.happywork.ui.activity;
 
 import android.content.Intent;
-import android.media.Image;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.ImageView;
@@ -10,17 +9,14 @@ import android.widget.TextView;
 
 import com.webrain.baselibrary.EventConstant;
 import com.webrain.baselibrary.event.StringEvent;
-import com.webrain.baselibrary.event.TagValueEvent;
 import com.webrain.baselibrary.imageloader.ImageLoaderUtil;
 import com.webrain.happywork.AppCacheManager;
-import com.webrain.happywork.BuildConfig;
 import com.webrain.happywork.R;
 import com.webrain.happywork.bean.UserBean;
 import com.webrain.happywork.ui.base.BaseActivity;
 import com.webrain.happywork.ui.mvp.contacts.MineCenterContacts;
 import com.webrain.happywork.ui.mvp.presenter.MineCenterPresenter;
 import com.webrain.happywork.ui.widget.dialog.SureDialog;
-import com.webrain.happywork.utils.FileUtils;
 
 import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
@@ -43,9 +39,14 @@ public class MineCenterActivity extends BaseActivity<MineCenterPresenter> implem
     LinearLayout llPaymentRecord;
     @BindView(R.id.ll_tax)
     LinearLayout llTax;
+    @BindView(R.id.ll_version)
+    LinearLayout llVersion;
+    @BindView(R.id.tv_logout)
+    TextView tvLogout;
 
     SureDialog mLogoutDialog;
 
+
     @Override
     public int getLayoutId() {
         return R.layout.activity_mine_center;
@@ -64,7 +65,7 @@ public class MineCenterActivity extends BaseActivity<MineCenterPresenter> implem
         mvpPresenter.init();
     }
 
-    @OnClick({R.id.ll_apply, R.id.ll_order, R.id.ll_payment_record, R.id.ll_tax, R.id.iv_header, R.id.tv_logout})
+    @OnClick({R.id.ll_apply, R.id.ll_order, R.id.ll_payment_record, R.id.ll_tax, R.id.iv_header, R.id.ll_version,R.id.tv_logout})
     public void onClick(View view) {
         switch (view.getId()) {
             case R.id.ll_apply:
@@ -82,6 +83,9 @@ public class MineCenterActivity extends BaseActivity<MineCenterPresenter> implem
             case R.id.ll_tax:
                 startActivity(new Intent(mContext, MineTaxPaymentCertificateActivity.class));
                 break;
+            case R.id.ll_version:
+                mvpPresenter.checkUpdate();
+                break;
             case R.id.tv_logout:
                 if (mLogoutDialog == null) {
                     mLogoutDialog = new SureDialog(mContext);

+ 5 - 0
app/src/main/java/com/webrain/happywork/ui/mvp/contacts/MainContacts.java

@@ -5,6 +5,7 @@ import com.webrain.happywork.bean.BaseInformationBean;
 import com.webrain.happywork.bean.CityBean;
 import com.webrain.happywork.bean.ProvinceBean;
 import com.webrain.happywork.bean.RequirementBean;
+import com.webrain.happywork.bean.VersionBean;
 import com.webrain.happywork.bean.base.ApiNormalBean;
 import com.webrain.happywork.callback.MvpDataCallBack;
 import com.webrain.happywork.ui.base.IPresenter;
@@ -34,6 +35,8 @@ public class MainContacts {
 
         void checkQuit();//检查退出
 
+        void checkUpdate();
+
         void init();
     }
 
@@ -54,5 +57,7 @@ public class MainContacts {
         void changeBusiness(BaseInformationBean baseInformationBean);
 
         void changePrice(BaseInformationBean baseInformationBean);
+
+        void httpCheckUpdate(MvpDataCallBack<VersionBean> callBack);
     }
 }

+ 5 - 0
app/src/main/java/com/webrain/happywork/ui/mvp/contacts/MineCenterContacts.java

@@ -1,6 +1,7 @@
 package com.webrain.happywork.ui.mvp.contacts;
 
 import com.webrain.happywork.bean.UserBean;
+import com.webrain.happywork.bean.VersionBean;
 import com.webrain.happywork.callback.MvpDataCallBack;
 import com.webrain.happywork.ui.base.IPresenter;
 import com.webrain.happywork.ui.base.IView;
@@ -16,6 +17,8 @@ public class MineCenterContacts {
         void getUserBean();
 
         void getHttpUserBean();
+
+        void checkUpdate();
     }
 
     public interface IMineCenterModel {
@@ -23,5 +26,7 @@ public class MineCenterContacts {
 
         UserBean getUserBean();
 
+        void httpCheckUpdate(MvpDataCallBack<VersionBean> callBack);
+
     }
 }

+ 29 - 0
app/src/main/java/com/webrain/happywork/ui/mvp/model/MainModel.java

@@ -4,13 +4,16 @@ package com.webrain.happywork.ui.mvp.model;
 import android.content.Context;
 import android.text.TextUtils;
 
+import com.webrain.baselibrary.utils.AppUtils;
 import com.webrain.happywork.AppCacheManager;
 import com.webrain.happywork.bean.AreaBean;
 import com.webrain.happywork.bean.BaseInformationBean;
 import com.webrain.happywork.bean.CityBean;
 import com.webrain.happywork.bean.ProvinceBean;
 import com.webrain.happywork.bean.RequirementBean;
+import com.webrain.happywork.bean.VersionBean;
 import com.webrain.happywork.bean.api.ApiBannerBean;
+import com.webrain.happywork.bean.api.ApiCheckVersion;
 import com.webrain.happywork.bean.api.ApiRequirementListBean;
 import com.webrain.happywork.bean.base.ApiNormalBean;
 import com.webrain.happywork.callback.MvpDataCallBack;
@@ -19,6 +22,7 @@ import com.webrain.happywork.http.RetrofitHttpParams;
 import com.webrain.happywork.http.exception.ApiException;
 import com.webrain.happywork.http.subscribe.RequirementSubscribe;
 import com.webrain.happywork.http.subscribe.UserSubscribe;
+import com.webrain.happywork.http.subscribe.VersionSubscribe;
 import com.webrain.happywork.ui.base.BaseModel;
 import com.webrain.happywork.ui.mvp.contacts.MainContacts;
 
@@ -197,4 +201,29 @@ public class MainModel extends BaseModel implements MainContacts.IMainModel {
             priceType = baseInformationBean.getCode();
         }
     }
+
+
+    /**
+     * 检查最新版本号
+     *
+     * @param callBack
+     */
+    @Override
+    public void httpCheckUpdate(final MvpDataCallBack<VersionBean> callBack) {
+        RetrofitHttpParams params = new RetrofitHttpParams(mContext);
+        params.put("version", AppUtils.getVersionName(mContext));
+        params.put("app_system", 0);//表示Android系统
+        new VersionSubscribe(mContext).requestCheckVersion(params.getRequestParams(), new ApiObserver<ApiCheckVersion>(mContext) {
+            @Override
+            public void onSuccess(ApiCheckVersion data) {
+                if (data != null && !data.isLatest() && data.getHwVersion() != null) {
+                    callBack.onData(data.getHwVersion());
+                }
+            }
+
+            @Override
+            public void onFinish() {
+            }
+        });
+    }
 }

+ 28 - 0
app/src/main/java/com/webrain/happywork/ui/mvp/model/MineCenterModel.java

@@ -3,13 +3,17 @@ package com.webrain.happywork.ui.mvp.model;
 
 import android.content.Context;
 
+import com.webrain.baselibrary.utils.AppUtils;
 import com.webrain.happywork.AppCacheManager;
 import com.webrain.happywork.bean.UserBean;
+import com.webrain.happywork.bean.VersionBean;
+import com.webrain.happywork.bean.api.ApiCheckVersion;
 import com.webrain.happywork.bean.api.ApiUserBean;
 import com.webrain.happywork.callback.MvpDataCallBack;
 import com.webrain.happywork.http.ApiObserver;
 import com.webrain.happywork.http.RetrofitHttpParams;
 import com.webrain.happywork.http.subscribe.UserSubscribe;
+import com.webrain.happywork.http.subscribe.VersionSubscribe;
 import com.webrain.happywork.ui.base.BaseModel;
 import com.webrain.happywork.ui.mvp.contacts.MineCenterContacts;
 
@@ -51,4 +55,28 @@ public class MineCenterModel extends BaseModel implements MineCenterContacts.IMi
     public UserBean getUserBean() {
         return AppCacheManager.getInstance().getLoginModel();
     }
+
+    /**
+     * 检查最新版本号
+     *
+     * @param callBack
+     */
+    @Override
+    public void httpCheckUpdate(final MvpDataCallBack<VersionBean> callBack) {
+        RetrofitHttpParams params = new RetrofitHttpParams(mContext);
+        params.put("version", AppUtils.getVersionName(mContext));
+        params.put("app_system", 0);//表示Android系统
+        new VersionSubscribe(mContext).requestCheckVersion(params.getRequestParams(), new ApiObserver<ApiCheckVersion>(mContext) {
+            @Override
+            public void onSuccess(ApiCheckVersion data) {
+                if (data != null && !data.isLatest() && data.getHwVersion() != null) {
+                    callBack.onData(data.getHwVersion());
+                }
+            }
+
+            @Override
+            public void onFinish() {
+            }
+        });
+    }
 }

+ 19 - 0
app/src/main/java/com/webrain/happywork/ui/mvp/presenter/MainPresenter.java

@@ -10,6 +10,7 @@ import com.webrain.happywork.bean.BaseInformationBean;
 import com.webrain.happywork.bean.CityBean;
 import com.webrain.happywork.bean.ProvinceBean;
 import com.webrain.happywork.bean.RequirementBean;
+import com.webrain.happywork.bean.VersionBean;
 import com.webrain.happywork.bean.base.ApiNormalBean;
 import com.webrain.happywork.callback.MvpDataCallBack;
 import com.webrain.happywork.http.Api;
@@ -18,6 +19,7 @@ import com.webrain.happywork.ui.activity.MainActivity;
 import com.webrain.happywork.ui.base.BasePresenter;
 import com.webrain.happywork.ui.mvp.contacts.MainContacts;
 import com.webrain.happywork.ui.mvp.model.MainModel;
+import com.webrain.happywork.ui.widget.dialog.UpdateAppDialog;
 
 import java.util.List;
 import java.util.concurrent.TimeUnit;
@@ -134,6 +136,7 @@ public class MainPresenter extends BasePresenter<MainActivity> implements MainCo
         if (isViewAttach()) {
             getRequirements(true, false);
             getBanner();
+            checkUpdate();
         }
     }
 
@@ -175,4 +178,20 @@ public class MainPresenter extends BasePresenter<MainActivity> implements MainCo
             }
     }
 
+    /**
+     * 检查更新
+     */
+    @Override
+    public void checkUpdate() {
+        if (isViewAttach()) {
+            mMainModel.httpCheckUpdate(new MvpDataCallBack<VersionBean>() {
+                @Override
+                public void onData(VersionBean data) {
+                    if (isViewAttach())
+                        new UpdateAppDialog(mvpReference.get(), data).show();
+                }
+            });
+        }
+    }
+
 }

+ 19 - 0
app/src/main/java/com/webrain/happywork/ui/mvp/presenter/MineCenterPresenter.java

@@ -1,11 +1,13 @@
 package com.webrain.happywork.ui.mvp.presenter;
 
 
+import com.webrain.happywork.bean.VersionBean;
 import com.webrain.happywork.callback.MvpDataCallBack;
 import com.webrain.happywork.ui.activity.MineCenterActivity;
 import com.webrain.happywork.ui.base.BasePresenter;
 import com.webrain.happywork.ui.mvp.contacts.MineCenterContacts;
 import com.webrain.happywork.ui.mvp.model.MineCenterModel;
+import com.webrain.happywork.ui.widget.dialog.UpdateAppDialog;
 
 public class MineCenterPresenter extends BasePresenter<MineCenterActivity> implements MineCenterContacts.IMineCenterPresenter {
     private MineCenterModel mMineCenterModel;
@@ -48,4 +50,21 @@ public class MineCenterPresenter extends BasePresenter<MineCenterActivity> imple
             });
         }
     }
+
+
+    /**
+     * 检查更新
+     */
+    @Override
+    public void checkUpdate() {
+        if (isViewAttach()) {
+            mMineCenterModel.httpCheckUpdate(new MvpDataCallBack<VersionBean>() {
+                @Override
+                public void onData(VersionBean data) {
+                    if (isViewAttach())
+                        new UpdateAppDialog(mvpReference.get(), data).show();
+                }
+            });
+        }
+    }
 }

+ 4 - 4
app/src/main/java/com/webrain/happywork/ui/widget/dialog/UpdateAppDialog.java

@@ -100,7 +100,7 @@ public class UpdateAppDialog {
                         public void accept(Boolean aBoolean) throws Exception {
                             if (aBoolean) {
                                 updateApk();
-                                if (!mBean.isForceUpdate())
+                                if (mBean.isForceUpdate() == 0)
                                     mDialog.dismiss();
                             }
                         }
@@ -115,13 +115,13 @@ public class UpdateAppDialog {
 
         public void initView() {
             if (mBean != null) {
-                mDialog.setCancelable(!mBean.isForceUpdate());
-                mDialog.setCanceledOnTouchOutside(!mBean.isForceUpdate());
+                mDialog.setCancelable(mBean.isForceUpdate() == 0);
+                mDialog.setCanceledOnTouchOutside(mBean.isForceUpdate() == 0);
                 if (!TextUtils.isEmpty(mBean.getDescription()))
                     tvContent.setText(Html.fromHtml(mBean.getDescription()));
                 else
                     tvContent.setText("");
-                if (mBean.isForceUpdate()) {
+                if (mBean.isForceUpdate() == 1) {
                     tvWait.setVisibility(View.GONE);
                     tvUpdate.setBackgroundResource(R.drawable.corners_purple_82_bottom_5dp);
                 }

+ 1 - 1
app/src/main/java/com/webrain/happywork/utils/FileUtils.java

@@ -291,7 +291,7 @@ public class FileUtils {
             // 获取文件file的MIME类型
             types = getMIMEType(file);
             // 设置intent的data和Type属性。
-            intent.setDataAndType(FileProvider.getUriForFile(activity, activity.getApplicationContext().getPackageName() + ".provider", file), types);
+            intent.setDataAndType(FileProvider.getUriForFile(activity, activity.getApplicationContext().getPackageName() + ".update", file), types);
             // 跳转
             activity.startActivity(intent);
             // }

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

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