version:1.2.2

fix:
update:必备组件手动下载,增加其他应用下载,对接灰度测试
This commit is contained in:
2026-03-02 09:41:16 +08:00
parent cea9291e11
commit b87c5b51dd
19 changed files with 642 additions and 89 deletions

View File

@@ -17,8 +17,8 @@ android {
minSdkVersion 23 minSdkVersion 23
targetSdkVersion 29 targetSdkVersion 29
versionCode 22 versionCode 23
versionName "1.2.1" versionName "1.2.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@@ -285,11 +285,14 @@
android:exported="true" android:exported="true"
android:launchMode="standard" android:launchMode="standard"
android:screenOrientation="sensorLandscape" android:screenOrientation="sensorLandscape"
android:theme="@style/ActivityTheme2"> android:theme="@style/ActivityTheme2" />
<intent-filter> <activity
<action android:name="android.intent.action.MAIN" /> android:name=".activity.app.OtherAppActivity"
</intent-filter> android:configChanges="screenSize|orientation|keyboardHidden|locale"
</activity> android:exported="true"
android:launchMode="standard"
android:screenOrientation="sensorLandscape"
android:theme="@style/ActivityTheme2" />
<receiver <receiver
android:name=".receiver.BootReceiver" android:name=".receiver.BootReceiver"

View File

@@ -0,0 +1,136 @@
package com.xwad.os.activity.app;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.text.TextUtils;
import android.util.Log;
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.adapter.AppInfoAdapter;
import com.xwad.os.base.mvvm.BaseMvvmActivity;
import com.xwad.os.bean.AppInfo;
import com.xwad.os.databinding.ActivityOtherAppBinding;
import com.xwad.os.utils.ActivationUtil;
import com.xwad.os.utils.ApkUtils;
import com.xwad.os.utils.FileUtils;
import java.util.List;
import java.util.function.Consumer;
public class OtherAppActivity extends BaseMvvmActivity<OtherAppViewModel, ActivityOtherAppBinding> {
private static final String TAG = "DownloadActivity";
private AppInfoAdapter mAppInfoAdapter;
private List<AppInfo> 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<List<AppInfo>>() {
@Override
public void onChanged(List<AppInfo> 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<AppInfo>() {
@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);
}
}
}
});
}
}
}
}
}

View File

