diff --git a/app/build.gradle b/app/build.gradle index c7d9e90..f5c9295 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { minSdkVersion 23 targetSdkVersion 29 - versionCode 22 - versionName "1.2.1" + versionCode 23 + versionName "1.2.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3a134a2..3f7b8b6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -285,11 +285,14 @@ android:exported="true" android:launchMode="standard" android:screenOrientation="sensorLandscape" - android:theme="@style/ActivityTheme2"> - - - - + android:theme="@style/ActivityTheme2" /> + { + private static final String TAG = "DownloadActivity"; + + private AppInfoAdapter mAppInfoAdapter; + private List mAppInfos; + + @Override + protected int getLayoutId() { + return R.layout.activity_other_app; + } + + @Override + protected void initDataBinding() { + mViewModel.setCtx(this); + mViewModel.setLifecycle(getLifecycleSubject()); + mViewModel.setVDBinding(mViewDataBinding); + mViewDataBinding.setClick(new BtnClick()); + } + + @Override + protected void initView() { + mAppInfoAdapter = new AppInfoAdapter(); + GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 4); + mViewDataBinding.rvContent.setLayoutManager(gridLayoutManager); + mViewDataBinding.rvContent.setAdapter(mAppInfoAdapter); + + registerAppChangedReceiver(); + } + + @Override + protected void initData() { + mViewModel.mListMutableLiveData.observe(this, new Observer>() { + @Override + public void onChanged(List appInfos) { + mAppInfos = appInfos; + mAppInfoAdapter.setAppInfos(appInfos); + if (appInfos == null || appInfos.isEmpty()) { + mViewDataBinding.clContent.setVisibility(View.GONE); + mViewDataBinding.llNodata.setVisibility(View.VISIBLE); + } else { + mViewDataBinding.clContent.setVisibility(View.VISIBLE); + mViewDataBinding.llNodata.setVisibility(View.GONE); + } + } + }); + mViewModel.getAdminApp(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (mAppChangedReceiver != null) { + unregisterReceiver(mAppChangedReceiver); + } + } + + private AppChangedReceiver mAppChangedReceiver; + + private void registerAppChangedReceiver() { + if (mAppChangedReceiver == null) { + mAppChangedReceiver = new AppChangedReceiver(); + } + 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(mAppChangedReceiver, filter); + } + + class AppChangedReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + Log.e("AppChangedReceiver", "onReceive: " + action); + if (TextUtils.isEmpty(action)) { + return; + } + mAppInfoAdapter.notifyDataSetChanged(); + } + } + + public class BtnClick { + public void exit(View view) { + finish(); + } + + public void downloadApp(View view) { + if (mAppInfos == null || mAppInfos.isEmpty()) { + Toaster.show("没有要下载的应用"); + } else { + if (ActivationUtil.getInstance().isActivation()) { + mAppInfos.forEach(new Consumer() { + @Override + public void accept(AppInfo appInfo) { + if (appInfo.getIs_must_components_down() == 1) { + if (!ApkUtils.isAvailable(OtherAppActivity.this, appInfo.getApp_package())) { + FileUtils.ariaDownload(OtherAppActivity.this, appInfo.getApp_url(), appInfo); + } + } + } + }); + } + } + } + } +} diff --git a/app/src/main/java/com/xwad/os/activity/app/OtherAppViewModel.java b/app/src/main/java/com/xwad/os/activity/app/OtherAppViewModel.java new file mode 100644 index 0000000..49a705e --- /dev/null +++ b/app/src/main/java/com/xwad/os/activity/app/OtherAppViewModel.java @@ -0,0 +1,74 @@ +package com.xwad.os.activity.app; + +import android.util.Log; + +import androidx.lifecycle.MutableLiveData; + +import com.trello.rxlifecycle4.RxLifecycle; +import com.trello.rxlifecycle4.android.ActivityEvent; +import com.xwad.os.base.mvvm.BaseViewModel; +import com.xwad.os.bean.AppInfo; +import com.xwad.os.bean.BaseResponse; +import com.xwad.os.databinding.ActivityOtherAppBinding; +import com.xwad.os.network.NetInterfaceManager; + +import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import io.reactivex.rxjava3.annotations.NonNull; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; + +public class OtherAppViewModel extends BaseViewModel { + + @Override + public ActivityOtherAppBinding getVDBinding() { + return binding; + } + + @Override + public void onDestroy() { + + } + + public MutableLiveData> mListMutableLiveData = new MutableLiveData<>(); + + public void getAdminApp() { + NetInterfaceManager.getInstance().get365AdminAppObservable() + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribe(new Observer>>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getAdminApp", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse> listBaseResponse) { + Log.e("getAdminApp", "onNext: " + listBaseResponse); + if (listBaseResponse.code == 200) { + List appInfoList = listBaseResponse.data; + List forceAppInfoList = appInfoList.stream() + .filter(new Predicate() { + @Override + public boolean test(AppInfo appInfo) { + return appInfo.getIs_must_components() == 0; + } + }).collect(Collectors.toList()); + mListMutableLiveData.setValue(forceAppInfoList); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getAdminApp", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("getAdminApp", "onComplete: "); + } + }); + } +} 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 48b5caf..0079433 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 @@ -11,7 +11,9 @@ import android.view.View; import androidx.lifecycle.Observer; import androidx.recyclerview.widget.GridLayoutManager; +import com.hjq.toast.Toaster; import com.xwad.os.R; +import com.xwad.os.activity.app.OtherAppActivity; import com.xwad.os.adapter.AppInfoAdapter; import com.xwad.os.base.mvvm.BaseMvvmActivity; import com.xwad.os.bean.AppInfo; @@ -26,8 +28,8 @@ import java.util.function.Consumer; public class DownloadActivity extends BaseMvvmActivity { private static final String TAG = "DownloadActivity"; - private AppInfoAdapter mAppInfoAdapter; + private List mAppInfos; @Override protected int getLayoutId() { @@ -57,25 +59,14 @@ public class DownloadActivity extends BaseMvvmActivity>() { @Override public void onChanged(List appInfos) { + mAppInfos = appInfos; mAppInfoAdapter.setAppInfos(appInfos); if (appInfos == null || appInfos.isEmpty()) { - mViewDataBinding.rvContent.setVisibility(View.GONE); + mViewDataBinding.clContent.setVisibility(View.GONE); mViewDataBinding.llNodata.setVisibility(View.VISIBLE); } else { - mViewDataBinding.rvContent.setVisibility(View.VISIBLE); + mViewDataBinding.clContent.setVisibility(View.VISIBLE); mViewDataBinding.llNodata.setVisibility(View.GONE); - if (ActivationUtil.getInstance().isActivation()) { - appInfos.forEach(new Consumer() { - @Override - public void accept(AppInfo appInfo) { - if (appInfo.getIs_must_components_down() == 1) { - if (!ApkUtils.isAvailable(DownloadActivity.this, appInfo.getApp_package())) { - FileUtils.ariaDownload(DownloadActivity.this, appInfo.getApp_url(), appInfo); - } - } - } - }); - } } } }); @@ -123,5 +114,28 @@ public class DownloadActivity extends BaseMvvmActivity() { + @Override + public void accept(AppInfo appInfo) { + if (appInfo.getIs_must_components_down() == 1) { + if (ApkUtils.isUpdate(DownloadActivity.this, appInfo)) { + FileUtils.ariaDownload(DownloadActivity.this, appInfo.getApp_url(), appInfo); + } + } + } + }); + } + } + } } } diff --git a/app/src/main/java/com/xwad/os/activity/download/DownloadViewModel.java b/app/src/main/java/com/xwad/os/activity/download/DownloadViewModel.java index 8ab6074..c4eaa11 100644 --- a/app/src/main/java/com/xwad/os/activity/download/DownloadViewModel.java +++ b/app/src/main/java/com/xwad/os/activity/download/DownloadViewModel.java @@ -12,6 +12,7 @@ import com.xwad.os.bean.BaseResponse; import com.xwad.os.databinding.ActivityDownloadBinding; import com.xwad.os.network.NetInterfaceManager; +import java.util.Comparator; import java.util.List; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -36,7 +37,7 @@ public class DownloadViewModel extends BaseViewModel> mListMutableLiveData = new MutableLiveData<>(); public void getAdminApp() { - NetInterfaceManager.getInstance().getAdminAppObservable() + NetInterfaceManager.getInstance().get365AdminAppObservable() .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) .subscribe(new Observer>>() { @Override @@ -49,12 +50,25 @@ public class DownloadViewModel extends BaseViewModel appInfoList = listBaseResponse.data; - List forceAppInfoList = appInfoList.stream().filter(new Predicate() { - @Override - public boolean test(AppInfo appInfo) { - return appInfo.getIs_must_components() == 1; - } - }).collect(Collectors.toList()); + List forceAppInfoList = appInfoList.stream() + .sorted(new Comparator() { + @Override + public int compare(AppInfo o1, AppInfo o2) { + if ("com.jxw.launcher".equals(o1.getApp_package()) && !"com.jxw.launcher".equals(o2.getApp_package())) { + return -1; + } else if (!"com.jxw.launcher".equals(o1.getApp_package()) && "com.jxw.launcher".equals(o2.getApp_package())) { + return 1; + } else { + return o1.getApp_package().compareTo(o2.getApp_package()); // 非目标包名按字母排序 + } + } + }) + .filter(new Predicate() { + @Override + public boolean test(AppInfo appInfo) { + return appInfo.getIs_must_components() == 1; + } + }).collect(Collectors.toList()); mListMutableLiveData.setValue(forceAppInfoList); } } diff --git a/app/src/main/java/com/xwad/os/adapter/AppInfoAdapter.java b/app/src/main/java/com/xwad/os/adapter/AppInfoAdapter.java index 4eed447..27129a4 100644 --- a/app/src/main/java/com/xwad/os/adapter/AppInfoAdapter.java +++ b/app/src/main/java/com/xwad/os/adapter/AppInfoAdapter.java @@ -70,7 +70,7 @@ public class AppInfoAdapter extends RecyclerView.Adapter ApkUtils.openPackage(mContext, appInfo.getApp_package()); } else { if (ActivationUtil.getInstance().isActivation()) { - OpenApkUtils.getInstance().showDownloadDialog(mContext, appInfo.getApp_package(), appInfo.getApp_name()); + OpenApkUtils.getInstance().showDownloadDialog(mContext, appInfo); } else { Toaster.show("请先激活设备"); } diff --git a/app/src/main/java/com/xwad/os/fragment/usercenter/account/AccountViewModel.java b/app/src/main/java/com/xwad/os/fragment/usercenter/account/AccountViewModel.java index c5629bc..5e94374 100644 --- a/app/src/main/java/com/xwad/os/fragment/usercenter/account/AccountViewModel.java +++ b/app/src/main/java/com/xwad/os/fragment/usercenter/account/AccountViewModel.java @@ -20,6 +20,7 @@ import com.xwad.os.utils.ActivationUtil; import com.xwad.os.utils.ApkUtils; import com.xwad.os.utils.FileUtils; +import java.util.Comparator; import java.util.List; import java.util.function.Consumer; import java.util.function.Predicate; @@ -157,6 +158,18 @@ public class AccountViewModel extends BaseViewModel appInfoList = listBaseResponse.data; appInfoList.stream() + .sorted(new Comparator() { + @Override + public int compare(AppInfo o1, AppInfo o2) { + if ("com.jxw.launcher".equals(o1.getApp_package()) && !"com.jxw.launcher".equals(o2.getApp_package())) { + return -1; + } else if (!"com.jxw.launcher".equals(o1.getApp_package()) && "com.jxw.launcher".equals(o2.getApp_package())) { + return 1; + } else { + return o1.getApp_package().compareTo(o2.getApp_package()); // 非目标包名按字母排序 + } + } + }) .filter(new Predicate() { @Override public boolean test(AppInfo appInfo) { diff --git a/app/src/main/java/com/xwad/os/network/NetInterfaceManager.java b/app/src/main/java/com/xwad/os/network/NetInterfaceManager.java index 865be78..ce972f8 100644 --- a/app/src/main/java/com/xwad/os/network/NetInterfaceManager.java +++ b/app/src/main/java/com/xwad/os/network/NetInterfaceManager.java @@ -563,6 +563,13 @@ public class NetInterfaceManager { .observeOn(AndroidSchedulers.mainThread()); } + public Observable>> get365AdminAppObservable() { + return mRetrofit.create(AppApi.class) + .getAdminApp(Utils.getSerial(), "11", BuildConfig.APPLICATION_ID) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + public Observable>> getAppIconObservable() { return mRetrofit.create(GetAppIconApi.class) .getAppIcon(Utils.getSerial()) diff --git a/app/src/main/java/com/xwad/os/network/api/AppApi.java b/app/src/main/java/com/xwad/os/network/api/AppApi.java index 89082e8..93ec846 100644 --- a/app/src/main/java/com/xwad/os/network/api/AppApi.java +++ b/app/src/main/java/com/xwad/os/network/api/AppApi.java @@ -19,6 +19,13 @@ public interface AppApi { @Query("sn") String sn ); + @GET(UrlAddress.GET_ADMIN_APP) + Observable>> getAdminApp( + @Query("sn") String sn, + @Query("class_id") String class_id, + @Query("desktop_package") String desktop_package + ); + @GET(UrlAddress.APP_FORCE_INSTALL) Observable> getAdminApp( @Query("desktop_app_package") String desktop_app_package, diff --git a/app/src/main/java/com/xwad/os/service/main/MainSContact.java b/app/src/main/java/com/xwad/os/service/main/MainSContact.java index 60d1699..35368a0 100644 --- a/app/src/main/java/com/xwad/os/service/main/MainSContact.java +++ b/app/src/main/java/com/xwad/os/service/main/MainSContact.java @@ -54,6 +54,8 @@ public class MainSContact { void getTestApp(); /*获取管理员应用*/ void getAdminApp(); + + void getAdminAppDownload(); /*获取id管控*/ void getAppInside(); diff --git a/app/src/main/java/com/xwad/os/service/main/MainSPresenter.java b/app/src/main/java/com/xwad/os/service/main/MainSPresenter.java index c3bdc6c..574ec23 100644 --- a/app/src/main/java/com/xwad/os/service/main/MainSPresenter.java +++ b/app/src/main/java/com/xwad/os/service/main/MainSPresenter.java @@ -2,6 +2,9 @@ package com.xwad.os.service.main; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.os.Build; import android.util.Log; import com.google.gson.JsonObject; @@ -22,6 +25,7 @@ import com.xwad.os.utils.FileUtils; import com.xwad.os.utils.ServiceAliveUtils; import com.xwad.os.utils.Utils; +import java.util.Comparator; import java.util.List; import java.util.Set; import java.util.function.Consumer; @@ -145,53 +149,6 @@ public class MainSPresenter implements MainSContact.Presenter { }); } - 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; - appInfoList.stream() - .filter(new Predicate() { - @Override - public boolean test(AppInfo appInfo) { - return appInfo.getIs_must_components() == 1; - } - }) - .forEach(new Consumer() { - @Override - public void accept(AppInfo appInfo) { - if (appInfo.getIs_must_components_down() == 1) { - if (!ApkUtils.isAvailable(mContext, appInfo.getApp_package())) { - FileUtils.ariaDownload(mContext, appInfo.getApp_url(), appInfo); - } - } - } - }); - } - } - - @Override - public void onError(@NonNull Throwable e) { - Log.e("getAdminAppDownload", "onError: " + e.getMessage()); - onComplete(); - } - - @Override - public void onComplete() { - Log.e("getAdminAppDownload", "onComplete: "); - } - }); - } - public void getAppInfo(String pkg) { NetInterfaceManager.getInstance().getAdminAppObservable(pkg) .subscribe(new Observer>() { @@ -331,12 +288,68 @@ public class MainSPresenter implements MainSContact.Presenter { @Override public void getTestApp() { + NetInterfaceManager.getInstance().getTestAppObservable() + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribe(new Observer>>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getTestApp", "onSubscribe: "); + } + @Override + public void onNext(@NonNull BaseResponse> listBaseResponse) { + Log.e("getTestApp", "onNext: " + listBaseResponse); + if (listBaseResponse.code == 200) { + List appInfos = listBaseResponse.data; + PackageManager pm = mContext.getPackageManager(); + appInfos.forEach(new Consumer() { + @Override + public void accept(AppInfo appInfo) { + String packages = appInfo.getApp_package(); + long app_version_code = appInfo.getApp_version_code(); + PackageInfo packageInfo = null; + try { + packageInfo = pm.getPackageInfo(packages, 0); + + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + if (packageInfo != null) { + long appVersionCode; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + appVersionCode = packageInfo.getLongVersionCode(); + } else { + appVersionCode = packageInfo.versionCode; + } + if (app_version_code > appVersionCode) { + FileUtils.ariaDownload(mContext, appInfo.getApp_url(), appInfo); + } else { + Log.e("getTestApp", "intallApk: " + packages + " is up to date"); + } + } else { + FileUtils.ariaDownload(mContext, appInfo.getApp_url(), appInfo); + } + } + }); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getTestApp", "onError: "); + } + + @Override + public void onComplete() { + Log.e("getTestApp", "onComplete: "); + } + }); } @Override public void getAdminApp() { NetInterfaceManager.getInstance().getAdminAppObservable() + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) .subscribe(new Observer>>() { @Override public void onSubscribe(@NonNull Disposable d) { @@ -368,6 +381,66 @@ public class MainSPresenter implements MainSContact.Presenter { }); } + @Override + 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; + appInfoList.stream() + .sorted(new Comparator() { + @Override + public int compare(AppInfo o1, AppInfo o2) { + if ("com.jxw.launcher".equals(o1.getApp_package()) && !"com.jxw.launcher".equals(o2.getApp_package())) { + return -1; + } else if (!"com.jxw.launcher".equals(o1.getApp_package()) && "com.jxw.launcher".equals(o2.getApp_package())) { + return 1; + } else { + return o1.getApp_package().compareTo(o2.getApp_package()); // 非目标包名按字母排序 + } + } + }) + .filter(new Predicate() { + @Override + public boolean test(AppInfo appInfo) { + return appInfo.getIs_must_components() == 1; + } + }) + .forEach(new Consumer() { + @Override + public void accept(AppInfo appInfo) { + if (appInfo.getIs_must_components_down() == 1) { + if (!ApkUtils.isAvailable(mContext, appInfo.getApp_package())) { +// FileUtils.ariaDownload(mContext, appInfo.getApp_url(), appInfo); + } + } + } + }); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getAdminAppDownload", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("getAdminAppDownload", "onComplete: "); + } + }); + } + @Override public void getAppInside() { 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 6d6d856..81ac6bc 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 @@ -96,6 +96,7 @@ public class MainService extends BaseRxService implements MainSContact.MainSView mPresenter.updateDeviceInfo(); mPresenter.getAppIcon(); mPresenter.getScreenLock(); + mPresenter.getTestApp(); mPresenter.getAdminApp(); mPresenter.getSystemSettings(); mPresenter.getLockScreenPwd(); diff --git a/app/src/main/java/com/xwad/os/utils/JgyUtils.java b/app/src/main/java/com/xwad/os/utils/JgyUtils.java index 75a46a7..0cd0994 100644 --- a/app/src/main/java/com/xwad/os/utils/JgyUtils.java +++ b/app/src/main/java/com/xwad/os/utils/JgyUtils.java @@ -1283,13 +1283,13 @@ public class JgyUtils { boolean noti = mMMKV.decodeBool(CommonConfig.ALLOW_NOTIFICATION, true); Log.e(TAG, "startServices: noti = " + noti); // if (noti) { -// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // long time = System.currentTimeMillis(); -// mContext.startForegroundService(new Intent(mContext, MainService.class)); + mContext.startForegroundService(new Intent(mContext, MainService.class)); // Log.e(TAG, "setDefault: startServices time = " + (System.currentTimeMillis() - time) + "ms"); -// } else { + } else { mContext.startService(new Intent(mContext, MainService.class)); -// } + } // } } 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 4a02e81..9b68523 100644 --- a/app/src/main/java/com/xwad/os/utils/OpenApkUtils.java +++ b/app/src/main/java/com/xwad/os/utils/OpenApkUtils.java @@ -859,6 +859,48 @@ public class OpenApkUtils { } } + public void showDownloadDialog(Activity context, AppInfo appInfo) { + 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下载后可继续使用!"); + } + TextView textView3 = inflate.findViewById(R.id.download_ok); + textView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + dialog.dismiss(); + } + }); + textView3.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + FileUtils.ariaDownload(mContext, appInfo.getApp_url(), appInfo); + Intent intent = new Intent(mContext, DownloadService.class); +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { +// mContext.startForegroundService(intent); +// } else { + mContext.startService(intent); +// } + dialog.dismiss(); + } + }); + WindowManager.LayoutParams attributes = window.getAttributes(); + attributes.x = 0; + attributes.y = 0; + attributes.gravity = Gravity.CENTER; + dialog.onWindowAttributesChanged(attributes); + dialog.setCanceledOnTouchOutside(true); + dialog.setContentView(inflate); + window.setDimAmount(0.6f); + dialog.show(); + window.setAttributes(attributes); + } + + public void showDownloadDialog(Activity context, String pkg, String appName) { Dialog dialog = new Dialog(context, R.style.ActionSheet); Window window = dialog.getWindow(); diff --git a/app/src/main/res/drawable/ic_download_all.xml b/app/src/main/res/drawable/ic_download_all.xml new file mode 100644 index 0000000..dd2cfc8 --- /dev/null +++ b/app/src/main/res/drawable/ic_download_all.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 47e169c..ffc9a13 100644 --- a/app/src/main/res/layout/activity_download.xml +++ b/app/src/main/res/layout/activity_download.xml @@ -1,6 +1,8 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + tools:context=".activity.download.DownloadActivity"> @@ -43,25 +45,72 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:includeFontPadding="false" + android:maxLines="1" android:paddingBottom="@dimen/x5" + android:singleLine="true" android:tag="binding_1" - android:text="学王365必备组件下载" + android:text="必备组件下载" android:textColor="@color/res_text_color1" android:textSize="@dimen/x50" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + - + app:layout_constraintTop_toBottomOf="@id/title_bar"> + + + + + + diff --git a/app/src/main/res/layout/activity_other_app.xml b/app/src/main/res/layout/activity_other_app.xml new file mode 100644 index 0000000..0da70fb --- /dev/null +++ b/app/src/main/res/layout/activity_other_app.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_app_info.xml b/app/src/main/res/layout/item_app_info.xml index 32b2030..c266ef4 100644 --- a/app/src/main/res/layout/item_app_info.xml +++ b/app/src/main/res/layout/item_app_info.xml @@ -20,10 +20,11 @@ android:layout_width="14dp" android:layout_height="14dp" android:layout_marginTop="32dp" + android:visibility="gone" android:layout_marginStart="32dp" android:adjustViewBounds="true" android:scaleType="centerCrop" - android:src="@drawable/ic_download" + android:src="@drawable/ic_download_all" app:layout_constraintStart_toStartOf="@+id/iv_app_icon" app:layout_constraintTop_toTopOf="@+id/iv_app_icon" />