From f0ee9101915332cd505d8384a6b5868a72d31bc5 Mon Sep 17 00:00:00 2001 From: tongtongstudio Date: Mon, 2 Mar 2026 17:21:22 +0800 Subject: [PATCH] =?UTF-8?q?version:1.2.3=20fix:=20update:=E5=BF=85?= =?UTF-8?q?=E5=A4=87=E7=BB=84=E4=BB=B6=E5=A2=9E=E5=8A=A0=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=8A=B6=E6=80=81=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=BF=85=E5=A4=87?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- .../activity/download/DownloadActivity.java | 8 +++ .../activity/download/DownloadViewModel.java | 22 ++++++ .../xwad/os/activity/home/HomeActivity.java | 7 +- .../xwad/os/activity/home/HomeViewModel.java | 3 +- .../login/result/LoginSuccessfulActivity.java | 11 ++- .../result/LoginSuccessfulViewModel.java | 59 ++++++++++++++++ .../xwad/os/activity/user/UserActivity.java | 6 +- .../com/xwad/os/adapter/AppInfoAdapter.java | 17 ++++- .../java/com/xwad/os/config/CommonConfig.java | 13 ++++ .../xwad/os/fragment/mine/MineFragment.java | 15 ++++ .../usercenter/account/AccountFragment.java | 2 +- .../xwad/os/service/main/MainSPresenter.java | 17 +++++ .../com/xwad/os/service/main/MainService.java | 1 + .../main/java/com/xwad/os/utils/ApkUtils.java | 6 +- .../java/com/xwad/os/utils/OpenApkUtils.java | 44 ++++++++---- app/src/main/res/drawable/ic_update.xml | 9 +++ app/src/main/res/layout/activity_download.xml | 70 ++++++++++++++++++- .../main/res/layout/activity_other_app.xml | 2 +- .../main/res/layout/dialog_default_apps.xml | 2 +- app/src/main/res/layout/fragment_mine.xml | 2 +- app/src/main/res/layout/item_app_info.xml | 21 ++++-- app/src/main/res/values/strings.xml | 1 + 23 files changed, 301 insertions(+), 41 deletions(-) create mode 100644 app/src/main/res/drawable/ic_update.xml diff --git a/app/build.gradle b/app/build.gradle index f5c9295..8243dfe 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { minSdkVersion 23 targetSdkVersion 29 - versionCode 23 - versionName "1.2.2" + versionCode 24 + versionName "1.2.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/com/xwad/os/activity/download/DownloadActivity.java b/app/src/main/java/com/xwad/os/activity/download/DownloadActivity.java index 0079433..1cba80a 100644 --- a/app/src/main/java/com/xwad/os/activity/download/DownloadActivity.java +++ b/app/src/main/java/com/xwad/os/activity/download/DownloadActivity.java @@ -4,7 +4,11 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.graphics.Color; +import android.text.SpannableString; +import android.text.Spanned; import android.text.TextUtils; +import android.text.style.ForegroundColorSpan; import android.util.Log; import android.view.View; @@ -51,6 +55,10 @@ public class DownloadActivity extends BaseMvvmActivity { + MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + @Override public ActivityDownloadBinding getVDBinding() { return binding; @@ -70,6 +76,22 @@ public class DownloadViewModel extends BaseViewModel packageSets = appInfoList.stream() + .filter(new Predicate() { + @Override + public boolean test(AppInfo appInfo) { + return appInfo.getIs_must_components() == 1; + } + }) + .map(new Function() { + @Override + public String apply(AppInfo appInfo) { + return appInfo.getApp_package(); + } + }) + .collect(Collectors.toSet()); + mMMKV.encode(CommonConfig.ESSENTIAL_COMPONENT_APPLICATIONS, packageSets); + } } diff --git a/app/src/main/java/com/xwad/os/activity/home/HomeActivity.java b/app/src/main/java/com/xwad/os/activity/home/HomeActivity.java index 34be4fd..180f637 100644 --- a/app/src/main/java/com/xwad/os/activity/home/HomeActivity.java +++ b/app/src/main/java/com/xwad/os/activity/home/HomeActivity.java @@ -39,6 +39,7 @@ import com.tencent.mmkv.MMKV; import com.xwad.os.BuildConfig; import com.xwad.os.R; import com.xwad.os.activity.activation.ActivationActivity; +import com.xwad.os.activity.download.DownloadActivity; import com.xwad.os.activity.login.LoginActivity; import com.xwad.os.activity.permission.PermissionActivity; import com.xwad.os.activity.update.UpdateActivity; @@ -83,7 +84,6 @@ import com.xwad.os.utils.DataUtil; import com.xwad.os.utils.JgyUtils; import com.xwad.os.utils.OpenApkUtils; import com.xwad.os.utils.Utils; -import com.xwad.os.view.jxw.widget.DefaultAppsDialog; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -862,8 +862,9 @@ public class HomeActivity extends BaseMvvmActivity() { + @Override + public void onChanged(Boolean aBoolean) { + finish(); + } + }); } @Override @@ -57,7 +64,9 @@ public class LoginSuccessfulActivity extends BaseMvvmActivity { + private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + @Override public void onDestroy() { } + public MutableLiveData mCompleteLiveData = new MutableLiveData<>(); + + public void getAdminAppDownload() { + NetInterfaceManager.getInstance().getAdminAppObservable() + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribe(new Observer>>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getAdminAppDownload", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse> listBaseResponse) { + Log.e("getAdminAppDownload", "onNext: " + listBaseResponse); + if (listBaseResponse.code == 200) { + List appInfoList = listBaseResponse.data; + Set packageSets = appInfoList.stream() + .filter(new Predicate() { + @Override + public boolean test(AppInfo appInfo) { + return appInfo.getIs_must_components() == 1; + } + }) + .map(new Function() { + @Override + public String apply(AppInfo appInfo) { + return appInfo.getApp_package(); + } + }) + .collect(Collectors.toSet()); + mMMKV.encode(CommonConfig.ESSENTIAL_COMPONENT_APPLICATIONS, packageSets); + + } + mCompleteLiveData.setValue(true); + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getAdminAppDownload", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("getAdminAppDownload", "onComplete: "); + mCompleteLiveData.setValue(true); + } + }); + } + public MutableLiveData mBooleanMutableLiveData = new MutableLiveData<>(); public void getAppInfo() { diff --git a/app/src/main/java/com/xwad/os/activity/user/UserActivity.java b/app/src/main/java/com/xwad/os/activity/user/UserActivity.java index b816509..218d48c 100644 --- a/app/src/main/java/com/xwad/os/activity/user/UserActivity.java +++ b/app/src/main/java/com/xwad/os/activity/user/UserActivity.java @@ -198,7 +198,11 @@ public class UserActivity extends BaseMvvmActivity } if (ApkUtils.isAvailable(mContext, appInfo.getApp_package())) { holder.iv_download.setVisibility(View.GONE); + if (ApkUtils.isUpdate(mContext, appInfo)) { + holder.iv_update.setVisibility(View.VISIBLE); + } else { + holder.iv_update.setVisibility(View.GONE); + } } else { holder.iv_download.setVisibility(View.VISIBLE); + holder.iv_update.setVisibility(View.GONE); } holder.rl_root.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (ApkUtils.isAvailable(mContext, appInfo.getApp_package())) { - ApkUtils.openPackage(mContext, appInfo.getApp_package()); + if (ApkUtils.isUpdate(mContext, appInfo)) { + OpenApkUtils.getInstance().showDownloadDialog(mContext, appInfo, "\"" + appInfo.getApp_name() + "\"\n更新后可继续使用!"); + } else { + ApkUtils.openPackage(mContext, appInfo.getApp_package()); + } } else { if (ActivationUtil.getInstance().isActivation()) { - OpenApkUtils.getInstance().showDownloadDialog(mContext, appInfo); + OpenApkUtils.getInstance().showDownloadDialog(mContext, appInfo, "未安装\"" + appInfo.getApp_name() + "\"\n下载后可继续使用!"); } else { Toaster.show("请先激活设备"); } @@ -86,7 +96,7 @@ public class AppInfoAdapter extends RecyclerView.Adapter public class Holder extends RecyclerView.ViewHolder { ConstraintLayout rl_root; - ImageView iv_app_icon, iv_download; + ImageView iv_app_icon, iv_download, iv_update; TextView tv_app_name; public Holder(@NonNull View itemView) { @@ -94,6 +104,7 @@ public class AppInfoAdapter extends RecyclerView.Adapter rl_root = itemView.findViewById(R.id.rl_root); iv_app_icon = itemView.findViewById(R.id.iv_app_icon); iv_download = itemView.findViewById(R.id.iv_download); + iv_update = itemView.findViewById(R.id.iv_update); tv_app_name = itemView.findViewById(R.id.tv_app_name); } } diff --git a/app/src/main/java/com/xwad/os/config/CommonConfig.java b/app/src/main/java/com/xwad/os/config/CommonConfig.java index 005ec52..802eeb7 100644 --- a/app/src/main/java/com/xwad/os/config/CommonConfig.java +++ b/app/src/main/java/com/xwad/os/config/CommonConfig.java @@ -1,10 +1,23 @@ package com.xwad.os.config; +import java.util.HashSet; +import java.util.Set; + public class CommonConfig { public static final String MMKV_ID = "InterProcessKV"; public static final String CLOUD_LESSON_SETTINGS_KEY = "cloud_lesson_settings_key"; public static final String DISALLOWED_RUNNING_APP_KEY = "disallowed_running_app"; + public static final String ESSENTIAL_COMPONENT_APPLICATIONS = "essential_component_applications"; + public static final Set ESSENTIAL_APPLICATIONS_SETS = new HashSet() {{ + this.add("com.jxw.jpkc"); + this.add("com.jxw.zncd"); + this.add("com.jxw.question"); + this.add("com.jxw.launcher"); + this.add("com.jxw.tbdd"); + this.add("com.jxw.download"); + this.add("com.jxw.tbfd"); + }}; public static final String ALIYUN_PUSH_ID = "aliyun_push_id_key"; diff --git a/app/src/main/java/com/xwad/os/fragment/mine/MineFragment.java b/app/src/main/java/com/xwad/os/fragment/mine/MineFragment.java index f4401c0..0fb3906 100644 --- a/app/src/main/java/com/xwad/os/fragment/mine/MineFragment.java +++ b/app/src/main/java/com/xwad/os/fragment/mine/MineFragment.java @@ -16,7 +16,9 @@ import com.hjq.toast.Toaster; import com.tencent.mmkv.MMKV; import com.xwad.os.R; import com.xwad.os.activity.ExitActivity; +import com.xwad.os.activity.activation.ActivationActivity; import com.xwad.os.activity.download.DownloadActivity; +import com.xwad.os.activity.login.LoginActivity; import com.xwad.os.activity.user.UserActivity; import com.xwad.os.base.mvvm.fragment.BaseMvvmFragment; import com.xwad.os.bean.SnInfo; @@ -26,6 +28,7 @@ import com.xwad.os.databinding.FragmentMineBinding; import com.xwad.os.jxw.StudyRecordMng; import com.xwad.os.jxw.ToastUtil; import com.xwad.os.jxw.event.UpdateColorEvent; +import com.xwad.os.utils.ActivationUtil; import com.xwad.os.utils.OpenApkUtils; import com.xwad.os.view.jxw.view.dialog.QhbzDialog; @@ -396,6 +399,18 @@ public class MineFragment extends BaseMvvmFragment packageSets = appInfoList.stream() + .filter(new Predicate() { + @Override + public boolean test(AppInfo appInfo) { + return appInfo.getIs_must_components() == 1; + } + }) + .map(new Function() { + @Override + public String apply(AppInfo appInfo) { + return appInfo.getApp_package(); + } + }) + .collect(Collectors.toSet()); + mMMKV.encode(CommonConfig.ESSENTIAL_COMPONENT_APPLICATIONS, packageSets); } } diff --git a/app/src/main/java/com/xwad/os/service/main/MainService.java b/app/src/main/java/com/xwad/os/service/main/MainService.java index 81ac6bc..ec3de0a 100644 --- a/app/src/main/java/com/xwad/os/service/main/MainService.java +++ b/app/src/main/java/com/xwad/os/service/main/MainService.java @@ -98,6 +98,7 @@ public class MainService extends BaseRxService implements MainSContact.MainSView mPresenter.getScreenLock(); mPresenter.getTestApp(); mPresenter.getAdminApp(); + mPresenter.getAdminAppDownload(); mPresenter.getSystemSettings(); mPresenter.getLockScreenPwd(); diff --git a/app/src/main/java/com/xwad/os/utils/ApkUtils.java b/app/src/main/java/com/xwad/os/utils/ApkUtils.java index 173343d..0c2d485 100644 --- a/app/src/main/java/com/xwad/os/utils/ApkUtils.java +++ b/app/src/main/java/com/xwad/os/utils/ApkUtils.java @@ -853,9 +853,9 @@ public class ApkUtils { } } - public static boolean isUpdate(Context context, AppInfo appUpdateInfo) { - String packageName = appUpdateInfo.getApp_package(); - long versionCode = appUpdateInfo.getApp_version_code(); + public static boolean isUpdate(Context context, AppInfo appInfo) { + String packageName = appInfo.getApp_package(); + long versionCode = appInfo.getApp_version_code(); return isUpdate(context, packageName, versionCode); } diff --git a/app/src/main/java/com/xwad/os/utils/OpenApkUtils.java b/app/src/main/java/com/xwad/os/utils/OpenApkUtils.java index 9b68523..97e871c 100644 --- a/app/src/main/java/com/xwad/os/utils/OpenApkUtils.java +++ b/app/src/main/java/com/xwad/os/utils/OpenApkUtils.java @@ -25,6 +25,7 @@ import com.hjq.toast.Toaster; import com.tencent.mmkv.MMKV; import com.xwad.os.R; import com.xwad.os.activity.activation.ActivationActivity; +import com.xwad.os.activity.download.DownloadActivity; import com.xwad.os.activity.login.LoginActivity; import com.xwad.os.bean.AppInfo; import com.xwad.os.bean.BaseResponse; @@ -35,7 +36,6 @@ import com.xwad.os.jxw.SPUtils; import com.xwad.os.mdm.AdminManager; import com.xwad.os.network.NetInterfaceManager; import com.xwad.os.service.DownloadService; -import com.xwad.os.view.jxw.widget.DefaultAppsDialog; import java.lang.reflect.Type; import java.math.BigDecimal; @@ -689,16 +689,6 @@ public class OpenApkUtils { } public void openJxwAppWithParam(Activity activity, String paramStr, boolean checkInstall) { - if (checkInstall) { - if (!ApkUtils.isAvailable(activity, "com.jxw.launcher") || !ApkUtils.isAvailable(activity, "com.jxw.download")) { - DefaultAppsDialog appsDialog = new DefaultAppsDialog(activity); - appsDialog.show(); - Toaster.show("请先安装必备组件"); - return; - } - } - -// if (!BuildConfig.DEBUG){ if (!ActivationUtil.getInstance().isLogin()) { Toaster.show("请先登录"); activity.startActivity(new Intent(activity, LoginActivity.class)); @@ -711,15 +701,39 @@ public class OpenApkUtils { return; } + if (checkInstall) { + if (!checkEssentialAppAllInstall()) { + activity.startActivity(new Intent(activity, DownloadActivity.class)); +// DefaultAppsDialog appsDialog = new DefaultAppsDialog(activity); +// appsDialog.show(); + Toaster.show("请先安装必备组件"); + return; + } + } + if (TextUtils.isEmpty(paramStr)) { Log.e(TAG, "context为空或参数字符串为空"); return; } -// } openJxwApp(activity, paramStr); } + private boolean checkEssentialAppAllInstall() { + Set essentialAppSets = mMMKV.decodeStringSet(CommonConfig.ESSENTIAL_COMPONENT_APPLICATIONS, CommonConfig.ESSENTIAL_APPLICATIONS_SETS); + Log.e(TAG, "checkEssentialAppAllInstall: " + essentialAppSets); + boolean allTrue = essentialAppSets.stream().allMatch(new Predicate() { + @Override + public boolean test(String s) { + boolean install = ApkUtils.isAvailable(mContext, s); + Log.e(TAG, "checkEssentialAppAllInstall: " + s + " " + install); + return install; + } + }); + Log.e(TAG, "checkEssentialAppAllInstall: " + allTrue); + return allTrue; + } + /** * 根据参数字符串打开对应页面 * @@ -859,14 +873,14 @@ public class OpenApkUtils { } } - public void showDownloadDialog(Activity context, AppInfo appInfo) { + public void showDownloadDialog(Activity context, AppInfo appInfo, String conetnt) { Dialog dialog = new Dialog(context, R.style.ActionSheet); Window window = dialog.getWindow(); View inflate = ((LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.download_dialog, null); TextView textView = inflate.findViewById(R.id.download_cancel); TextView textView2 = inflate.findViewById(R.id.tag_title); if (!TextUtils.isEmpty(appInfo.getApp_name())) { - textView2.setText("未安装\"" + appInfo.getApp_name() + "\"\n下载后可继续使用!"); + textView2.setText(conetnt); } TextView textView3 = inflate.findViewById(R.id.download_ok); textView.setOnClickListener(new View.OnClickListener() { @@ -925,7 +939,7 @@ public class OpenApkUtils { // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // mContext.startForegroundService(intent); // } else { - mContext.startService(intent); + mContext.startService(intent); // } dialog.dismiss(); } diff --git a/app/src/main/res/drawable/ic_update.xml b/app/src/main/res/drawable/ic_update.xml new file mode 100644 index 0000000..88c0179 --- /dev/null +++ b/app/src/main/res/drawable/ic_update.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_download.xml b/app/src/main/res/layout/activity_download.xml index ffc9a13..fc48b55 100644 --- a/app/src/main/res/layout/activity_download.xml +++ b/app/src/main/res/layout/activity_download.xml @@ -88,16 +88,80 @@ style="@style/recycler_view_style" android:layout_width="match_parent" android:layout_height="0dp" + android:orientation="vertical" + app:layout_constraintBottom_toTopOf="@+id/linearLayout7" + app:layout_constraintTop_toTopOf="parent" /> + + + app:layout_constraintBottom_toTopOf="@+id/download_ok"> + + + + + + + + + + diff --git a/app/src/main/res/layout/dialog_default_apps.xml b/app/src/main/res/layout/dialog_default_apps.xml index 057a7d0..06fe9ec 100644 --- a/app/src/main/res/layout/dialog_default_apps.xml +++ b/app/src/main/res/layout/dialog_default_apps.xml @@ -23,7 +23,7 @@ android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_marginTop="3dp" - android:text="必备组件" + android:text="组件安装" android:textColor="#333333" android:textSize="12sp" /> diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml index 57b416d..85a915c 100644 --- a/app/src/main/res/layout/fragment_mine.xml +++ b/app/src/main/res/layout/fragment_mine.xml @@ -763,7 +763,7 @@ android:layout_gravity="center_horizontal" android:layout_marginTop="2dp" android:singleLine="true" - android:text="必备组件" + android:text="组件安装" android:textColor="@color/white" android:textSize="@dimen/mine_app_name_size" app:layout_constraintEnd_toEndOf="@+id/app_icon11" diff --git a/app/src/main/res/layout/item_app_info.xml b/app/src/main/res/layout/item_app_info.xml index c266ef4..d92a5f7 100644 --- a/app/src/main/res/layout/item_app_info.xml +++ b/app/src/main/res/layout/item_app_info.xml @@ -19,26 +19,39 @@ android:id="@+id/iv_download" android:layout_width="14dp" android:layout_height="14dp" - android:layout_marginTop="32dp" - android:visibility="gone" android:layout_marginStart="32dp" + android:layout_marginTop="32dp" android:adjustViewBounds="true" android:scaleType="centerCrop" android:src="@drawable/ic_download_all" + android:visibility="gone" app:layout_constraintStart_toStartOf="@+id/iv_app_icon" app:layout_constraintTop_toTopOf="@+id/iv_app_icon" /> + + + app:layout_constraintTop_toBottomOf="@+id/iv_app_icon" + tools:text="当前壁纸" /> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 997915f..4af8b59 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -70,5 +70,6 @@ 为学王365提供管控功能,请激活后使用 开启我吧 + 1、必备组件维持系统基本运行,请优先安装,并【允许】所有权限弹窗请求;