@@ -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<ActivityOtherAppBinding, ActivityEvent> {
@Override
public ActivityOtherAppBinding getVDBinding() {
return binding;
}
@Override
public void onDestroy() {
}
public MutableLiveData<List<AppInfo>> mListMutableLiveData = new MutableLiveData<>();
public void getAdminApp() {
NetInterfaceManager.getInstance().get365AdminAppObservable()
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
.subscribe(new Observer<BaseResponse<List<AppInfo>>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.e("getAdminApp", "onSubscribe: ");
}
@Override
public void onNext(@NonNull BaseResponse<List<AppInfo>> listBaseResponse) {
Log.e("getAdminApp", "onNext: " + listBaseResponse);
if (listBaseResponse.code == 200) {
List<AppInfo> appInfoList = listBaseResponse.data;
List<AppInfo> forceAppInfoList = appInfoList.stream()
.filter(new Predicate<AppInfo>() {
@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: ");
}
});
}
}

View File

@@ -11,7 +11,9 @@ import android.view.View;
import androidx.lifecycle.Observer; import androidx.lifecycle.Observer;
import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.GridLayoutManager;
import com.hjq.toast.Toaster;
import com.xwad.os.R; import com.xwad.os.R;
import com.xwad.os.activity.app.OtherAppActivity;
import com.xwad.os.adapter.AppInfoAdapter; import com.xwad.os.adapter.AppInfoAdapter;
import com.xwad.os.base.mvvm.BaseMvvmActivity; import com.xwad.os.base.mvvm.BaseMvvmActivity;
import com.xwad.os.bean.AppInfo; import com.xwad.os.bean.AppInfo;
@@ -26,8 +28,8 @@ import java.util.function.Consumer;
public class DownloadActivity extends BaseMvvmActivity<DownloadViewModel, ActivityDownloadBinding> { public class DownloadActivity extends BaseMvvmActivity<DownloadViewModel, ActivityDownloadBinding> {
private static final String TAG = "DownloadActivity"; private static final String TAG = "DownloadActivity";
private AppInfoAdapter mAppInfoAdapter; private AppInfoAdapter mAppInfoAdapter;
private List<AppInfo> mAppInfos;
@Override @Override
protected int getLayoutId() { protected int getLayoutId() {
@@ -57,25 +59,14 @@ public class DownloadActivity extends BaseMvvmActivity<DownloadViewModel, Activi
mViewModel.mListMutableLiveData.observe(this, new Observer<List<AppInfo>>() { mViewModel.mListMutableLiveData.observe(this, new Observer<List<AppInfo>>() {
@Override @Override
public void onChanged(List<AppInfo> appInfos) { public void onChanged(List<AppInfo> appInfos) {
mAppInfos = appInfos;
mAppInfoAdapter.setAppInfos(appInfos); mAppInfoAdapter.setAppInfos(appInfos);
if (appInfos == null || appInfos.isEmpty()) { if (appInfos == null || appInfos.isEmpty()) {
mViewDataBinding.rvContent.setVisibility(View.GONE); mViewDataBinding.clContent.setVisibility(View.GONE);
mViewDataBinding.llNodata.setVisibility(View.VISIBLE); mViewDataBinding.llNodata.setVisibility(View.VISIBLE);
} else { } else {
mViewDataBinding.rvContent.setVisibility(View.VISIBLE); mViewDataBinding.clContent.setVisibility(View.VISIBLE);
mViewDataBinding.llNodata.setVisibility(View.GONE); mViewDataBinding.llNodata.setVisibility(View.GONE);
if (ActivationUtil.getInstance().isActivation()) {
appInfos.forEach(new Consumer<AppInfo>() {
@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<DownloadViewModel, Activi
public void exit(View view) { public void exit(View view) {
finish(); finish();
} }
public void openOtherApp(View view) {
startActivity(new Intent(DownloadActivity.this, OtherAppActivity.class));
}
public void downloadApp(View view) {
if (mAppInfos == null || mAppInfos.isEmpty()) {
Toaster.show("没有要下载的应用");
} else {
if (ActivationUtil.getInstance().isActivation()) {
mAppInfos.forEach(new Consumer<AppInfo>() {
@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);
}
}
}
});
}
}
}
} }
} }

View File

@@ -12,6 +12,7 @@ import com.xwad.os.bean.BaseResponse;
import com.xwad.os.databinding.ActivityDownloadBinding; import com.xwad.os.databinding.ActivityDownloadBinding;
import com.xwad.os.network.NetInterfaceManager; import com.xwad.os.network.NetInterfaceManager;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -36,7 +37,7 @@ public class DownloadViewModel extends BaseViewModel<ActivityDownloadBinding, Ac
public MutableLiveData<List<AppInfo>> mListMutableLiveData = new MutableLiveData<>(); public MutableLiveData<List<AppInfo>> mListMutableLiveData = new MutableLiveData<>();
public void getAdminApp() { public void getAdminApp() {
NetInterfaceManager.getInstance().getAdminAppObservable() NetInterfaceManager.getInstance().get365AdminAppObservable()
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
.subscribe(new Observer<BaseResponse<List<AppInfo>>>() { .subscribe(new Observer<BaseResponse<List<AppInfo>>>() {
@Override @Override
@@ -49,12 +50,25 @@ public class DownloadViewModel extends BaseViewModel<ActivityDownloadBinding, Ac
Log.e("getAdminApp", "onNext: " + listBaseResponse); Log.e("getAdminApp", "onNext: " + listBaseResponse);
if (listBaseResponse.code == 200) { if (listBaseResponse.code == 200) {
List<AppInfo> appInfoList = listBaseResponse.data; List<AppInfo> appInfoList = listBaseResponse.data;
List<AppInfo> forceAppInfoList = appInfoList.stream().filter(new Predicate<AppInfo>() { List<AppInfo> forceAppInfoList = appInfoList.stream()
@Override .sorted(new Comparator<AppInfo>() {
public boolean test(AppInfo appInfo) { @Override
return appInfo.getIs_must_components() == 1; public int compare(AppInfo o1, AppInfo o2) {
} if ("com.jxw.launcher".equals(o1.getApp_package()) && !"com.jxw.launcher".equals(o2.getApp_package())) {
}).collect(Collectors.toList()); 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<AppInfo>() {
@Override
public boolean test(AppInfo appInfo) {
return appInfo.getIs_must_components() == 1;
}
}).collect(Collectors.toList());
mListMutableLiveData.setValue(forceAppInfoList); mListMutableLiveData.setValue(forceAppInfoList);
} }
} }

View File

@@ -70,7 +70,7 @@ public class AppInfoAdapter extends RecyclerView.Adapter<AppInfoAdapter.Holder>
ApkUtils.openPackage(mContext, appInfo.getApp_package()); ApkUtils.openPackage(mContext, appInfo.getApp_package());
} else { } else {
if (ActivationUtil.getInstance().isActivation()) { if (ActivationUtil.getInstance().isActivation()) {
OpenApkUtils.getInstance().showDownloadDialog(mContext, appInfo.getApp_package(), appInfo.getApp_name()); OpenApkUtils.getInstance().showDownloadDialog(mContext, appInfo);
} else { } else {
Toaster.show("请先激活设备"); Toaster.show("请先激活设备");
} }

View File

@@ -20,6 +20,7 @@ import com.xwad.os.utils.ActivationUtil;
import com.xwad.os.utils.ApkUtils; import com.xwad.os.utils.ApkUtils;
import com.xwad.os.utils.FileUtils; import com.xwad.os.utils.FileUtils;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Predicate; import java.util.function.Predicate;
@@ -157,6 +158,18 @@ public class AccountViewModel extends BaseViewModel<FragmentAccountBinding, Frag
if (listBaseResponse.code == 200) { if (listBaseResponse.code == 200) {
List<AppInfo> appInfoList = listBaseResponse.data; List<AppInfo> appInfoList = listBaseResponse.data;
appInfoList.stream() appInfoList.stream()
.sorted(new Comparator<AppInfo>() {
@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<AppInfo>() { .filter(new Predicate<AppInfo>() {
@Override @Override
public boolean test(AppInfo appInfo) { public boolean test(AppInfo appInfo) {

View File

@@ -563,6 +563,13 @@ public class NetInterfaceManager {
.observeOn(AndroidSchedulers.mainThread()); .observeOn(AndroidSchedulers.mainThread());
} }
public Observable<BaseResponse<List<AppInfo>>> get365AdminAppObservable() {
return mRetrofit.create(AppApi.class)
.getAdminApp(Utils.getSerial(), "11", BuildConfig.APPLICATION_ID)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public Observable<BaseResponse<List<AppIcon>>> getAppIconObservable() { public Observable<BaseResponse<List<AppIcon>>> getAppIconObservable() {
return mRetrofit.create(GetAppIconApi.class) return mRetrofit.create(GetAppIconApi.class)
.getAppIcon(Utils.getSerial()) .getAppIcon(Utils.getSerial())

View File

@@ -19,6 +19,13 @@ public interface AppApi {
@Query("sn") String sn @Query("sn") String sn
); );
@GET(UrlAddress.GET_ADMIN_APP)
Observable<BaseResponse<List<AppInfo>>> getAdminApp(
@Query("sn") String sn,
@Query("class_id") String class_id,
@Query("desktop_package") String desktop_package
);
@GET(UrlAddress.APP_FORCE_INSTALL) @GET(UrlAddress.APP_FORCE_INSTALL)
Observable<BaseResponse<AppInfo>> getAdminApp( Observable<BaseResponse<AppInfo>> getAdminApp(
@Query("desktop_app_package") String desktop_app_package, @Query("desktop_app_package") String desktop_app_package,

View File

@@ -54,6 +54,8 @@ public class MainSContact {
void getTestApp(); void getTestApp();
/*获取管理员应用*/ /*获取管理员应用*/
void getAdminApp(); void getAdminApp();
void getAdminAppDownload();
/*获取id管控*/ /*获取id管控*/
void getAppInside(); void getAppInside();

View File

@@ -2,6 +2,9 @@ package com.xwad.os.service.main;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.util.Log; import android.util.Log;
import com.google.gson.JsonObject; 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.ServiceAliveUtils;
import com.xwad.os.utils.Utils; import com.xwad.os.utils.Utils;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.function.Consumer; 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<BaseResponse<List<AppInfo>>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.e("getAdminAppDownload", "onSubscribe: ");
}
@Override
public void onNext(@NonNull BaseResponse<List<AppInfo>> listBaseResponse) {
Log.e("getAdminAppDownload", "onNext: " + listBaseResponse);
if (listBaseResponse.code == 200) {
List<AppInfo> appInfoList = listBaseResponse.data;
appInfoList.stream()
.filter(new Predicate<AppInfo>() {
@Override
public boolean test(AppInfo appInfo) {
return appInfo.getIs_must_components() == 1;
}
})
.forEach(new Consumer<AppInfo>() {
@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) { public void getAppInfo(String pkg) {
NetInterfaceManager.getInstance().getAdminAppObservable(pkg) NetInterfaceManager.getInstance().getAdminAppObservable(pkg)
.subscribe(new Observer<BaseResponse<AppInfo>>() { .subscribe(new Observer<BaseResponse<AppInfo>>() {
@@ -331,12 +288,68 @@ public class MainSPresenter implements MainSContact.Presenter {
@Override @Override
public void getTestApp() { public void getTestApp() {
NetInterfaceManager.getInstance().getTestAppObservable()
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
.subscribe(new Observer<BaseResponse<List<AppInfo>>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.e("getTestApp", "onSubscribe: ");
}
@Override
public void onNext(@NonNull BaseResponse<List<AppInfo>> listBaseResponse) {
Log.e("getTestApp", "onNext: " + listBaseResponse);
if (listBaseResponse.code == 200) {
List<AppInfo> appInfos = listBaseResponse.data;
PackageManager pm = mContext.getPackageManager();
appInfos.forEach(new Consumer<AppInfo>() {
@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 @Override
public void getAdminApp() { public void getAdminApp() {
NetInterfaceManager.getInstance().getAdminAppObservable() NetInterfaceManager.getInstance().getAdminAppObservable()
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
.subscribe(new Observer<BaseResponse<List<AppInfo>>>() { .subscribe(new Observer<BaseResponse<List<AppInfo>>>() {
@Override @Override
public void onSubscribe(@NonNull Disposable d) { 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<BaseResponse<List<AppInfo>>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.e("getAdminAppDownload", "onSubscribe: ");
}
@Override
public void onNext(@NonNull BaseResponse<List<AppInfo>> listBaseResponse) {
Log.e("getAdminAppDownload", "onNext: " + listBaseResponse);
if (listBaseResponse.code == 200) {
List<AppInfo> appInfoList = listBaseResponse.data;
appInfoList.stream()
.sorted(new Comparator<AppInfo>() {
@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<AppInfo>() {
@Override
public boolean test(AppInfo appInfo) {
return appInfo.getIs_must_components() == 1;
}
})
.forEach(new Consumer<AppInfo>() {
@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 @Override
public void getAppInside() { public void getAppInside() {

View File

@@ -96,6 +96,7 @@ public class MainService extends BaseRxService implements MainSContact.MainSView
mPresenter.updateDeviceInfo(); mPresenter.updateDeviceInfo();
mPresenter.getAppIcon(); mPresenter.getAppIcon();
mPresenter.getScreenLock(); mPresenter.getScreenLock();
mPresenter.getTestApp();
mPresenter.getAdminApp(); mPresenter.getAdminApp();
mPresenter.getSystemSettings(); mPresenter.getSystemSettings();
mPresenter.getLockScreenPwd(); mPresenter.getLockScreenPwd();

View File

@@ -1283,13 +1283,13 @@ public class JgyUtils {
boolean noti = mMMKV.decodeBool(CommonConfig.ALLOW_NOTIFICATION, true); boolean noti = mMMKV.decodeBool(CommonConfig.ALLOW_NOTIFICATION, true);
Log.e(TAG, "startServices: noti = " + noti); Log.e(TAG, "startServices: noti = " + noti);
// if (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(); // 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"); // Log.e(TAG, "setDefault: startServices time = " + (System.currentTimeMillis() - time) + "ms");
// } else { } else {
mContext.startService(new Intent(mContext, MainService.class)); mContext.startService(new Intent(mContext, MainService.class));
// } }
// } // }
} }

View File

@@ -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) { public void showDownloadDialog(Activity context, String pkg, String appName) {
Dialog dialog = new Dialog(context, R.style.ActionSheet); Dialog dialog = new Dialog(context, R.style.ActionSheet);
Window window = dialog.getWindow(); Window window = dialog.getWindow();

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="50dp"
android:height="50dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M512,22C241.38,22 22,241.38 22,512s219.38,490 490,490 490,-219.38 490,-490S782.62,22 512,22zM710.12,563.35l-173.9,173.91c-0.78,1 -1.61,1.97 -2.53,2.88 -5.99,5.99 -13.84,8.95 -21.69,8.91 -7.84,0.05 -15.7,-2.92 -21.69,-8.91 -0.92,-0.92 -1.76,-1.88 -2.53,-2.88l-173.9,-173.9c-11.88,-11.88 -11.88,-31.14 0,-43.02 11.88,-11.88 31.14,-11.88 43.03,0L481.58,645L481.58,305.37c0,-16.8 13.62,-30.42 30.42,-30.42 16.8,0 30.42,13.62 30.42,30.42L542.42,645L667.1,520.33c11.88,-11.88 31.14,-11.88 43.03,0 11.88,11.88 11.88,31.14 -0.01,43.02z"
android:fillColor="#2c2c2c" />
</vector>

View File

@@ -1,6 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android" <layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".activity.download.DownloadActivity">
<data> <data>
@@ -43,25 +45,72 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:includeFontPadding="false" android:includeFontPadding="false"
android:maxLines="1"
android:paddingBottom="@dimen/x5" android:paddingBottom="@dimen/x5"
android:singleLine="true"
android:tag="binding_1" android:tag="binding_1"
android:text="学王365必备组件下载" android:text="必备组件下载"
android:textColor="@color/res_text_color1" android:textColor="@color/res_text_color1"
android:textSize="@dimen/x50" android:textSize="@dimen/x50"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/img_download"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginEnd="@dimen/y60"
android:duplicateParentState="true"
android:maxLines="1"
android:onClick="@{click::openOtherApp}"
android:singleLine="true"
android:text="其他应用下载"
android:textColor="@color/res_text_color1"
android:textSize="@dimen/x40"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/rv_content" android:id="@+id/cl_content"
style="@style/recycler_view_style"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/title_bar" /> app:layout_constraintTop_toBottomOf="@id/title_bar">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_content"
style="@style/recycler_view_style"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginBottom="8dp"
android:orientation="vertical"
app:layout_constraintBottom_toTopOf="@+id/download_ok"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/download_ok"
android:layout_width="wrap_content"
android:layout_height="28dp"
android:layout_marginBottom="32dp"
android:background="@drawable/download_ok_bg"
android:gravity="center"
android:onClick="@{click::downloadApp}"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:text="点击一键下载必备组件"
android:textColor="#ffffff"
android:textSize="12sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout <LinearLayout
android:id="@+id/ll_nodata" android:id="@+id/ll_nodata"
@@ -69,6 +118,7 @@
android:layout_height="0dp" android:layout_height="0dp"
android:gravity="center" android:gravity="center"
android:orientation="vertical" android:orientation="vertical"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/title_bar"> app:layout_constraintTop_toBottomOf="@id/title_bar">

View File

@@ -0,0 +1,107 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".activity.app.OtherAppActivity">
<data>
<variable
name="click"
type="com.xwad.os.activity.app.OtherAppActivity.BtnClick" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#d4dfff"
android:tag="layout/activity_home_0">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/title_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/x160"
android:background="@drawable/icon_btk"
android:tag="layout/book_layout_title_bar_0"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/img_back"
android:layout_width="@dimen/y100"
android:layout_height="@dimen/x100"
android:layout_gravity="center"
android:layout_marginLeft="@dimen/y60"
android:duplicateParentState="true"
android:onClick="@{click::exit}"
android:src="@drawable/icon_back1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_title"
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="其他应用下载"
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" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_content"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/title_bar">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_content"
style="@style/recycler_view_style"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginBottom="32dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:id="@+id/ll_nodata"
android:layout_width="match_parent"
android:layout_height="0dp"
android:gravity="center"
android:orientation="vertical"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/title_bar">
<ImageView
android:layout_width="@dimen/y589"
android:layout_height="@dimen/x524"
android:src="@drawable/icon_qst" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/x43"
android:text="@string/no_content_available_the_moment"
android:textColor="@color/res_text_color1"
android:textSize="@dimen/x36" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View File

@@ -20,10 +20,11 @@
android:layout_width="14dp" android:layout_width="14dp"
android:layout_height="14dp" android:layout_height="14dp"
android:layout_marginTop="32dp" android:layout_marginTop="32dp"
android:visibility="gone"
android:layout_marginStart="32dp" android:layout_marginStart="32dp"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:src="@drawable/ic_download" android:src="@drawable/ic_download_all"
app:layout_constraintStart_toStartOf="@+id/iv_app_icon" app:layout_constraintStart_toStartOf="@+id/iv_app_icon"
app:layout_constraintTop_toTopOf="@+id/iv_app_icon" /> app:layout_constraintTop_toTopOf="@+id/iv_app_icon" />