diff --git a/app/build.gradle b/app/build.gradle index 30f79f9..a748fd4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -139,5 +139,4 @@ dependencies { implementation 'xyz.doikki.android.dkplayer:dkplayer-ui:3.3.7' //可选,使用ijkplayer进行解码 implementation 'xyz.doikki.android.dkplayer:player-ijk:3.3.7' - } diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json deleted file mode 100644 index f4bfb59..0000000 --- a/app/release/output-metadata.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "version": 3, - "artifactType": { - "type": "APK", - "kind": "Directory" - }, - "applicationId": "com.tairui.industrial_operation", - "variantName": "release", - "elements": [ - { - "type": "SINGLE", - "filters": [], - "attributes": [], - "versionCode": 1, - "versionName": "1.0", - "outputFile": "IndustrialOperation_app_v1.0_20250610153115.apk" - } - ], - "elementType": "File" -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0807a1c..fd4679c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -144,6 +144,16 @@ android:exported="false" android:screenOrientation="portrait" /> + + + + \ No newline at end of file diff --git a/app/src/main/java/com/tairui/industrial_operation/entity/Api.java b/app/src/main/java/com/tairui/industrial_operation/entity/Api.java index fb81921..a38bc66 100644 --- a/app/src/main/java/com/tairui/industrial_operation/entity/Api.java +++ b/app/src/main/java/com/tairui/industrial_operation/entity/Api.java @@ -30,6 +30,8 @@ public class Api { public static final String REGISTER = BASE_HOST + "/auth/registerApp"; public static final String LOGIN = BASE_HOST + "/auth/login"; + public static final String UPDATE_APP = BASE_HOST + "/checkUpdate"; + public static final String HOME_GOODS_LIST = BASE_HOST + "/goods/goodInfoManage/transactionGoodInfo"; } diff --git a/app/src/main/java/com/tairui/industrial_operation/ui/MainActivity.java b/app/src/main/java/com/tairui/industrial_operation/ui/MainActivity.java index 2c56fb7..9b762e1 100644 --- a/app/src/main/java/com/tairui/industrial_operation/ui/MainActivity.java +++ b/app/src/main/java/com/tairui/industrial_operation/ui/MainActivity.java @@ -1,23 +1,41 @@ package com.tairui.industrial_operation.ui; +import java.io.File; import java.util.ArrayList; import com.flyco.tablayout.listener.CustomTabEntity; import com.flyco.tablayout.listener.OnTabSelectListener; import com.gyf.immersionbar.ImmersionBar; +import com.rxjava.rxlife.RxLife; +import com.tairui.industrial_operation.BuildConfig; import com.tairui.industrial_operation.R; import com.tairui.industrial_operation.base.BaseActivity; import com.tairui.industrial_operation.base.BaseFragment; import com.tairui.industrial_operation.base.adapter.TabFragmentPagerAdapter; import com.tairui.industrial_operation.databinding.ActivityMainBinding; +import com.tairui.industrial_operation.entity.Api; import com.tairui.industrial_operation.entity.TabEntity; +import com.tairui.industrial_operation.http.OnError; import com.tairui.industrial_operation.ui.home.HomeFragment; import com.tairui.industrial_operation.ui.my.MyFragment; import com.tairui.industrial_operation.ui.service.ServiceFragment; import com.tairui.industrial_operation.ui.shopping.ShoppingFragment; +import com.tairui.industrial_operation.util.DownloadUtil; +import com.tairui.industrial_operation.util.LogUtil; +import com.tairui.industrial_operation.util.NetUtil; +import com.tairui.industrial_operation.util.ToastUtil; +import com.tairui.industrial_operation.widget.CustomProgressDialog; +import android.app.AlertDialog; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; import android.os.Bundle; +import android.text.TextUtils; +import androidx.core.content.FileProvider; import androidx.viewpager.widget.ViewPager; +import io.reactivex.android.schedulers.AndroidSchedulers; +import rxhttp.RxHttp; public class MainActivity extends BaseActivity { @@ -28,6 +46,8 @@ public class MainActivity extends BaseActivity { private ArrayList mTabEntities = new ArrayList<>(); private TabFragmentPagerAdapter mPagerAdapter; + private CustomProgressDialog downloadDialog; + @Override protected void initStatusBar() { ImmersionBar.with(this).fitsSystemWindows(false).transparentStatusBar() @@ -111,4 +131,124 @@ public class MainActivity extends BaseActivity { }); } + @Override + protected void onApplyData() { + // getAppVersionInfo(); + } + + /** + * 获取线上APP的版本信息 + */ + private void getAppVersionInfo() { + RxHttp.get(Api.UPDATE_APP) + .asResponse(Object.class) + .as(RxLife.asOnMain(this)) + .subscribe(data -> { + //TODO + + }, (OnError) error -> { + LogUtil.e("getAppVersionInfo", error.getErrorMsg()); + }); + } + + /** + * @param grade app 的下载级别 + * @param appDownloadUrl app 的下载地址 + * @param remark 描述 + */ + private void showUpdateDialog(int grade, final String appDownloadUrl, String remark) { + if (grade == 1) { // 强制更新 + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(getString(R.string.str_hint_update)); + builder.setMessage(remark); + builder.setPositiveButton(getString(R.string.str_confirm), (dialog, which) -> { + if (!isFinishing()) { + doAppDownload(appDownloadUrl); + } + dialog.dismiss(); + }); + builder.setCancelable(false); + builder.create().show(); + + } else { // 非强制更新 + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(getString(R.string.str_hint_update)); + builder.setMessage(remark); + builder.setPositiveButton(getString(R.string.str_confirm), (dialog, which) -> { + if (!isFinishing()) { + doAppDownload(appDownloadUrl); + } + dialog.dismiss(); + }); + builder.setNegativeButton(getString(R.string.str_cancel), (dialog, which) -> { + }); + builder.create().show(); + } + } + + /** + * 下载新版本的apk + */ + private void doAppDownload(String appUrl) { + if (NetUtil.isNetworkConnected(this)) { + if (downloadDialog == null) { + downloadDialog = new CustomProgressDialog(this, getString(R.string.str_download_app)); + downloadDialog.setCancelable(false); + } + downloadDialog.show(); + //文件存储路径 + String dir = DownloadUtil.getDownloadDir(mContext); + String fileName = System.currentTimeMillis() + ".apk"; + String destPath = dir + "/" + fileName; + RxHttp.get(appUrl) + .asAppendDownload(destPath, AndroidSchedulers.mainThread(), progress -> { + //下载进度回调,0-100,仅在进度有更新时才会回调 + int currentProgress = progress.getProgress(); //当前进度 0-100 + long currentSize = progress.getCurrentSize(); //当前已下载的字节大小 + long totalSize = progress.getTotalSize(); //要下载的总字节大小 + if (null != downloadDialog) { + downloadDialog.setProgress(currentProgress); + } + }) //指定主线程回调 + .doFinally(() -> { + if (null != downloadDialog) { + downloadDialog.dismiss(); + } + }) + .subscribe(s -> { //s为String类型 + // 下载成功。进行安装 + if (!TextUtils.isEmpty(s)) { + installApk(new File(s)); + } + }, throwable -> { + if (null != downloadDialog) { + downloadDialog.dismiss(); + } + }); + } else { + ToastUtil.showShortToast(getString(R.string.network_error)); + } + } + + /** + * 安装 APK + */ + private void installApk(File file) { + try { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + Uri data; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + data = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".fileprovider", file); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + } else { + data = Uri.fromFile(file); + } + intent.setDataAndType(data, "application/vnd.android.package-archive"); + startActivity(intent); + } catch (Exception e) { + e.printStackTrace(); + } + } + } diff --git a/app/src/main/java/com/tairui/industrial_operation/util/DownloadUtil.java b/app/src/main/java/com/tairui/industrial_operation/util/DownloadUtil.java new file mode 100644 index 0000000..37ad3d0 --- /dev/null +++ b/app/src/main/java/com/tairui/industrial_operation/util/DownloadUtil.java @@ -0,0 +1,36 @@ +package com.tairui.industrial_operation.util; + +import android.content.Context; +import android.os.Environment; + +public class DownloadUtil { + + public static String getPictureDir(Context context) { + return context.getExternalFilesDir(Environment.DIRECTORY_PICTURES).getAbsolutePath(); + } + + public static String getMovieDir(Context context) { + return context.getExternalFilesDir(Environment.DIRECTORY_MOVIES).getAbsolutePath(); + } + + public static String getMusicDir(Context context) { + return context.getExternalFilesDir(Environment.DIRECTORY_MUSIC).getAbsolutePath(); + } + + public static String getDcimDir(Context context) { + return context.getExternalFilesDir(Environment.DIRECTORY_DCIM).getAbsolutePath(); + } + + public static String getDownloadDir(Context context) { + return context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(); + } + + public static String getDocumentsDir(Context context) { + return context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS).getAbsolutePath(); + } + + public static String getDbDir(Context context) { + return context.getExternalFilesDir("Databases").getAbsolutePath(); + } + +} diff --git a/app/src/main/java/com/tairui/industrial_operation/util/NetUtil.java b/app/src/main/java/com/tairui/industrial_operation/util/NetUtil.java new file mode 100644 index 0000000..fd285ed --- /dev/null +++ b/app/src/main/java/com/tairui/industrial_operation/util/NetUtil.java @@ -0,0 +1,89 @@ +package com.tairui.industrial_operation.util; + +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; + +/** + * 网络工具类 + * 判断是否有网络 + * 网络的状态 + */ + +public class NetUtil { + /** + * 判断网络连接状态 + * + * @param context 上下文对象 + * @return 网络是否连接 + */ + public static boolean isNetworkConnected(Context context) { + if (context != null) { + ConnectivityManager connectivityManager = (ConnectivityManager) context + .getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo networkInfo = connectivityManager + .getActiveNetworkInfo(); + if (networkInfo != null) { + return networkInfo.isAvailable(); + } + } + return false; + } + + /** + * 网络状态是否为 WIFI + * + * @param context 上下文对象 + * @return 是否 WIFI 网络 + */ + public static boolean isWifiConnected(Context context) { + if (context != null) { + ConnectivityManager mConnectivityManager = (ConnectivityManager) context + .getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo mWiFiNetworkInfo = mConnectivityManager + .getNetworkInfo(ConnectivityManager.TYPE_WIFI); + if (mWiFiNetworkInfo != null) { + return mWiFiNetworkInfo.isAvailable(); + } + } + return false; + } + + /** + * 网络状态是否为数据流量 + * + * @param context 上下文对象 + * @return 是否为数据流量 + */ + public static boolean isMobileConnected(Context context) { + if (context != null) { + ConnectivityManager mConnectivityManager = (ConnectivityManager) context + .getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo mMobileNetworkInfo = mConnectivityManager + .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); + if (mMobileNetworkInfo != null) { + return mMobileNetworkInfo.isAvailable(); + } + } + return false; + } + + /** + * 获取网络连接类型 + * + * @param context 上下文对象 + * @return 网络连接状态 + */ + public static int getConnectedType(Context context) { + if (context != null) { + ConnectivityManager mConnectivityManager = (ConnectivityManager) context + .getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo mNetworkInfo = mConnectivityManager + .getActiveNetworkInfo(); + if (mNetworkInfo != null && mNetworkInfo.isAvailable()) { + return mNetworkInfo.getType(); + } + } + return -1; + } +} diff --git a/app/src/main/java/com/tairui/industrial_operation/widget/CustomProgressDialog.java b/app/src/main/java/com/tairui/industrial_operation/widget/CustomProgressDialog.java new file mode 100644 index 0000000..5258207 --- /dev/null +++ b/app/src/main/java/com/tairui/industrial_operation/widget/CustomProgressDialog.java @@ -0,0 +1,37 @@ +package com.tairui.industrial_operation.widget; + +import android.app.ProgressDialog; +import android.content.Context; + +public class CustomProgressDialog extends ProgressDialog { + + public CustomProgressDialog(Context context) { + super(context); + setMessage("loading..."); + setMax(100); + setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + setCanceledOnTouchOutside(false); + setCancelable(true); + } + + public CustomProgressDialog(Context context, String title) { + super(context); + setMessage(title); + setMax(100); + setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + setCanceledOnTouchOutside(false); + setCancelable(true); + } + + @Override + public void dismiss() { + super.dismiss(); + setProgress(0); + } + + @Override + public void cancel() { + super.cancel(); + setProgress(0); + } +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d1aca93..45ffdb8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,4 +7,10 @@ 网络连接超时,请稍后再试 空空如也~ + + + 软件下载中... + 更新提示 + 确定 + 取消 diff --git a/app/src/main/res/xml/file_paths.xml b/app/src/main/res/xml/file_paths.xml new file mode 100644 index 0000000..dd8c046 --- /dev/null +++ b/app/src/main/res/xml/file_paths.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file