diff --git a/app/build.gradle b/app/build.gradle index 4b7f58d..93e8576 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { //There are no CERT files because If the mini sdk version is 23+, the AGP will ignore the V1 scheme signature. minSdkVersion 23 targetSdkVersion 29 - versionCode 3 - versionName "1.0.2" + versionCode 7 + versionName "1.0.6" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -128,6 +128,8 @@ android { dependencies { // implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation files('libs/CSDK_TBY11_AiYouDu_250312.jar') + compileOnly files('libs/framework.jar') implementation project(path: ':FlycoTabLayoutZ_Lib') @@ -140,6 +142,7 @@ dependencies { implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' implementation "androidx.viewpager2:viewpager2:1.0.0" implementation 'androidx.cardview:cardview:1.0.0' + implementation "androidx.multidex:multidex:2.0.1" implementation 'androidx.legacy:legacy-support-v4:1.0.0' testImplementation 'junit:junit:4.12' diff --git a/app/libs/CSDK_TBY11_AiYouDu_250312.jar b/app/libs/CSDK_TBY11_AiYouDu_250312.jar new file mode 100644 index 0000000..abff99a Binary files /dev/null and b/app/libs/CSDK_TBY11_AiYouDu_250312.jar differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 20a9e98..d1086e6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,6 @@ + package="com.hainaos.vc"> @@ -11,6 +10,7 @@ android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" + android:requestLegacyExternalStorage="true" android:supportsRtl="true" android:theme="@style/AppTheme"> @@ -62,6 +62,12 @@ android:name=".activity.category.list.CategoryListActivity" android:launchMode="singleTask" android:screenOrientation="portrait" /> + + categoryInfos = baseResponse.data; mCategoryInfoListData.setValue(categoryInfos); + } else { + Toaster.show(baseResponse.msg); } } diff --git a/app/src/main/java/com/hainaos/vc/activity/login/LoginActivity.java b/app/src/main/java/com/hainaos/vc/activity/login/LoginActivity.java index 7f12007..f2c7285 100644 --- a/app/src/main/java/com/hainaos/vc/activity/login/LoginActivity.java +++ b/app/src/main/java/com/hainaos/vc/activity/login/LoginActivity.java @@ -134,7 +134,14 @@ public class LoginActivity extends BaseMvvmActivity>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("accountLogin", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse baseResponse) { + Log.e("accountLogin", "onNext: " + baseResponse); + if (baseResponse.code == 200) { + LoginInfo loginInfo = baseResponse.data; + LoginUtils.getInstance().setLoginInfo(loginInfo); + mLoginInfoMutableLiveData.setValue(loginInfo); + } else { + LoginUtils.getInstance().clearLoginInfo(); + Toaster.show(baseResponse.msg); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("accountLogin", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("accountLogin", "onComplete: "); + } + }); + } + public MutableLiveData> mCodeInfoyData = new MutableLiveData<>(); public void sendCode(String phoneNumber) { diff --git a/app/src/main/java/com/hainaos/vc/activity/main/MainActivity.java b/app/src/main/java/com/hainaos/vc/activity/main/MainActivity.java index 96926d7..d7fd4a7 100644 --- a/app/src/main/java/com/hainaos/vc/activity/main/MainActivity.java +++ b/app/src/main/java/com/hainaos/vc/activity/main/MainActivity.java @@ -34,8 +34,8 @@ import com.hainaos.vc.fragment.app.AppFragment; import com.hainaos.vc.fragment.category.CategoryFragment; import com.hainaos.vc.utils.ApkUtils; import com.hainaos.vc.utils.JgyUtils; +import com.hainaos.vc.utils.LenovoCsdkUtil; import com.hainaos.vc.utils.ToastUtil; -import com.hainaos.vc.utils.Utils; import com.hainaos.vc.utils.VideoUtils; import com.hjq.permissions.OnPermissionCallback; import com.hjq.permissions.XXPermissions; @@ -86,7 +86,7 @@ public class MainActivity extends BaseMvvmActivity baseResponse) { Log.e("checkUpdate", "onNext: " + baseResponse); } diff --git a/app/src/main/java/com/hainaos/vc/activity/update/UpdateActivity.java b/app/src/main/java/com/hainaos/vc/activity/update/UpdateActivity.java new file mode 100644 index 0000000..d46d676 --- /dev/null +++ b/app/src/main/java/com/hainaos/vc/activity/update/UpdateActivity.java @@ -0,0 +1,91 @@ +package com.hainaos.vc.activity.update; + +import android.content.Intent; +import android.view.View; + +import com.arialyy.aria.core.Aria; +import com.arialyy.aria.core.download.DownloadEntity; +import com.hainaos.vc.R; +import com.hainaos.vc.base.mvvm.BaseMvvmActivity; +import com.hainaos.vc.bean.AppInfo; +import com.hainaos.vc.databinding.ActivityUpdateBinding; +import com.hainaos.vc.service.DownloadService; +import com.hainaos.vc.utils.ApkUtils; +import com.hainaos.vc.utils.LenovoCsdkUtil; +import com.hjq.toast.Toaster; + +import static com.arialyy.aria.core.inf.IEntity.STATE_RUNNING; + +public class UpdateActivity extends BaseMvvmActivity { + + private AppInfo mAppInfoData; + + + @Override + protected int getLayoutId() { + return R.layout.activity_update; + } + + @Override + protected void initDataBinding() { + mViewModel.setCtx(this); + mViewModel.setLifecycle(getLifecycleSubject()); + mViewModel.setVDBinding(mViewDataBinding); + mViewDataBinding.setClick(new BtnClick()); + } + + @Override + protected void initView() { + + } + + @Override + protected void initData() { + Intent intent = getIntent(); + mAppInfoData = (AppInfo) intent.getSerializableExtra("AppInfo"); + mViewDataBinding.setAppInfo(mAppInfoData); + mViewDataBinding.setMsg("检测到新版本,是否更新"); + } + + + public class BtnClick { + public void empty(View view) { + + } + + public void exit(View view) { + finish(); + } + + public void upgrade(View view) { + Intent intent = new Intent(UpdateActivity.this, DownloadService.class); +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { +// startForegroundService(intent); +// } else { + startService(intent); +// } + if (mAppInfoData != null) { + DownloadEntity entity = Aria.download(this).getFirstDownloadEntity(mAppInfoData.getApp_url()); + if (null != entity) { + if (entity.isComplete()) { + LenovoCsdkUtil.getInstance().installPackage(entity.getFilePath()); + } else { + if (entity.getState() == STATE_RUNNING) { + Toaster.show("文件正在下载中"); + finish(); + } else { + Aria.download(this).resumeAllTask(); + Toaster.show("正在下载"); + finish(); + } + } + } else { + ApkUtils.checkAppUpdate(UpdateActivity.this, mAppInfoData); + Toaster.show("正在下载更新"); + finish(); + } + } + + } + } +} diff --git a/app/src/main/java/com/hainaos/vc/activity/update/UpdateViewModel.java b/app/src/main/java/com/hainaos/vc/activity/update/UpdateViewModel.java new file mode 100644 index 0000000..b62d158 --- /dev/null +++ b/app/src/main/java/com/hainaos/vc/activity/update/UpdateViewModel.java @@ -0,0 +1,18 @@ +package com.hainaos.vc.activity.update; + +import com.hainaos.vc.base.mvvm.BaseViewModel; +import com.hainaos.vc.databinding.ActivityUpdateBinding; +import com.trello.rxlifecycle4.android.ActivityEvent; + +public class UpdateViewModel extends BaseViewModel { + + @Override + public ActivityUpdateBinding getVDBinding() { + return binding; + } + + @Override + public void onDestroy() { + + } +} diff --git a/app/src/main/java/com/hainaos/vc/activity/user/UserActivity.java b/app/src/main/java/com/hainaos/vc/activity/user/UserActivity.java index 17b5cbd..a3ee6c8 100644 --- a/app/src/main/java/com/hainaos/vc/activity/user/UserActivity.java +++ b/app/src/main/java/com/hainaos/vc/activity/user/UserActivity.java @@ -2,6 +2,7 @@ package com.hainaos.vc.activity.user; import android.app.Activity; import android.content.Intent; +import android.os.Handler; import android.util.Log; import android.view.View; @@ -11,15 +12,20 @@ import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.lifecycle.Observer; +import com.hainaos.vc.BuildConfig; import com.hainaos.vc.R; import com.hainaos.vc.activity.lockpasswd.LockPasswdActivity; import com.hainaos.vc.activity.login.LoginActivity; import com.hainaos.vc.activity.mobile.ModifyActivity; import com.hainaos.vc.activity.passwd.PasswdActivity; +import com.hainaos.vc.activity.update.UpdateActivity; import com.hainaos.vc.base.mvvm.BaseMvvmActivity; +import com.hainaos.vc.bean.AppInfo; import com.hainaos.vc.bean.BaseResponse; import com.hainaos.vc.bean.UserInfo; import com.hainaos.vc.databinding.ActivityUserBinding; +import com.hainaos.vc.utils.ApkUtils; +import com.hainaos.vc.utils.LenovoCsdkUtil; import com.hainaos.vc.utils.LoginUtils; import com.hainaos.vc.utils.Utils; import com.hjq.toast.Toaster; @@ -45,11 +51,30 @@ public class UserActivity extends BaseMvvmActivity() { + @Override + public void onChanged(AppInfo appInfo) { + if (appInfo != null) { + if (ApkUtils.isUpdate(UserActivity.this, appInfo)) { + Intent intent = new Intent(UserActivity.this, UpdateActivity.class); + intent.putExtra("AppInfo", appInfo); + startActivity(intent); + Toaster.show("有新的版本需要更新"); + } else { +// Toaster.show("已是最新版本"); + } + } else { +// Toaster.show("已是最新版本"); + } + } + }); + mViewModel.checkUpdate(); + mViewModel.mUserInfoMutableLiveData.observe(this, new Observer>() { @Override public void onChanged(BaseResponse baseResponse) { @@ -74,7 +99,7 @@ public class UserActivity extends BaseMvvmActivity { @@ -32,7 +40,6 @@ public class UserViewModel extends BaseViewModel> mUserInfoMutableLiveData = new MutableLiveData<>(); - public void getUserInfo() { NetInterfaceManager.getInstance().getUserInfoObservable() .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) @@ -59,4 +66,84 @@ public class UserViewModel extends BaseViewModel mAppInfoMutableLiveData = new MutableLiveData<>(); + + public void checkUpdate() { + Observable.zip(NetInterfaceManager.getInstance().getCheckUpdateObservable(), NetInterfaceManager.getInstance().getCheckUpdateObservable(BuildConfig.APPLICATION_ID), new BiFunction, BaseResponse, AppInfo>() { + @Override + public AppInfo apply(BaseResponse appInfoBaseResponse, BaseResponse appUpdateInfoBaseResponse) throws Throwable { + if (appInfoBaseResponse.code == 200) { + AppInfo appInfo = appInfoBaseResponse.data; + return appInfo; + } + if (appUpdateInfoBaseResponse.code == 200) { + AppUpdateInfo appUpdateInfo = appUpdateInfoBaseResponse.data; + return appUpdateInfo.toAppInfo(); + } + return null; + } + }).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("checkUpdate", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull AppInfo appInfo) { + Log.e("checkUpdate", "onNext: " + appInfo); + mAppInfoMutableLiveData.setValue(appInfo); + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("checkUpdate", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("checkUpdate", "onComplete: "); + } + }); + + } + + public MutableLiveData mAppUpdateInfoUiUiOSData = new MutableLiveData<>(); + + public void checkUpdateUiUiOS(String pkg) { + NetInterfaceManager.getInstance().getCheckUpdateObservable(pkg) + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("checkUpdate", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse appUpdateInfoBaseResponse) { + Log.e("checkUpdate", "onNext: " + appUpdateInfoBaseResponse); + if (appUpdateInfoBaseResponse.code == 200) { + AppUpdateInfo appUpdateInfo = appUpdateInfoBaseResponse.data; + mAppUpdateInfoUiUiOSData.setValue(appUpdateInfo); + } else { + mAppUpdateInfoUiUiOSData.setValue(null); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("checkUpdate", "onError: "); + Toaster.show("网络连接失败"); + } + + @Override + public void onComplete() { + Log.e("checkUpdate", "onComplete: "); + } + }); + } + } diff --git a/app/src/main/java/com/hainaos/vc/adapter/HomeAppAdapter.java b/app/src/main/java/com/hainaos/vc/adapter/HomeAppAdapter.java index b983dcb..6975667 100644 --- a/app/src/main/java/com/hainaos/vc/adapter/HomeAppAdapter.java +++ b/app/src/main/java/com/hainaos/vc/adapter/HomeAppAdapter.java @@ -72,7 +72,7 @@ public class HomeAppAdapter extends RecyclerView.Adapter holder.iv_icon.setImageDrawable(mContext.getDrawable(R.drawable.icon_user_center)); break; case DOWNLOAD_CENTER: - holder.iv_icon.setImageDrawable(mContext.getDrawable(R.drawable.icon_download)); + holder.iv_icon.setImageDrawable(mContext.getDrawable(R.drawable.icon_download_manager)); break; default: holder.iv_icon.setImageDrawable(mContext.getDrawable(R.drawable.icon_category)); diff --git a/app/src/main/java/com/hainaos/vc/adapter/HomeCategoryAdapter.java b/app/src/main/java/com/hainaos/vc/adapter/HomeCategoryAdapter.java index 297c151..6721e3f 100644 --- a/app/src/main/java/com/hainaos/vc/adapter/HomeCategoryAdapter.java +++ b/app/src/main/java/com/hainaos/vc/adapter/HomeCategoryAdapter.java @@ -67,7 +67,7 @@ public class HomeCategoryAdapter extends RecyclerView.Adapter { + private static final String TAG = "AppFragment"; private Activity mContext; private HomeAppAdapter mHomeAppAdapter; @@ -56,6 +58,14 @@ public class AppFragment extends BaseMvvmFragment { + private static final String TAG = "CategoryFragment"; private Activity mContext; // private HomeAppAdapter mHomeAppAdapter; @@ -66,10 +68,18 @@ public class CategoryFragment extends BaseMvvmFragment homeAppInfos = new ArrayList<>(); - homeAppInfos.add(new HomeAppInfo("分类1", "", "", "1", true)); - homeAppInfos.add(new HomeAppInfo("分类2", "", "", "2", true)); - homeAppInfos.add(new HomeAppInfo("分类3", "", "", "3", true)); - homeAppInfos.add(new HomeAppInfo("分类4", "", "", "4", true)); - homeAppInfos.add(new HomeAppInfo("分类5", "", "", "5", true)); - homeAppInfos.add(new HomeAppInfo("分类6", "", "", "6", true)); - homeAppInfos.add(new HomeAppInfo("分类7", "", "", "7", true)); - homeAppInfos.add(new HomeAppInfo("分类8", "", "", "8", true)); - homeAppInfos.add(new HomeAppInfo("分类9", "", "", "9", true)); - homeAppInfos.add(new HomeAppInfo("分类10", "", "", "10", true)); + List homeAppInfos = new ArrayList<>(); + homeAppInfos.add(new CategoryInfo("分类1", "", 1, "a1")); + homeAppInfos.add(new CategoryInfo("分类2", "", 1, "a2")); + homeAppInfos.add(new CategoryInfo("分类3", "", 1, "a3")); + homeAppInfos.add(new CategoryInfo("分类4", "", 1, "a4")); + homeAppInfos.add(new CategoryInfo("分类5", "", 1, "a5")); + homeAppInfos.add(new CategoryInfo("分类6", "", 1, "a6")); + homeAppInfos.add(new CategoryInfo("分类7", "", 1, "a7")); + homeAppInfos.add(new CategoryInfo("分类8", "", 1, "a8")); + homeAppInfos.add(new CategoryInfo("分类9", "", 1, "a9")); + homeAppInfos.add(new CategoryInfo("分类10", "", 1, "a10")); - homeAppInfos.add(new HomeAppInfo("下载视频", HomeAppAdapter.DOWNLOAD_CENTER, "", "", true)); - homeAppInfos.add(new HomeAppInfo("用户中心", HomeAppAdapter.USER_CENTER, "", "", true)); +// homeAppInfos.add(new CategoryInfo("下载视频", HomeAppAdapter.DOWNLOAD_CENTER, 1, "")); +// homeAppInfos.add(new CategoryInfo("用户中心", HomeAppAdapter.USER_CENTER, 1, "")); - mHomeAppInfoListData.setValue(homeAppInfos); + mCategoryInfoListData.setValue(homeAppInfos); } public MutableLiveData> mCategoryInfoListData = new MutableLiveData<>(); @@ -78,6 +77,8 @@ public class CategoryViewModel extends BaseViewModel categoryInfos = baseResponse.data; mCategoryInfoListData.setValue(categoryInfos); + } else { + getDirList(); } } diff --git a/app/src/main/java/com/hainaos/vc/network/NetInterfaceManager.java b/app/src/main/java/com/hainaos/vc/network/NetInterfaceManager.java index 25b1a31..6a25de6 100644 --- a/app/src/main/java/com/hainaos/vc/network/NetInterfaceManager.java +++ b/app/src/main/java/com/hainaos/vc/network/NetInterfaceManager.java @@ -4,6 +4,7 @@ import android.annotation.SuppressLint; import android.content.Context; import com.hainaos.vc.BuildConfig; +import com.hainaos.vc.bean.AppInfo; import com.hainaos.vc.bean.BaseResponse; import com.hainaos.vc.bean.CategoryInfo; import com.hainaos.vc.bean.CodeInfo; @@ -19,8 +20,8 @@ import com.hainaos.vc.network.api.VideoApi; import com.hainaos.vc.network.api.uiuios.CheckUpdateApi; import com.hainaos.vc.network.interceptor.RepeatRequestInterceptor; import com.hainaos.vc.utils.FileUtils; +import com.hainaos.vc.utils.LenovoCsdkUtil; import com.hainaos.vc.utils.LoginUtils; -import com.hainaos.vc.utils.Utils; import com.tencent.mmkv.MMKV; import java.io.File; @@ -154,16 +155,16 @@ public class NetInterfaceManager { * * */ - public Observable getLoginObservable(String mobile, String password) { + public Observable> getLoginObservable(String mobile, String password) { return getLoginApi() - .login(Utils.getSerial(), mobile, password) + .login(LenovoCsdkUtil.getInstance().getSerial(), mobile, password) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable> getPhoneLoginObservable(String verify_key, String mobile, String captcha) { return getLoginApi() - .mobileLogin(Utils.getSerial(), mobile, captcha, verify_key) + .mobileLogin(LenovoCsdkUtil.getInstance().getSerial(), mobile, captcha, verify_key) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } @@ -247,7 +248,7 @@ public class NetInterfaceManager { .observeOn(AndroidSchedulers.mainThread()); } - public Observable getCheckUpdateObservable() { + public Observable> getCheckUpdateObservable() { return mRetrofit.create(AppApi.class) .checkUpdate(BuildConfig.APPLICATION_ID) .subscribeOn(Schedulers.io()) diff --git a/app/src/main/java/com/hainaos/vc/network/api/AppApi.java b/app/src/main/java/com/hainaos/vc/network/api/AppApi.java index bf1d753..15a64aa 100644 --- a/app/src/main/java/com/hainaos/vc/network/api/AppApi.java +++ b/app/src/main/java/com/hainaos/vc/network/api/AppApi.java @@ -1,5 +1,6 @@ package com.hainaos.vc.network.api; +import com.hainaos.vc.bean.AppInfo; import com.hainaos.vc.bean.BaseResponse; import com.hainaos.vc.network.UrlAddress; @@ -9,7 +10,7 @@ import retrofit2.http.Query; public interface AppApi { @GET(UrlAddress.app_CHECK_UPDATE) - Observable checkUpdate( + Observable> checkUpdate( @Query("app_package") String app_package ); } diff --git a/app/src/main/java/com/hainaos/vc/network/api/LoginApi.java b/app/src/main/java/com/hainaos/vc/network/api/LoginApi.java index 26970fe..1828dcb 100644 --- a/app/src/main/java/com/hainaos/vc/network/api/LoginApi.java +++ b/app/src/main/java/com/hainaos/vc/network/api/LoginApi.java @@ -15,7 +15,7 @@ import retrofit2.http.Query; public interface LoginApi { @FormUrlEncoded @POST(UrlAddress.LOGIN) - Observable login( + Observable> login( @Field("sn") String sn, @Field("mobile") String mobile, @Field("password") String password diff --git a/app/src/main/java/com/hainaos/vc/service/DownloadService.java b/app/src/main/java/com/hainaos/vc/service/DownloadService.java index ae41994..481ba91 100644 --- a/app/src/main/java/com/hainaos/vc/service/DownloadService.java +++ b/app/src/main/java/com/hainaos/vc/service/DownloadService.java @@ -23,7 +23,7 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.hainaos.vc.R; import com.hainaos.vc.bean.uiuios.AriaDownloadInfo; -import com.hainaos.vc.utils.ApkUtils; +import com.hainaos.vc.utils.LenovoCsdkUtil; import com.hjq.toast.Toaster; import java.io.File; @@ -206,7 +206,7 @@ public class DownloadService extends Service { String path = task.getFilePath(); Log.e(TAG, "taskComplete: " + path); if (path.endsWith(".apk")) { - ApkUtils.installApp(DownloadService.this, task.getFilePath()); + LenovoCsdkUtil.getInstance().installPackage(task.getFilePath()); String jsonString = task.getExtendField(); Log.e(TAG, "taskComplete: " + "下载完成:" + jsonString); AriaDownloadInfo ariaDownloadInfo = getAriaDownloadInfo(jsonString); diff --git a/app/src/main/java/com/hainaos/vc/utils/ApkUtils.java b/app/src/main/java/com/hainaos/vc/utils/ApkUtils.java index f5464be..b381073 100644 --- a/app/src/main/java/com/hainaos/vc/utils/ApkUtils.java +++ b/app/src/main/java/com/hainaos/vc/utils/ApkUtils.java @@ -4,6 +4,7 @@ import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; @@ -15,6 +16,7 @@ import android.util.Log; import androidx.annotation.RequiresApi; import com.hainaos.vc.BuildConfig; +import com.hainaos.vc.bean.AppInfo; import com.hainaos.vc.bean.uiuios.AppUpdateInfo; import com.hainaos.vc.receiver.InstallResultReceiver; import com.hjq.toast.Toaster; @@ -248,6 +250,12 @@ public class ApkUtils { return isUpdate(context, packageName, versionCode); } + public static boolean isUpdate(Context context, AppInfo appUpdateInfo) { + String packageName = appUpdateInfo.getApp_package(); + long versionCode = appUpdateInfo.getApp_version_code(); + return isUpdate(context, packageName, versionCode); + } + public static boolean isUpdate(Context context, String packageName, long versionCode) { PackageInfo packageInfo = null; try { @@ -273,6 +281,33 @@ public class ApkUtils { } } + public static void checkAppUpdate(Context context, AppInfo appInfo) { + String packageName = appInfo.getApp_package(); + long versionCode = appInfo.getApp_version_code(); + String url = appInfo.getApp_url(); + PackageInfo packageInfo = null; + try { + packageInfo = context.getPackageManager().getPackageInfo(packageName, 0); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + if (packageInfo == null) { + FileUtils.ariaDownload(context, url, appInfo); + } else { + long appVersionCode; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + appVersionCode = packageInfo.getLongVersionCode(); + } else { + appVersionCode = packageInfo.versionCode; + } + if (appVersionCode < versionCode) { + FileUtils.ariaDownload(context, url, appInfo); + } else { + Log.e(TAG, "checkUpdate: " + packageName + "\t已经是最新版"); + } + } + } + public static void checkAppUpdate(Context context, AppUpdateInfo appUpdateInfo) { String packageName = appUpdateInfo.getApp().getApp_package(); long versionCode = appUpdateInfo.getApp_version_code(); @@ -300,5 +335,17 @@ public class ApkUtils { } } - + /** + * 根据文件路径获取包名 + */ + public static String getPackageName(Context context, String filePath) { + PackageManager packageManager = context.getPackageManager(); + PackageInfo info = packageManager.getPackageArchiveInfo(filePath, PackageManager.GET_ACTIVITIES); + if (info != null) { + ApplicationInfo appInfo = info.applicationInfo; + Log.e(TAG, "getPackageName: " + appInfo.packageName); + return appInfo.packageName; //得到安装包名称 + } + return null; + } } diff --git a/app/src/main/java/com/hainaos/vc/utils/FileUtils.java b/app/src/main/java/com/hainaos/vc/utils/FileUtils.java index 5818017..35acb92 100644 --- a/app/src/main/java/com/hainaos/vc/utils/FileUtils.java +++ b/app/src/main/java/com/hainaos/vc/utils/FileUtils.java @@ -6,9 +6,8 @@ import android.os.Environment; import android.text.TextUtils; import android.util.Log; -import androidx.core.content.ContextCompat; - import com.arialyy.aria.core.Aria; +import com.hainaos.vc.bean.AppInfo; import com.hainaos.vc.bean.uiuios.AppUpdateInfo; import com.hainaos.vc.bean.uiuios.AriaDownloadInfo; import com.hainaos.vc.gson.GsonUtils; @@ -82,7 +81,8 @@ public class FileUtils { } public static String getDownLoadPath(Context context) { - String path = ContextCompat.getExternalFilesDirs(context, Environment.DIRECTORY_DOWNLOADS)[0].getAbsolutePath(); +// String path = ContextCompat.getExternalFilesDirs(context, Environment.DIRECTORY_DOWNLOADS)[0].getAbsolutePath(); + String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(); return path + File.separator; } @@ -122,6 +122,12 @@ public class FileUtils { } } + public static void ariaDownload(Context context, String url, AppInfo appInfo) { + Log.e(TAG, "ariaDownload: " + appInfo); + AriaDownloadInfo ariaDownloadInfo = AriaDownloadInfo.toAriaDownloadInfo(appInfo); + ariaDownload(context, url, ariaDownloadInfo); + } + public static void ariaDownload(Context context, String url, AppUpdateInfo appUpdateInfo) { Log.e(TAG, "ariaDownload: " + appUpdateInfo); AriaDownloadInfo ariaDownloadInfo = AriaDownloadInfo.toAriaDownloadInfo(appUpdateInfo); @@ -138,7 +144,7 @@ public class FileUtils { String fileMd5 = com.blankj.utilcode.util.FileUtils.getFileMD5ToString(file); Log.e("ariaDownload", "fileMD5 = " + fileMd5); if (fileMd5.equalsIgnoreCase(app_md5)) { - ApkUtils.installApp(context, file.getAbsolutePath()); + LenovoCsdkUtil.getInstance().installPackage(file.getAbsolutePath()); } else { file.delete(); Aria.download(context) diff --git a/app/src/main/java/com/hainaos/vc/utils/LenovoCsdkUtil.java b/app/src/main/java/com/hainaos/vc/utils/LenovoCsdkUtil.java new file mode 100644 index 0000000..9447379 --- /dev/null +++ b/app/src/main/java/com/hainaos/vc/utils/LenovoCsdkUtil.java @@ -0,0 +1,137 @@ +package com.hainaos.vc.utils; + +import android.annotation.SuppressLint; +import android.app.csdk.CSDKManager; +import android.content.Context; +import android.util.Log; + +import com.hainaos.vc.BuildConfig; +import com.hainaos.vc.config.CommonConfig; +import com.tencent.mmkv.MMKV; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class LenovoCsdkUtil { + private static final String TAG = "LenovoCsdkUtil"; + + @SuppressLint("StaticFieldLeak") + private static LenovoCsdkUtil sInstance; + private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + private Context mContext; + private CSDKManager mCSDKManager; + + + private LenovoCsdkUtil(Context context) { + if (context == null) { + throw new RuntimeException("Context is NULL"); + } + this.mContext = context; + try { + this.mCSDKManager = new CSDKManager(context); + } catch (Exception e) { + Log.e(TAG, "LenovoCsdkUtil: " + e.getMessage()); + } + if (mCSDKManager.isLicenseKeyEnabled(BuildConfig.APPLICATION_ID)) { + Log.e(TAG, "LenovoCsdkUtil: devices activated"); + } else { + Log.e(TAG, "LenovoCsdkUtil: devices not activated"); + } + List packages = mCSDKManager.getRuntimePermissionWhiteList(); + if (!packages.contains(BuildConfig.APPLICATION_ID)) { + packages.add(BuildConfig.APPLICATION_ID); + } + mCSDKManager.addRuntimePermissionWhiteList(packages); + Log.e(TAG, "setDefaultSetting: getRuntimePermissionWhiteList = " + mCSDKManager.getRuntimePermissionWhiteList()); + } + + public static void init(Context context) { + if (sInstance == null) { + Log.e(TAG, "init: "); + sInstance = new LenovoCsdkUtil(context); + } + } + + public static LenovoCsdkUtil getInstance() { + if (sInstance == null) { + throw new IllegalStateException("You must be init LenovoCsdkUtil first"); + } + return sInstance; + } + + /** + * int: 1 MAC + * int: 2 SN + * int: 3 Model + * int: 4 IMEI + */ + public String getDeviceMac() { + String mac = mCSDKManager.getDeviceInfo(1); + return mac; + } + + public String getSerial() { + if (BuildConfig.DEBUG) { + return "T98005H1024GB32GB"; + } + + String sn = mCSDKManager.getDeviceInfo(2); + return sn; + } + + public String getDeviceModel() { + String model = mCSDKManager.getDeviceInfo(3); + return model; + } + + public String getDeviceIMEI() { + String imei = mCSDKManager.getDeviceInfo(4); + return imei; + } + + public void setCustomLauncher(String launcherPackageName, String launcherActivity) { + Log.e(TAG, "setDefaultLauncher: " + launcherPackageName); + mCSDKManager.setCustomLauncher(launcherPackageName, launcherActivity); + } + + public void addInstallPackageWhiteList(String pkg) { + List pkgList = mCSDKManager.getInstallPackageWhiteList(); + Set pkgSet; + if (pkgList == null) { + pkgSet = new HashSet<>(); + } else { + pkgSet = new HashSet<>(pkgList); + } + pkgSet.add(pkg); +// pkgSet.addAll(ApkUtils.aoleyunAPP); + Log.e(TAG, "addInstallPackageWhiteList: " + pkgSet); + mCSDKManager.addInstallPackageWhiteList(new ArrayList<>(pkgSet)); + } + + public void installPackage(String path) { + String pkg = ApkUtils.getPackageName(mContext, path); + addInstallPackageWhiteList(pkg); + Log.e(TAG, "installPackage: " + path); + mCSDKManager.setPersistValue("persist.sys.csdk.installpackage.verification", "true"); + mCSDKManager.installPackage(path); + } + + public void installPackage(File file) { + String path = file.getAbsolutePath(); + String pkg = ApkUtils.getPackageName(mContext, path); + addInstallPackageWhiteList(pkg); + Log.e(TAG, "installPackage: " + path); + mCSDKManager.setPersistValue("persist.sys.csdk.installpackage.verification", "true"); + mCSDKManager.installPackage(path); + } + + public void killApplicationProcess(String packageName) { + Log.e(TAG, "killApplicationProcess: " + packageName); + mCSDKManager.killApplicationProcess(packageName); + } + + +} diff --git a/app/src/main/java/com/hainaos/vc/utils/LoginUtils.java b/app/src/main/java/com/hainaos/vc/utils/LoginUtils.java index 36c4926..d315c76 100644 --- a/app/src/main/java/com/hainaos/vc/utils/LoginUtils.java +++ b/app/src/main/java/com/hainaos/vc/utils/LoginUtils.java @@ -21,7 +21,7 @@ public class LoginUtils { private static final String USER_TOKEN_KEY = "user_token"; - private static final String USER_LOGIN_STATU_KEY = "user_token"; + private static final String USER_LOGIN_STATU_KEY = "user_login_status"; @SuppressLint("StaticFieldLeak") private static LoginUtils sInstance; diff --git a/app/src/main/java/com/hainaos/vc/utils/Utils.java b/app/src/main/java/com/hainaos/vc/utils/Utils.java index b217664..c3e955a 100644 --- a/app/src/main/java/com/hainaos/vc/utils/Utils.java +++ b/app/src/main/java/com/hainaos/vc/utils/Utils.java @@ -7,17 +7,15 @@ import android.os.StatFs; import android.text.format.Formatter; import android.util.Log; -import com.hainaos.vc.BuildConfig; - import java.lang.reflect.Method; public class Utils { @SuppressLint({"MissingPermission", "HardwareIds"}) public static String getSerial() { - if (BuildConfig.DEBUG) { - return "T98005H1024GB32GB"; - } +// if (BuildConfig.DEBUG) { +// return "T98005H1024GB32GB"; +// } String serial = "unknow"; try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {//9.0+ diff --git a/app/src/main/res/drawable-hdpi/icon_close.png b/app/src/main/res/drawable-hdpi/icon_close.png new file mode 100644 index 0000000..9ebcb0b Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon_close.png differ diff --git a/app/src/main/res/drawable-hdpi/icon_download_manager.png b/app/src/main/res/drawable-hdpi/icon_download_manager.png new file mode 100644 index 0000000..2065548 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon_download_manager.png differ diff --git a/app/src/main/res/drawable/dialog_background.xml b/app/src/main/res/drawable/dialog_background.xml new file mode 100644 index 0000000..eaf60cf --- /dev/null +++ b/app/src/main/res/drawable/dialog_background.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/app/src/main/res/drawable/update_background.xml b/app/src/main/res/drawable/update_background.xml new file mode 100644 index 0000000..a0b112f --- /dev/null +++ b/app/src/main/res/drawable/update_background.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/update_cancel_background.xml b/app/src/main/res/drawable/update_cancel_background.xml new file mode 100644 index 0000000..c328117 --- /dev/null +++ b/app/src/main/res/drawable/update_cancel_background.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_category_list.xml b/app/src/main/res/layout/activity_category_list.xml index 5e6d47b..7e79a82 100644 --- a/app/src/main/res/layout/activity_category_list.xml +++ b/app/src/main/res/layout/activity_category_list.xml @@ -17,13 +17,58 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> + + + + + + + + + + + + + app:layout_constraintTop_toBottomOf="@+id/cl_title" /> diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index e54f476..0d5669c 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -9,6 +9,13 @@ + + + + + - + app:layout_constraintTop_toTopOf="parent" + tools:text="验证码登录" /> - + + - - - - - - - - - - - - - + + + + + + + + + + android:layout_marginEnd="8dp" + android:onClick="@{click::getCode}" + app:cardCornerRadius="8dp" + app:cardElevation="4dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent"> - + - + - + + + + + + + android:layout_height="wrap_content" + android:orientation="vertical" + android:visibility="@{loginMode==0?View.GONE:View.VISIBLE}" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> - + + + + + + + + + + + + + + + + + + + - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_update.xml b/app/src/main/res/layout/activity_update.xml new file mode 100644 index 0000000..2226ceb --- /dev/null +++ b/app/src/main/res/layout/activity_update.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_user.xml b/app/src/main/res/layout/activity_user.xml index 9995fde..caeab94 100644 --- a/app/src/main/res/layout/activity_user.xml +++ b/app/src/main/res/layout/activity_user.xml @@ -30,15 +30,15 @@ + android:textSize="@dimen/user_center_title_size" /> + diff --git a/app/src/main/res/layout/fragment_app.xml b/app/src/main/res/layout/fragment_app.xml index d90e684..570de88 100644 --- a/app/src/main/res/layout/fragment_app.xml +++ b/app/src/main/res/layout/fragment_app.xml @@ -21,8 +21,9 @@ android:id="@+id/rv_app" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_marginTop="32dp" - android:overScrollMode="never" /> + android:overScrollMode="never" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png index 83f2334..07c0451 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png index 83f2334..07c0451 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 83f2334..07c0451 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 83f2334..07c0451 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 83f2334..07c0451 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 073228c..ccacbc9 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -6,7 +6,7 @@ #000000 #f7f7f9 - #0166ff + #4880ff #FFFFFF #000000 @@ -22,6 +22,8 @@ #D0A65E #FFFFFF + #98999a + #00000000 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 68ecf61..b0f7bad 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -8,10 +8,11 @@ 12dp 4dp - 16sp - 15sp - 40dp - 12dp + 13sp + 12sp + 32dp + 8dp 16dp + 12dp \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 2c5275b..ce1da40 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -70,4 +70,26 @@ true true + +