From af14f02fba9b561bc8292a6c8fb75f2b143fbe5f Mon Sep 17 00:00:00 2001 From: tongtongstudio Date: Mon, 4 Sep 2023 09:20:51 +0800 Subject: [PATCH] =?UTF-8?q?version:1.1.2=20Huaruian=20fix:=20update:?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=A3=80=E6=9F=A5=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- app/src/main/AndroidManifest.xml | 5 + .../sn/activity/main/MainAPresenter.java | 6 +- .../sn/activity/main/MainActivity.java | 11 ++ .../sn/activity/update/UpdateActivity.java | 132 +++++++++++++ .../sn/activity/update/UpdateContact.java | 19 ++ .../sn/activity/update/UpdatePresenter.java | 52 +++++ .../aoleyun/sn/adapter/AppUpdateAdapter.java | 180 ++++++++++++++++++ .../com/aoleyun/sn/base/BaseApplication.java | 2 +- .../com/aoleyun/sn/bean/DownloadTaskInfo.java | 29 +++ .../com/aoleyun/sn/comm/CommonConfig.java | 2 + .../sn/network/NetInterfaceManager.java | 86 +++++++++ .../com/aoleyun/sn/service/GuardService.java | 26 ++- .../java/com/aoleyun/sn/utils/JGYUtils.java | 1 + .../drawable-hdpi/com_aoleyun_appstore.png | Bin 0 -> 6004 bytes .../res/drawable-hdpi/com_aoleyun_browser.png | Bin 0 -> 8252 bytes .../res/drawable-hdpi/com_aoleyun_info.png | Bin 0 -> 2715 bytes .../main/res/drawable-hdpi/com_aoleyun_os.png | Bin 0 -> 4102 bytes app/src/main/res/drawable-hdpi/exit_icon.png | Bin 0 -> 3012 bytes .../main/res/drawable-hdpi/icon_nodata.png | Bin 0 -> 8579 bytes .../res/drawable/bt_activation_normnl.xml | 4 +- .../res/drawable/bt_activation_pressed.xml | 4 +- app/src/main/res/drawable/bt_disable.xml | 18 ++ .../main/res/layout-land/activity_main.xml | 18 +- .../main/res/layout-port/activity_main.xml | 17 +- app/src/main/res/layout/activity_update.xml | 96 ++++++++++ app/src/main/res/layout/item_app_update.xml | 86 +++++++++ app/src/main/res/values/colors.xml | 1 + 28 files changed, 782 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/com/aoleyun/sn/activity/update/UpdateActivity.java create mode 100644 app/src/main/java/com/aoleyun/sn/activity/update/UpdateContact.java create mode 100644 app/src/main/java/com/aoleyun/sn/activity/update/UpdatePresenter.java create mode 100644 app/src/main/java/com/aoleyun/sn/adapter/AppUpdateAdapter.java create mode 100644 app/src/main/java/com/aoleyun/sn/bean/DownloadTaskInfo.java create mode 100644 app/src/main/res/drawable-hdpi/com_aoleyun_appstore.png create mode 100644 app/src/main/res/drawable-hdpi/com_aoleyun_browser.png create mode 100644 app/src/main/res/drawable-hdpi/com_aoleyun_info.png create mode 100644 app/src/main/res/drawable-hdpi/com_aoleyun_os.png create mode 100644 app/src/main/res/drawable-hdpi/exit_icon.png create mode 100644 app/src/main/res/drawable-hdpi/icon_nodata.png create mode 100644 app/src/main/res/drawable/bt_disable.xml create mode 100644 app/src/main/res/layout/activity_update.xml create mode 100644 app/src/main/res/layout/item_app_update.xml diff --git a/app/build.gradle b/app/build.gradle index 39b0939..114e051 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -109,8 +109,8 @@ android { Huaruian { flavorDimensions "default" - versionCode 12 - versionName "1.1.1" + versionCode 13 + versionName "1.1.2" buildConfigField "String", "platform", '"ZR6016"' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 51e316b..ad41f6d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -165,6 +165,11 @@ android:screenOrientation="userPortrait" /> + diff --git a/app/src/main/java/com/aoleyun/sn/activity/main/MainAPresenter.java b/app/src/main/java/com/aoleyun/sn/activity/main/MainAPresenter.java index 75d385a..956c481 100644 --- a/app/src/main/java/com/aoleyun/sn/activity/main/MainAPresenter.java +++ b/app/src/main/java/com/aoleyun/sn/activity/main/MainAPresenter.java @@ -153,6 +153,8 @@ public class MainAPresenter implements MainAContact.Presenter { mView.checkTestUpdateFinish(); } }); + } else { + Log.e(TAG, "checkTestUpdate: tag is Empty"); } } @@ -160,12 +162,12 @@ public class MainAPresenter implements MainAContact.Presenter { public void getDefaultDesktop() { Log.e(TAG, "getDefaultDesktop: "); if (JGYUtils.isOfficialVersion() || !JGYUtils.getInstance().getDeviceIsLocked()) { - Log.e(TAG, "getDefaultDesktop: "+"Device unLocked"); + Log.e(TAG, "getDefaultDesktop: " + "Device unLocked"); mView.getDefaultDesktopFinish(); } else { int aihuaUnlock = Settings.System.getInt(mContext.getContentResolver(), CommonConfig.AIHUA_UNLOCK, 0); if (JGYUtils.getInstance().isAihuaFramwwork() && aihuaUnlock == 1) { - Log.e(TAG, "getDefaultDesktop: "+"Device aihua"); + Log.e(TAG, "getDefaultDesktop: " + "Device aihua"); mView.getDefaultDesktopFinish(); } else { NetInterfaceManager.getInstance() diff --git a/app/src/main/java/com/aoleyun/sn/activity/main/MainActivity.java b/app/src/main/java/com/aoleyun/sn/activity/main/MainActivity.java index d68a789..f8f462f 100644 --- a/app/src/main/java/com/aoleyun/sn/activity/main/MainActivity.java +++ b/app/src/main/java/com/aoleyun/sn/activity/main/MainActivity.java @@ -24,6 +24,7 @@ import android.view.Gravity; import android.view.KeyEvent; import android.view.View; import android.view.WindowManager; +import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; @@ -32,6 +33,7 @@ import androidx.constraintlayout.widget.ConstraintLayout; import com.aoleyun.sn.BuildConfig; import com.aoleyun.sn.R; import com.aoleyun.sn.activity.requestlog.RequestLogActivity; +import com.aoleyun.sn.activity.update.UpdateActivity; import com.aoleyun.sn.base.BaseActivity; import com.aoleyun.sn.bean.StudentsInfo; import com.aoleyun.sn.comm.CommonConfig; @@ -72,6 +74,8 @@ public class MainActivity extends BaseActivity implements MainAContact.MainView, ImageView back; @BindView(R.id.tv_version) TextView tv_version; + @BindView(R.id.bt_update) + Button bt_update; @BindView(R.id.iv_head) ImageView iv_head; @BindView(R.id.tv_name) @@ -206,6 +210,12 @@ public class MainActivity extends BaseActivity implements MainAContact.MainView, cl_class.setVisibility(View.VISIBLE); cl_number_name.setVisibility(View.GONE); } + bt_update.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + startActivity(new Intent(MainActivity.this, UpdateActivity.class)); + } + }); // setStoreUpdateListener(bt_checkupdate); registerReceiver(); } @@ -483,6 +493,7 @@ public class MainActivity extends BaseActivity implements MainAContact.MainView, @Override public void checkAoleyunUpdateFinish() { + Log.e(TAG, "checkAoleyunUpdateFinish: "); mMainAPresenter.checkTestUpdate(); } diff --git a/app/src/main/java/com/aoleyun/sn/activity/update/UpdateActivity.java b/app/src/main/java/com/aoleyun/sn/activity/update/UpdateActivity.java new file mode 100644 index 0000000..883bf32 --- /dev/null +++ b/app/src/main/java/com/aoleyun/sn/activity/update/UpdateActivity.java @@ -0,0 +1,132 @@ +package com.aoleyun.sn.activity.update; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.aoleyun.sn.R; +import com.aoleyun.sn.adapter.AppUpdateAdapter; +import com.aoleyun.sn.base.BaseActivity; +import com.aoleyun.sn.bean.AppUpdateInfo; + +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; + +public class UpdateActivity extends BaseActivity implements UpdateContact.UpdateView { + + private static final String TAG = UpdateActivity.class.getSimpleName(); + @BindView(R.id.root) + ConstraintLayout root; + @BindView(R.id.main) + ConstraintLayout main; + @BindView(R.id.iv_back) + ImageView iv_back; + @BindView(R.id.cl_nodata) + ConstraintLayout cl_nodata; + @BindView(R.id.recyclerView) + RecyclerView recyclerView; + + private UpdatePresenter mPresenter; + private AppUpdateAdapter mAppUpdateAdapter; + + @Override + public int getLayoutId() { + return R.layout.activity_update; + } + + @Override + public void initView() { + ButterKnife.bind(this); + mPresenter = new UpdatePresenter(this); + mPresenter.attachView(this); + mPresenter.setLifecycle(lifecycleSubject); + + mAppUpdateAdapter = new AppUpdateAdapter(); + recyclerView.setLayoutManager(new LinearLayoutManager(UpdateActivity.this)); + recyclerView.setAdapter(mAppUpdateAdapter); + root.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + main.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + } + }); + iv_back.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + } + + @Override + public void initData() { + registmNewAppReceiver(); + mPresenter.checkAllAppUpdate(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + mPresenter.detachView(); + if (mNewAppReceiver != null) { + unregisterReceiver(mNewAppReceiver); + } + } + + @Override + public void onAppUpdate(List updateApp) { + if (updateApp == null || updateApp.size() == 0) { + cl_nodata.setVisibility(View.VISIBLE); + recyclerView.setVisibility(View.GONE); + } else { + cl_nodata.setVisibility(View.GONE); + recyclerView.setVisibility(View.VISIBLE); + mAppUpdateAdapter.setAppInfoList(updateApp); + } + } + + private void registmNewAppReceiver() { + mNewAppReceiver = new NewAppReceiver(); + IntentFilter filter = new IntentFilter(); + filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); + filter.addAction(Intent.ACTION_PACKAGE_ADDED); + filter.addAction(Intent.ACTION_PACKAGE_CHANGED); + filter.addAction(Intent.ACTION_PACKAGE_REPLACED); + filter.addAction(Intent.ACTION_PACKAGE_REMOVED); + filter.addDataScheme("package"); + registerReceiver(mNewAppReceiver, filter); + } + + private NewAppReceiver mNewAppReceiver; + + class NewAppReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + Log.e(TAG, "onReceive: " + action); + if (Intent.ACTION_PACKAGE_ADDED.equals(action) + || Intent.ACTION_PACKAGE_REMOVED.equals(action) + || Intent.ACTION_PACKAGE_REPLACED.equals(action) + || Intent.ACTION_PACKAGE_CHANGED.equals(action) + ) { + mAppUpdateAdapter.notifyDataSetChanged(); + } + } + } +} diff --git a/app/src/main/java/com/aoleyun/sn/activity/update/UpdateContact.java b/app/src/main/java/com/aoleyun/sn/activity/update/UpdateContact.java new file mode 100644 index 0000000..3ae651c --- /dev/null +++ b/app/src/main/java/com/aoleyun/sn/activity/update/UpdateContact.java @@ -0,0 +1,19 @@ +package com.aoleyun.sn.activity.update; + +import com.aoleyun.sn.base.BasePresenter; +import com.aoleyun.sn.base.BaseView; +import com.aoleyun.sn.bean.AppUpdateInfo; + +import java.util.List; + +public class UpdateContact { + interface Presenter extends BasePresenter { + /*获取所有更新*/ + void checkAllAppUpdate(); + } + + + public interface UpdateView extends BaseView { + void onAppUpdate(List updateApp); + } +} diff --git a/app/src/main/java/com/aoleyun/sn/activity/update/UpdatePresenter.java b/app/src/main/java/com/aoleyun/sn/activity/update/UpdatePresenter.java new file mode 100644 index 0000000..a66b284 --- /dev/null +++ b/app/src/main/java/com/aoleyun/sn/activity/update/UpdatePresenter.java @@ -0,0 +1,52 @@ +package com.aoleyun.sn.activity.update; + +import android.content.Context; + +import com.aoleyun.sn.bean.AppUpdateInfo; +import com.aoleyun.sn.network.NetInterfaceManager; +import com.trello.rxlifecycle4.android.ActivityEvent; + +import java.util.List; + +import io.reactivex.rxjava3.subjects.BehaviorSubject; + +public class UpdatePresenter implements UpdateContact.Presenter { + private Context mContext; + + UpdatePresenter(Context context) { + this.mContext = context; + } + + private UpdateContact.UpdateView mView; + + private BehaviorSubject lifecycle; + + public void setLifecycle(BehaviorSubject lifecycle) { + this.lifecycle = lifecycle; + } + + public BehaviorSubject getLifecycle() { + return lifecycle; + } + + @Override + public void attachView(UpdateContact.UpdateView view) { + this.mView = view; + } + + @Override + public void detachView() { + this.mView = null; + } + + @Override + public void checkAllAppUpdate() { + NetInterfaceManager.getInstance().checkAoleyunUpdate( getLifecycle(), new NetInterfaceManager.UpdateCallback() { + @Override + public void onUpdate(List appUpdateInfos) { + mView.onAppUpdate(appUpdateInfos); + } + }); + } + +} diff --git a/app/src/main/java/com/aoleyun/sn/adapter/AppUpdateAdapter.java b/app/src/main/java/com/aoleyun/sn/adapter/AppUpdateAdapter.java new file mode 100644 index 0000000..f21ae44 --- /dev/null +++ b/app/src/main/java/com/aoleyun/sn/adapter/AppUpdateAdapter.java @@ -0,0 +1,180 @@ +package com.aoleyun.sn.adapter; + +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.aoleyun.sn.BuildConfig; +import com.aoleyun.sn.R; +import com.aoleyun.sn.bean.AppUpdateInfo; +import com.aoleyun.sn.comm.PackageNames; +import com.aoleyun.sn.gson.GsonUtils; +import com.aoleyun.sn.utils.ApkUtils; +import com.aoleyun.sn.utils.JGYUtils; +import com.aoleyun.sn.utils.ToastUtil; +import com.aoleyun.sn.utils.Utils; +import com.bumptech.glide.Glide; +import com.google.gson.Gson; +import com.google.gson.JsonObject; + +import java.util.List; + +public class AppUpdateAdapter extends RecyclerView.Adapter { + private static final String TAG = AppUpdateAdapter.class.getSimpleName(); + + private Context mContext; + private List mAppInfoList; + private PackageManager mPackageManager; + + + @NonNull + @Override + public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + mContext = parent.getContext(); + mPackageManager = mContext.getPackageManager(); + return new Holder(LayoutInflater.from(mContext).inflate(R.layout.item_app_update, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull Holder holder, int position) { + AppUpdateInfo appInfo = mAppInfoList.get(position); + String pkg = appInfo.getPackages(); + Drawable drawable; + switch (pkg) { + case BuildConfig.APPLICATION_ID: + drawable = mContext.getDrawable(R.mipmap.ic_launcher); + break; + case PackageNames.APPSTORE: + drawable = mContext.getDrawable(R.drawable.com_aoleyun_appstore); + break; + case PackageNames.DESKTOP: + drawable = mContext.getDrawable(R.drawable.com_aoleyun_os); + break; + case PackageNames.NOTIFICATIONS: + drawable = mContext.getDrawable(R.drawable.com_aoleyun_info); + break; + case PackageNames.BROWSER: + drawable = mContext.getDrawable(R.drawable.com_aoleyun_browser); + break; + default: + drawable = mContext.getDrawable(R.drawable.exit_icon); + } + Glide.with(mContext).load(drawable).into(holder.imageView); + if (!TextUtils.isEmpty(appInfo.getApp_name())) { + holder.tv_app_name.setText(appInfo.getApp_name()); + } + if (!TextUtils.isEmpty(appInfo.getVersion_name())) { + holder.tv_app_version.setText("更新版本:" + appInfo.getVersion_name()); + } + holder.tv_local_version.setText("安装版本:" + installedVersion(pkg)); + if (ApkUtils.isAvailable(mContext, appInfo.getPackages())) { + if (isUpdate(appInfo)) { + holder.bt_update.setEnabled(true); + holder.bt_update.setText("更新"); + holder.bt_update.setBackground(mContext.getDrawable(R.drawable.bt_activation_selector)); + } else { + holder.bt_update.setEnabled(false); + holder.bt_update.setText("暂无"); + holder.bt_update.setBackground(mContext.getDrawable(R.drawable.bt_disable)); + } + } else { + holder.bt_update.setEnabled(true); + holder.bt_update.setText("下载"); + holder.bt_update.setBackground(mContext.getDrawable(R.drawable.bt_activation_selector)); + } + holder.bt_update.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + notifyDataSetChanged(); + if (isUpdate(appInfo)) { + ToastUtil.show("开始下载:" + appInfo.getApp_name()); + JsonObject jsonObject = GsonUtils.getJsonObject(new Gson().toJson(appInfo)); + Utils.ariaDownload(mContext, appInfo.getUrl(), jsonObject); + } else { + ToastUtil.show(appInfo.getApp_name() + " 已是最新版本"); + Log.e(TAG, "onClick: 没有找到更新"); + } + } + }); + } + + private boolean isUpdate(AppUpdateInfo appInfo) { + String pkg = appInfo.getPackages(); + PackageInfo packageInfo = null; + try { + packageInfo = mPackageManager.getPackageInfo(pkg, 0); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + if (packageInfo == null) { + //未安装 + Log.e(TAG, "getAllAppUpdateInfos: " + pkg); + return true; + } else { + long appVersionCode; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + appVersionCode = packageInfo.getLongVersionCode(); + } else { + appVersionCode = packageInfo.versionCode; + } + long versionCode = appInfo.getVersion_code(); + //版本升级 + return appVersionCode < versionCode; + } + } + + private String installedVersion(String pkg) { + PackageInfo packageInfo = null; + try { + packageInfo = mPackageManager.getPackageInfo(pkg, 0); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + if (packageInfo == null) { + return "未安装"; + } else { + return packageInfo.versionName; + } + } + + public void setAppInfoList(List appInfoList) { + this.mAppInfoList = appInfoList; + notifyDataSetChanged(); + } + + @Override + public int getItemCount() { + return mAppInfoList == null ? 0 : mAppInfoList.size(); + } + + class Holder extends RecyclerView.ViewHolder { + + ImageView imageView; + TextView tv_app_name; + TextView tv_app_version; + TextView tv_local_version; + Button bt_update; + + public Holder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + tv_app_name = itemView.findViewById(R.id.tv_app_name); + tv_app_version = itemView.findViewById(R.id.tv_app_version); + tv_local_version = itemView.findViewById(R.id.tv_local_version); + bt_update = itemView.findViewById(R.id.bt_update); + } + } +} diff --git a/app/src/main/java/com/aoleyun/sn/base/BaseApplication.java b/app/src/main/java/com/aoleyun/sn/base/BaseApplication.java index 264e8e4..2c51190 100644 --- a/app/src/main/java/com/aoleyun/sn/base/BaseApplication.java +++ b/app/src/main/java/com/aoleyun/sn/base/BaseApplication.java @@ -55,7 +55,7 @@ public class BaseApplication extends MultiDexApplication { Log.e(TAG, "mmkv root: " + rootDir); CrashReport.initCrashReport(getApplicationContext(), "b16b3c7f1a", false); - CrashReport.setDeviceModel(this, Utils.getSerial(this)); + CrashReport.setDeviceId(this, Utils.getSerial(this)); PushManager.init(this); initRegisterObservable(); diff --git a/app/src/main/java/com/aoleyun/sn/bean/DownloadTaskInfo.java b/app/src/main/java/com/aoleyun/sn/bean/DownloadTaskInfo.java new file mode 100644 index 0000000..54a9fd9 --- /dev/null +++ b/app/src/main/java/com/aoleyun/sn/bean/DownloadTaskInfo.java @@ -0,0 +1,29 @@ +package com.aoleyun.sn.bean; + +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; + +public class DownloadTaskInfo implements Serializable { + private static final long serialVersionUID = -5406588064200275496L; + + String app_name; + @SerializedName(value = "app_package", alternate = {"package", "packages"}) + String app_package; + + public String getApp_name() { + return app_name; + } + + public void setApp_name(String app_name) { + this.app_name = app_name; + } + + public String getApp_package() { + return app_package; + } + + public void setApp_package(String app_package) { + this.app_package = app_package; + } +} diff --git a/app/src/main/java/com/aoleyun/sn/comm/CommonConfig.java b/app/src/main/java/com/aoleyun/sn/comm/CommonConfig.java index 4adba2b..71ab810 100644 --- a/app/src/main/java/com/aoleyun/sn/comm/CommonConfig.java +++ b/app/src/main/java/com/aoleyun/sn/comm/CommonConfig.java @@ -6,6 +6,8 @@ public class CommonConfig { public static final String AES_KEY = "0123456789ABCDEF"; + public static final String DEFAULT_DESKTOP_PACKAGE = "default_desktop_package_key"; + /*爱华解锁标识*/ public final static String AIHUA_UNLOCK = "Aihua_unlock_state"; diff --git a/app/src/main/java/com/aoleyun/sn/network/NetInterfaceManager.java b/app/src/main/java/com/aoleyun/sn/network/NetInterfaceManager.java index 9bef667..cca3321 100644 --- a/app/src/main/java/com/aoleyun/sn/network/NetInterfaceManager.java +++ b/app/src/main/java/com/aoleyun/sn/network/NetInterfaceManager.java @@ -151,6 +151,7 @@ import io.reactivex.rxjava3.core.Observer; import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.functions.BiFunction; import io.reactivex.rxjava3.functions.Function5; +import io.reactivex.rxjava3.functions.Function6; import io.reactivex.rxjava3.schedulers.Schedulers; import io.reactivex.rxjava3.subjects.BehaviorSubject; import okhttp3.Cache; @@ -827,6 +828,91 @@ public class NetInterfaceManager { }); } + public interface UpdateCallback { + void onUpdate(List appUpdateInfos); + } + + synchronized public void checkAoleyunUpdate(BehaviorSubject lifecycle, UpdateCallback callback) { + Observable> infoUpdateObservable = NetInterfaceManager.getInstance() + .getUpdateApi().getUpdate(BuildConfig.APPLICATION_ID, JGYUtils.getInstance().checkAppPlatform()); + Observable> storeUpdateObservable = NetInterfaceManager.getInstance() + .getUpdateApi().getUpdate(PackageNames.APPSTORE, JGYUtils.getInstance().checkAppPlatform()); + Observable> desktopUpdateObservable = NetInterfaceManager.getInstance() + .getUpdateApi().getUpdate(PackageNames.DESKTOP, JGYUtils.getInstance().checkAppPlatform()); + Observable> notifyUpdateObservable = NetInterfaceManager.getInstance() + .getUpdateApi().getUpdate(PackageNames.NOTIFICATIONS, JGYUtils.getInstance().checkAppPlatform()); + Observable> browserUpdateObservable = NetInterfaceManager.getInstance() + .getUpdateApi().getUpdate(PackageNames.BROWSER, JGYUtils.getInstance().checkAppPlatform()); + String desktop = mMMKV.decodeString(CommonConfig.DEFAULT_DESKTOP_PACKAGE); + Observable> learningDesktopObservable = NetInterfaceManager.getInstance() + .getUpdateApi().getUpdate(desktop, JGYUtils.getInstance().checkAppPlatform()); + Observable.zip(infoUpdateObservable, storeUpdateObservable, desktopUpdateObservable, + notifyUpdateObservable, browserUpdateObservable, learningDesktopObservable, + new Function6, BaseResponse, BaseResponse, BaseResponse, BaseResponse, BaseResponse, List>() { + @Override + public List apply + (BaseResponse appUpdateInfoBaseResponse, BaseResponse appUpdateInfoBaseResponse2, BaseResponse appUpdateInfoBaseResponse3, + BaseResponse appUpdateInfoBaseResponse4, BaseResponse appUpdateInfoBaseResponse5, BaseResponse appUpdateInfoBaseResponse6) throws Throwable { + List appUpdateInfos = new ArrayList<>(); + if (appUpdateInfoBaseResponse.code == OK) { + appUpdateInfos.add(appUpdateInfoBaseResponse.data); + } + if (appUpdateInfoBaseResponse2.code == OK) { + appUpdateInfos.add(appUpdateInfoBaseResponse2.data); + } + if (appUpdateInfoBaseResponse3.code == OK) { + appUpdateInfos.add(appUpdateInfoBaseResponse3.data); + } + if (appUpdateInfoBaseResponse4.code == OK) { + appUpdateInfos.add(appUpdateInfoBaseResponse4.data); + } + if (appUpdateInfoBaseResponse5.code == OK) { + appUpdateInfos.add(appUpdateInfoBaseResponse5.data); + } + if (appUpdateInfoBaseResponse6.code == OK) { + appUpdateInfos.add(appUpdateInfoBaseResponse6.data); + } + return appUpdateInfos; + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY)) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("checkAoleyunUpdate", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull List appUpdateInfos) { + String jsonString = GsonUtils.toJSONString(appUpdateInfos); + Log.e("checkAoleyunUpdate", "onNext: " + jsonString); + if (appUpdateInfos != null && appUpdateInfos.size() != 0) { + cacheHelper.put(UrlAddress.CHECK_UPDATE, jsonString); + for (AppUpdateInfo info : appUpdateInfos) { + JsonObject jsonObject = parseString(new Gson().toJson(info)).getAsJsonObject(); + JGYUtils.getInstance().installAPK(jsonObject); + } + } else { + cacheHelper.put(UrlAddress.CHECK_UPDATE, ""); + } + callback.onUpdate(appUpdateInfos); + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("checkAoleyunUpdate", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("checkAoleyunUpdate", "onComplete: "); + } + }); + } + public void checkUpdate() { String jsonString = cacheHelper.getAsString(UrlAddress.CHECK_UPDATE); Gson gson = new Gson(); diff --git a/app/src/main/java/com/aoleyun/sn/service/GuardService.java b/app/src/main/java/com/aoleyun/sn/service/GuardService.java index fca39be..0a497ae 100644 --- a/app/src/main/java/com/aoleyun/sn/service/GuardService.java +++ b/app/src/main/java/com/aoleyun/sn/service/GuardService.java @@ -23,6 +23,8 @@ import com.aoleyun.sn.BuildConfig; import com.aoleyun.sn.KeepAliveConnection; import com.aoleyun.sn.R; import com.aoleyun.sn.bean.BaseResponse; +import com.aoleyun.sn.bean.DownloadTaskInfo; +import com.aoleyun.sn.bean.ForceDownloadData; import com.aoleyun.sn.comm.CommonConfig; import com.aoleyun.sn.comm.PackageNames; import com.aoleyun.sn.gson.GsonUtils; @@ -46,7 +48,9 @@ import com.arialyy.annotations.Download; import com.arialyy.aria.core.Aria; import com.arialyy.aria.core.task.DownloadTask; import com.baidu.location.LocationClient; +import com.google.gson.Gson; import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; import java.io.BufferedReader; import java.io.File; @@ -54,6 +58,8 @@ import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; +import java.lang.reflect.Type; +import java.util.List; import java.util.concurrent.TimeUnit; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; @@ -845,9 +851,13 @@ public class GuardService extends Service { //在这里处理任务执行中的状态,如进度进度条的刷新 @Download.onTaskRunning protected void running(DownloadTask task) { - JsonObject jsonObject = GsonUtils.getJsonObject(task.getExtendField()); - String app_name = jsonObject.get("app_name").getAsString(); - String app_package = jsonObject.get("app_package").getAsString(); + String jsonString = task.getExtendField(); + Gson gson = new Gson(); + Type listType = new TypeToken() { + }.getType(); + DownloadTaskInfo downloadTaskInfo = gson.fromJson(jsonString, listType); + String app_name = downloadTaskInfo.getApp_name(); + String app_package = downloadTaskInfo.getApp_package(); Log.e("aria", "正在下载:" + task.getPercent() + ":" + task.getExtendField()); ToastUtil.show("正在下载:" + app_name + "-" + task.getPercent() + "%" + "\t" + Formatter.formatFileSize(GuardService.this, task.getSpeed()) + "/s"); } @@ -861,9 +871,13 @@ public class GuardService extends Service { Log.e("taskComplete", "extendField::" + extendField); if (filepath.endsWith("apk")) { - JsonObject jsonObject = GsonUtils.getJsonObject(extendField); - String app_name = jsonObject.get("app_name").getAsString(); - String app_package = jsonObject.get("app_package").getAsString(); + String jsonString = task.getExtendField(); + Gson gson = new Gson(); + Type listType = new TypeToken() { + }.getType(); + DownloadTaskInfo downloadTaskInfo = gson.fromJson(jsonString, listType); + String app_name = downloadTaskInfo.getApp_name(); + String app_package = downloadTaskInfo.getApp_package(); ToastUtil.show(app_name + "\t:下载完成"); if (filepath.endsWith(".xapk")) { XAPKUtils.getInstance().installXAPK(filepath); diff --git a/app/src/main/java/com/aoleyun/sn/utils/JGYUtils.java b/app/src/main/java/com/aoleyun/sn/utils/JGYUtils.java index 7d696e8..1909117 100644 --- a/app/src/main/java/com/aoleyun/sn/utils/JGYUtils.java +++ b/app/src/main/java/com/aoleyun/sn/utils/JGYUtils.java @@ -1323,6 +1323,7 @@ public class JGYUtils { String app_url = jsonObject.get("app_url").getAsString(); String app_package = jsonObject.get("app_package").getAsString(); int app_version_code = jsonObject.get("app_version_code").getAsInt(); + mMMKV.encode(CommonConfig.DEFAULT_DESKTOP_PACKAGE, app_package); Set desktop = new HashSet<>(ApkUtils.desktopAPP); desktop.remove(app_package); for (String s : desktop) { diff --git a/app/src/main/res/drawable-hdpi/com_aoleyun_appstore.png b/app/src/main/res/drawable-hdpi/com_aoleyun_appstore.png new file mode 100644 index 0000000000000000000000000000000000000000..033f1c4ca648ba22f9f919ec788509921b9248b2 GIT binary patch literal 6004 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/com_aoleyun_browser.png b/app/src/main/res/drawable-hdpi/com_aoleyun_browser.png new file mode 100644 index 0000000000000000000000000000000000000000..13554a9c6d9b610e64c04d4384559130d45c30fd GIT binary patch literal 8252 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 LHJN%TvylG-ngLb5 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/com_aoleyun_info.png b/app/src/main/res/drawable-hdpi/com_aoleyun_info.png new file mode 100644 index 0000000000000000000000000000000000000000..b949068021fa252b222f8949d017b7f6e7de07db GIT binary patch literal 2715 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/exit_icon.png b/app/src/main/res/drawable-hdpi/exit_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5a609fcff29efe1fff6ac3ec7706f7244d1b0e23 GIT binary patch literal 3012 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/icon_nodata.png b/app/src/main/res/drawable-hdpi/icon_nodata.png new file mode 100644 index 0000000000000000000000000000000000000000..a2f45fd9dac5332f0a6d9826756ce132bc63abb9 GIT binary patch literal 8579 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/bt_activation_normnl.xml b/app/src/main/res/drawable/bt_activation_normnl.xml index 9cfee8e..40f7909 100644 --- a/app/src/main/res/drawable/bt_activation_normnl.xml +++ b/app/src/main/res/drawable/bt_activation_normnl.xml @@ -10,6 +10,6 @@ android:topRightRadius="@dimen/dp_20" /> + android:left="@dimen/dp_4" + android:right="@dimen/dp_4" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/bt_activation_pressed.xml b/app/src/main/res/drawable/bt_activation_pressed.xml index 8551266..9815ecd 100644 --- a/app/src/main/res/drawable/bt_activation_pressed.xml +++ b/app/src/main/res/drawable/bt_activation_pressed.xml @@ -10,6 +10,6 @@ android:topRightRadius="@dimen/dp_20" /> + android:left="@dimen/dp_4" + android:right="@dimen/dp_4" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/bt_disable.xml b/app/src/main/res/drawable/bt_disable.xml new file mode 100644 index 0000000..f1ed4ec --- /dev/null +++ b/app/src/main/res/drawable/bt_disable.xml @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/activity_main.xml b/app/src/main/res/layout-land/activity_main.xml index a63a028..d7aae11 100644 --- a/app/src/main/res/layout-land/activity_main.xml +++ b/app/src/main/res/layout-land/activity_main.xml @@ -42,15 +42,31 @@ app:layout_constraintStart_toEndOf="@+id/iv_back" app:layout_constraintTop_toTopOf="parent" /> + + +