+
+
+
+
+
+
+
+
+ 本软件在使用过程中,为了更好的提供客户服务,基于技术必要性将会使用到如下的权限和功能:
+
+
设备管理功能:
+
1. 启用/禁用WLAN;
+
2. 启用/禁用WLAN热点;
+
3. 启用/禁用USB调试模式、数据传输;
+
4. 启用/禁用存储访问(MicroSD卡);
+
5. 启用/禁用NFC;
+
6. 启用/禁用数据连接;
+
7. 启用/禁用状态栏下拉菜单;
+
8. 启用/禁用通话;
+
9. 启用/禁用短信;
+
10. 重启、关机;
+
11. 获取root状态;
+
12. 挂断当前通话;
+
13. 静默安装/卸载某应用;
+
14. 删除某应用数据;
+
15. 停止某应用进程;
+
16. 开启/关闭仅以指定某应用商店安装应用功能,开启时屏蔽其他应用商店安装,同时屏蔽其他安装方式,如屏蔽adb和SD卡安装方式;
+
17. 保持某应用始终运行;
+
18. 阻止某应用启动运行;
+
19. 仅允许某应用被安装,屏蔽其他应用安装;
+
20. 阻止某应用被卸载;
+
21. 配置荣耀邮箱的Exchange参数;
+
+
diff --git a/app/src/main/assets/honor_software_license.html b/app/src/main/assets/honor_software_license.html
new file mode 100644
index 0000000..723ec86
--- /dev/null
+++ b/app/src/main/assets/honor_software_license.html
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+您可以根据软件的具体业务场景声明您的免责协议,本协议与荣耀公司无关。
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/xwad/os/activity/ExitActivity.java b/app/src/main/java/com/xwad/os/activity/ExitActivity.java
index e021054..a18dc9d 100644
--- a/app/src/main/java/com/xwad/os/activity/ExitActivity.java
+++ b/app/src/main/java/com/xwad/os/activity/ExitActivity.java
@@ -9,6 +9,7 @@ import android.media.AudioAttributes;
import android.media.SoundPool;
import android.os.Build;
import android.os.Handler;
+import android.os.Looper;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
@@ -18,6 +19,7 @@ import android.view.inputmethod.InputMethodManager;
import androidx.databinding.DataBindingUtil;
+import com.tencent.mmkv.MMKV;
import com.tuo.customview.VerificationCodeView;
import com.xwad.os.BuildConfig;
import com.xwad.os.R;
@@ -34,6 +36,8 @@ import java.util.stream.Collectors;
public class ExitActivity extends BaseDataBindingActivity {
private static final String TAG = "ExitActivity";
+ private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
+
private ActivityExitBinding mBinding;
private SoundPool soundPool;
@@ -117,7 +121,7 @@ public class ExitActivity extends BaseDataBindingActivity {
return;
}
Log.e(TAG, "inputComplete: " + content);
- String password = Settings.Global.getString(getContentResolver(), CommonConfig.LOCK_SCREEN_PASSWORD);
+ String password = mMMKV.decodeString(CommonConfig.LOCK_SCREEN_PASSWORD, CommonConfig.DEFAULT_PASSWORD);
if ((!TextUtils.isEmpty(content) && !TextUtils.isEmpty(password))) {
if (password.equals(content)) {
// Utils.exitDesktop(this);
@@ -188,7 +192,7 @@ public class ExitActivity extends BaseDataBindingActivity {
}
private void setEmpty() {
- Handler.getMain().postDelayed(new Runnable() {
+ new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
mBinding.icv.clearInputContent();
diff --git a/app/src/main/java/com/xwad/os/activity/NoticeActivity.java b/app/src/main/java/com/xwad/os/activity/NoticeActivity.java
index 4e9d964..a9bab22 100644
--- a/app/src/main/java/com/xwad/os/activity/NoticeActivity.java
+++ b/app/src/main/java/com/xwad/os/activity/NoticeActivity.java
@@ -12,7 +12,6 @@ import android.view.View;
import androidx.databinding.DataBindingUtil;
-import com.blankj.utilcode.util.FileUtils;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
@@ -23,7 +22,7 @@ import com.xwad.os.bean.AlarmClockData;
import com.xwad.os.bean.BaseResponse;
import com.xwad.os.databinding.ActivityNoticeBinding;
import com.xwad.os.network.NetInterfaceManager;
-import com.xwad.os.utils.FileUtil;
+import com.xwad.os.utils.FileUtils;
import com.xwad.os.utils.ScreenUtils;
import com.xwad.os.utils.Utils;
import com.xwad.os.utils.WakeUpUtils;
@@ -139,7 +138,7 @@ public class NoticeActivity extends BaseDataBindingActivity {
mBinding.clVoice.setVisibility(View.VISIBLE);
String fileName = Utils.getFileNamefromURL(voiceUrl);
File file = new File(Utils.getDownLoadPath(NoticeActivity.this) + fileName);
- String fileMD5 = FileUtils.getFileMD5ToString(file);
+ String fileMD5 = com.blankj.utilcode.util.FileUtils.getFileMD5ToString(file);
// if (!md5.equals(fileMD5)) {
// // TODO: 2021/12/16
// } else {
@@ -165,14 +164,14 @@ public class NoticeActivity extends BaseDataBindingActivity {
}
if (!TextUtils.isEmpty(filePath)) {
mBinding.clVp.setVisibility(View.VISIBLE);
- String fileType = FileUtil.getFileType(filePath);
+ String fileType = FileUtils.getFileType(filePath);
Log.e(TAG, "showData: " + fileType);
- if (FileUtil.isPictureFile(fileType)) {
+ if (FileUtils.isPictureFile(fileType)) {
mBinding.jzVideo.setVisibility(View.GONE);
mBinding.ivDictation.setVisibility(View.VISIBLE);
RequestOptions options = new RequestOptions().transform(new RoundedCorners(ScreenUtils.dip2px(this, 16F)));
Glide.with(NoticeActivity.this).load(filePath).apply(options).into(mBinding.ivDictation);
- } else if (FileUtil.isVideoFile(fileType)) {
+ } else if (FileUtils.isVideoFile(fileType)) {
mBinding.jzVideo.setVisibility(View.VISIBLE);
mBinding.ivDictation.setVisibility(View.GONE);
String fileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length());
diff --git a/app/src/main/java/com/xwad/os/activity/PasswordActivity.java b/app/src/main/java/com/xwad/os/activity/PasswordActivity.java
index 34d04c5..11d7749 100644
--- a/app/src/main/java/com/xwad/os/activity/PasswordActivity.java
+++ b/app/src/main/java/com/xwad/os/activity/PasswordActivity.java
@@ -4,7 +4,7 @@ import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Handler;
-import android.provider.Settings;
+import android.os.Looper;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
@@ -13,6 +13,7 @@ import android.view.inputmethod.InputMethodManager;
import androidx.databinding.DataBindingUtil;
+import com.tencent.mmkv.MMKV;
import com.tuo.customview.VerificationCodeView;
import com.xwad.os.R;
import com.xwad.os.activity.addicon.AddIconActivity;
@@ -24,6 +25,8 @@ import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX;
public class PasswordActivity extends BaseDataBindingActivity {
private static final String TAG = "PasswordActivity";
+ private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
+
private ActivityPasswdBinding mBinding;
// @Override
@@ -133,7 +136,7 @@ public class PasswordActivity extends BaseDataBindingActivity {
return;
}
Log.e(TAG, "inputComplete: " + content);
- String password = Settings.Global.getString(getContentResolver(), CommonConfig.LOCK_SCREEN_PASSWORD);
+ String password = mMMKV.decodeString(CommonConfig.LOCK_SCREEN_PASSWORD, CommonConfig.DEFAULT_PASSWORD);
if ((!TextUtils.isEmpty(content) && !TextUtils.isEmpty(password))) {
if (password.equals(content)) {
startActivity(new Intent(PasswordActivity.this, AddIconActivity.class));
@@ -155,7 +158,7 @@ public class PasswordActivity extends BaseDataBindingActivity {
}
private void setEmpty() {
- Handler.getMain().postDelayed(new Runnable() {
+ new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
mBinding.icv.clearInputContent();
diff --git a/app/src/main/java/com/xwad/os/activity/debug/DebugActivity.java b/app/src/main/java/com/xwad/os/activity/debug/DebugActivity.java
new file mode 100644
index 0000000..f09c3be
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/activity/debug/DebugActivity.java
@@ -0,0 +1,156 @@
+package com.xwad.os.activity.debug;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.util.Log;
+import android.view.View;
+import android.widget.CompoundButton;
+
+import com.xwad.os.R;
+import com.xwad.os.base.mvvm.BaseMvvmActivity;
+import com.xwad.os.databinding.ActivityDebugBinding;
+import com.xwad.os.receiver.AoleDeviceAdminReceiver;
+import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX;
+
+public class DebugActivity extends BaseMvvmActivity {
+ private static final String TAG = "DebugActivity";
+
+ private DevicePolicyManager mDevicePolicyManager;
+
+ private ComponentName mAdminName;
+
+ @Override
+ public boolean setNightMode() {
+ return true;
+ }
+
+// @Override
+// public boolean setfitWindow() {
+// return true;
+// }
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.activity_debug;
+ }
+
+ @Override
+ protected void initDataBinding() {
+ mViewModel.setCtx(this);
+ mViewModel.setLifecycle(getLifecycleSubject());
+ mViewModel.setVDBinding(mViewDataBinding);
+ mViewDataBinding.setClick(new BtnClick());
+ }
+
+ @Override
+ protected void initView() {
+ UltimateBarX.addStatusBarTopPadding(mViewDataBinding.bannerLayout);
+ addNavigationBarBottomPadding(mViewDataBinding.clBottom);
+
+ mDevicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
+ mAdminName = new ComponentName(this, AoleDeviceAdminReceiver.class);
+
+ mViewDataBinding.swWindow.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+
+ }
+ });
+ mViewDataBinding.swYoyo.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+
+ }
+ });
+ mViewDataBinding.swRestore.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+
+ }
+ });
+ mViewDataBinding.swUsbDebug.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+
+ }
+ });
+ mViewDataBinding.swRemoveAdmin.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+
+ }
+ });
+ mViewDataBinding.swExpandPanel.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+
+ }
+ });
+ mViewDataBinding.swQuickTools.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+
+ }
+ });
+ mViewDataBinding.swPowerOff.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+
+ }
+ });
+ mViewDataBinding.swMultiWindow.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+
+ }
+ });
+ }
+
+ @Override
+ protected void initData() {
+
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ getAdminStatus();
+ }
+
+ private void getAdminStatus() {
+ if (isActiveMe()) {
+ mViewDataBinding.tvAdmin.setText("已激活");
+ } else {
+ mViewDataBinding.tvAdmin.setText("未激活");
+ }
+ }
+
+ /**
+ * 判断是否激活
+ *
+ * @return
+ */
+ private boolean isActiveMe() {
+ boolean active;
+ if (mDevicePolicyManager == null) {
+ active = false;
+ } else {
+ active = mDevicePolicyManager.isAdminActive(mAdminName);
+ }
+ Log.e(TAG, "isActiveMe: active = " + active);
+ return active;
+ }
+
+ public class BtnClick {
+ public void exit(View view) {
+ finish();
+ }
+
+ public void refresh(View view) {
+ getAdminStatus();
+ }
+ }
+
+
+}
diff --git a/app/src/main/java/com/xwad/os/activity/debug/DebugViewModel.java b/app/src/main/java/com/xwad/os/activity/debug/DebugViewModel.java
new file mode 100644
index 0000000..e751014
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/activity/debug/DebugViewModel.java
@@ -0,0 +1,18 @@
+package com.xwad.os.activity.debug;
+
+import com.trello.rxlifecycle4.android.ActivityEvent;
+import com.xwad.os.base.mvvm.BaseViewModel;
+import com.xwad.os.databinding.ActivityDebugBinding;
+
+public class DebugViewModel extends BaseViewModel {
+
+ @Override
+ public ActivityDebugBinding getVDBinding() {
+ return binding;
+ }
+
+ @Override
+ public void onDestroy() {
+
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/activity/home/HomeActivity.java b/app/src/main/java/com/xwad/os/activity/home/HomeActivity.java
index 7c136ee..87eb5dc 100644
--- a/app/src/main/java/com/xwad/os/activity/home/HomeActivity.java
+++ b/app/src/main/java/com/xwad/os/activity/home/HomeActivity.java
@@ -39,9 +39,11 @@ import com.xwad.os.activity.login.LoginActivity;
import com.xwad.os.activity.permission.PermissionActivity;
import com.xwad.os.activity.update.UpdateActivity;
import com.xwad.os.base.mvvm.BaseMvvmActivity;
-import com.xwad.os.bean.AppUpdateInfo;
+import com.xwad.os.bean.AppInfo;
+import com.xwad.os.bean.PhraseContent;
import com.xwad.os.bean.UserInfo;
import com.xwad.os.bean.jxw.TabBean;
+import com.xwad.os.bean.uiuios.AppUpdateInfo;
import com.xwad.os.config.CommonConfig;
import com.xwad.os.databinding.ActivityHomeBinding;
import com.xwad.os.dialog.PermissionsDialog;
@@ -62,8 +64,10 @@ import com.xwad.os.jxw.event.UpdateColorEvent;
import com.xwad.os.jxw.event.UpdateGradeEvent;
import com.xwad.os.jxw.fragment.SztzFragment;
import com.xwad.os.jxw.util.Util;
+import com.xwad.os.manager.AmapManager;
import com.xwad.os.manager.DeviceSNManager;
import com.xwad.os.manager.RemoteManager;
+import com.xwad.os.permission.PermissionUtils;
import com.xwad.os.service.main.MainService;
import com.xwad.os.utils.ActivationUtil;
import com.xwad.os.utils.ApkUtils;
@@ -125,9 +129,11 @@ public class HomeActivity extends BaseMvvmActivity() {
+ @Override
+ public void onChanged(AppUpdateInfo appUpdateInfo) {
+ if (appUpdateInfo == null) {
+// Toaster.show("已是最新版本");
+ } else {
+ if (ApkUtils.isUpdate(HomeActivity.this, appUpdateInfo)) {
+ ApkUtils.checkAppUpdate(HomeActivity.this, appUpdateInfo);
+// Toaster.show("有新的版本需要更新");
+ } else {
+// Toaster.show("已是最新版本");
+ }
+ }
+ }
+ });
+// mViewModel.checkUpdateUiUiOS(BuildConfig.APPLICATION_ID);
+ mViewModel.checkUpdateUiUiOS("com.xwad.store");
+
+
mViewModel.mGetCodeData.observe(this, new Observer() {
@Override
public void onChanged(Boolean aBoolean) {
@@ -248,13 +273,73 @@ public class HomeActivity extends BaseMvvmActivity() {
+ @Override
+ public void onChanged(PhraseContent phraseContent) {
+ String text = phraseContent.getContent();
+ mViewDataBinding.tvNotification.setText(text);
+ mViewDataBinding.tvNotification.requestFocus();
+ }
+ });
+ mViewModel.getPhrase();
+ mViewModel.getSystemSettings();
+// mViewModel.getOauthToken();
+// mViewModel.getAnswerControlStatus();
+ mViewModel.getPublicIp();
initDatas();
}
+ private void getPermission() {
+ Log.e(TAG, "getPermission: ");
+ if (XXPermissions.isGranted(HomeActivity.this, PermissionUtils.PERMISSIONS)) {
+ Log.e(TAG, "getPermission: " + "isGranted");
+ } else {
+ XXPermissions.with(this)
+ // 申请单个权限
+ .permission(PermissionUtils.PERMISSIONS)
+ // 申请多个权限
+// .permission(group)
+ // 设置权限请求拦截器(局部设置)
+ //.interceptor(new PermissionInterceptor())
+ // 设置不触发错误检测机制(局部设置)
+ //.unchecked()
+ .request(new OnPermissionCallback() {
+ @Override
+ public void onGranted(List permissions, boolean all) {
+ if (!all) {
+ Toaster.show("请授予所有权限确保正常使用");
+ } else {
+ Log.e(TAG, "onGranted: " + "获取权限成功");
+ }
+ }
+
+ @Override
+ public void onDenied(List permissions, boolean never) {
+ if (never) {
+ Toaster.show("被永久拒绝授权,请手动授予权限");
+ // 如果是被永久拒绝就跳转到应用权限系统设置页面
+ XXPermissions.startPermissionActivity(HomeActivity.this, permissions);
+ } else {
+ Toaster.show("获取权限失败");
+ }
+ }
+ });
+ }
+ }
+
+
+
+
+ public void exit() {
+ finish();
+ //调用系统API结束进程
+ android.os.Process.killProcess(android.os.Process.myPid());
+
+ //结束整个虚拟机进程,注意如果在manifest里用android:process给app指定了不止一个进程,则只会结束当前进程
+ System.exit(0);
+ }
+
@Subscribe(threadMode = ThreadMode.MAIN)
public void onGkNoticeEvent(UpdateGradeEvent updateGradeEvent) {
Log.e(TAG, "onGkNoticeEvent: ");
@@ -359,11 +444,12 @@ public class HomeActivity extends BaseMvvmActivity>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
@@ -130,22 +132,22 @@ public class HomeViewModel extends BaseViewModel mAppUpdateInfoData = new MutableLiveData<>();
+ public MutableLiveData mAppUpdateInfoData = new MutableLiveData<>();
public void checkUpdate() {
- NetInterfaceManager.getInstance().getCheckUpdateObservable(BuildConfig.APPLICATION_ID)
+ NetInterfaceManager.getInstance().getUpdateObservable(BuildConfig.APPLICATION_ID)
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
- .subscribe(new Observer>() {
+ .subscribe(new Observer>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.e("checkUpdate", "onSubscribe: ");
}
@Override
- public void onNext(@NonNull BaseResponse appUpdateInfoBaseResponse) {
+ public void onNext(@NonNull BaseResponse appUpdateInfoBaseResponse) {
Log.e("checkUpdate", "onNext: " + appUpdateInfoBaseResponse);
if (appUpdateInfoBaseResponse.code == 200) {
- AppUpdateInfo appUpdateInfo = appUpdateInfoBaseResponse.data;
+ AppInfo appUpdateInfo = appUpdateInfoBaseResponse.data;
mAppUpdateInfoData.setValue(appUpdateInfo);
} else {
mAppUpdateInfoData.setValue(null);
@@ -165,6 +167,41 @@ public class HomeViewModel extends BaseViewModel 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("checkUpdateUiUiOS", "onSubscribe: ");
+ }
+
+ @Override
+ public void onNext(@NonNull BaseResponse appUpdateInfoBaseResponse) {
+ Log.e("checkUpdateUiUiOS", "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("checkUpdateUiUiOS", "onError: ");
+ Toaster.show("网络连接失败");
+ }
+
+ @Override
+ public void onComplete() {
+ Log.e("checkUpdateUiUiOS", "onComplete: ");
+ }
+ });
+ }
+
@Deprecated
public void sendAPPUsage() {
boolean activation = ActivationUtil.getInstance().isLogin();
@@ -313,6 +350,7 @@ public class HomeViewModel extends BaseViewModel() {
@Override
public void onSubscribe(@NonNull Disposable d) {
@@ -361,4 +399,50 @@ public class HomeViewModel extends BaseViewModel mPhraseData = new MutableLiveData<>();
+
+ public void getPhrase() {
+ boolean activation = ActivationUtil.getInstance().isActivation();
+ if (!activation) {
+ return;
+ }
+ NetInterfaceManager.getInstance().getPhraseObservable()
+ .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
+ .subscribe(new Observer>() {
+ @Override
+ public void onSubscribe(@NonNull Disposable d) {
+ Log.e("getPhrase", "onSubscribe: ");
+ }
+
+ @Override
+ public void onNext(@NonNull BaseResponse phraseContentBaseResponse) {
+ Log.e("getPhrase", "onNext: " + phraseContentBaseResponse);
+ if (phraseContentBaseResponse.code == 200) {
+ PhraseContent phraseContent = phraseContentBaseResponse.data;
+ mPhraseData.setValue(phraseContent);
+ }
+ }
+
+ @Override
+ public void onError(@NonNull Throwable e) {
+ Log.e("getPhrase", "onError: ");
+ }
+
+ @Override
+ public void onComplete() {
+ Log.e("getPhrase", "onComplete: ");
+ }
+ });
+ }
+
}
diff --git a/app/src/main/java/com/xwad/os/activity/login/LoginActivity.java b/app/src/main/java/com/xwad/os/activity/login/LoginActivity.java
index e65ee18..a700c33 100644
--- a/app/src/main/java/com/xwad/os/activity/login/LoginActivity.java
+++ b/app/src/main/java/com/xwad/os/activity/login/LoginActivity.java
@@ -17,6 +17,7 @@ import com.xwad.os.base.mvvm.BaseMvvmActivity;
import com.xwad.os.bean.LoginInfo;
import com.xwad.os.databinding.ActivityLoginBinding;
import com.xwad.os.service.SocketService;
+import com.xwad.os.service.main.MainService;
import java.util.concurrent.TimeUnit;
@@ -56,6 +57,7 @@ public class LoginActivity extends BaseMvvmActivity {
@@ -30,13 +33,18 @@ public class LoginSuccessfulActivity extends BaseMvvmActivity() {
+ @Override
+ public void onChanged(Boolean aBoolean) {
+ Utils.triggerRebirth(LoginSuccessfulActivity.this);
+ }
+ });
}
@Override
protected void onDestroy() {
super.onDestroy();
- startHome();
+// startHome();
}
private void startHome() {
@@ -49,7 +57,7 @@ public class LoginSuccessfulActivity extends BaseMvvmActivity {
@Override
public void onDestroy() {
}
+
+ public MutableLiveData mBooleanMutableLiveData = new MutableLiveData<>();
+
+ public void getAppInfo() {
+ Observable.zip(NetInterfaceManager.getInstance().getAdminAppObservable(JxwPackageConfig.JXW_LAUNCHER_PACKAGE_NAME),
+ NetInterfaceManager.getInstance().getAdminAppObservable("com.jxw.download"),
+ NetInterfaceManager.getInstance().getAdminAppObservable("com.study.flashplayer"),
+ new Function3, BaseResponse, BaseResponse, List>() {
+ @Override
+ public List apply(BaseResponse baseResponse, BaseResponse baseResponse2, BaseResponse baseResponse3) throws Throwable {
+ List appInfos = new ArrayList<>();
+ if (baseResponse.code == 200) {
+ if (!ApkUtils.isAvailable(getCtx(), JxwPackageConfig.JXW_LAUNCHER_PACKAGE_NAME)) {
+ appInfos.add(baseResponse.data);
+ }
+ }
+ if (baseResponse2.code == 200) {
+ if (!ApkUtils.isAvailable(getCtx(), "com.jxw.download")) {
+ appInfos.add(baseResponse2.data);
+ }
+ }
+ if (baseResponse3.code == 200) {
+ if (!ApkUtils.isAvailable(getCtx(), "com.study.flashplayer")) {
+ appInfos.add(baseResponse3.data);
+ }
+ }
+ return appInfos;
+ }
+ })
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(new Observer>() {
+ @Override
+ public void onSubscribe(@NonNull Disposable d) {
+ Log.e("getAppInfo", "onSubscribe: ");
+ }
+
+ @Override
+ public void onNext(@NonNull List appInfos) {
+ Log.e("getAppInfo", "onNext: " + appInfos);
+ appInfos.forEach(new Consumer() {
+ @Override
+ public void accept(AppInfo appInfo) {
+ FileUtils.ariaDownload(getCtx(), appInfo.getApp_url(), appInfo);
+ }
+ });
+ }
+
+ @Override
+ public void onError(@NonNull Throwable e) {
+ Log.e("getAppInfo", "onError: " + e.getMessage());
+ onComplete();
+ }
+
+ @Override
+ public void onComplete() {
+ Log.e("getAppInfo", "onComplete: ");
+ mBooleanMutableLiveData.setValue(true);
+ }
+ });
+
+ }
+
}
diff --git a/app/src/main/java/com/xwad/os/activity/main/MainActivity.java b/app/src/main/java/com/xwad/os/activity/main/MainActivity.java
index ded6427..8a440b3 100644
--- a/app/src/main/java/com/xwad/os/activity/main/MainActivity.java
+++ b/app/src/main/java/com/xwad/os/activity/main/MainActivity.java
@@ -205,6 +205,8 @@ public class MainActivity extends BaseMvvmActivity mAppUpdateInfoData = new MutableLiveData<>();
+ public MutableLiveData mAppUpdateInfoData = new MutableLiveData<>();
public void checkUpdate() {
- NetInterfaceManager.getInstance().getCheckUpdateObservable(BuildConfig.APPLICATION_ID)
+ NetInterfaceManager.getInstance().getUpdateObservable(BuildConfig.APPLICATION_ID)
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
- .subscribe(new Observer>() {
+ .subscribe(new Observer>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.e("checkUpdate", "onSubscribe: ");
}
@Override
- public void onNext(@NonNull BaseResponse appUpdateInfoBaseResponse) {
+ public void onNext(@NonNull BaseResponse appUpdateInfoBaseResponse) {
Log.e("checkUpdate", "onNext: " + appUpdateInfoBaseResponse);
if (appUpdateInfoBaseResponse.code == 200) {
- AppUpdateInfo appUpdateInfo = appUpdateInfoBaseResponse.data;
+ AppInfo appUpdateInfo = appUpdateInfoBaseResponse.data;
mAppUpdateInfoData.setValue(appUpdateInfo);
} else {
mAppUpdateInfoData.setValue(null);
diff --git a/app/src/main/java/com/xwad/os/activity/privacy/PrivacyActivity.java b/app/src/main/java/com/xwad/os/activity/privacy/PrivacyActivity.java
index 4b49285..cf98d29 100644
--- a/app/src/main/java/com/xwad/os/activity/privacy/PrivacyActivity.java
+++ b/app/src/main/java/com/xwad/os/activity/privacy/PrivacyActivity.java
@@ -69,11 +69,11 @@ public class PrivacyActivity extends BaseMvvmActivity {
- private AppUpdateInfo mAppInfoData;
+ private AppInfo mAppInfoData;
@Override
@@ -42,14 +41,14 @@ public class UpdateActivity extends BaseMvvmActivity= Build.VERSION_CODES.O) {
- startForegroundService(intent);
- } else {
+// 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()) {
- ApkUtils.installApkFile(UpdateActivity.this, entity.getFilePath());
+ ApkUtils.installApp(UpdateActivity.this, entity.getFilePath());
} else {
if (entity.getState() == STATE_RUNNING) {
Toaster.show("文件正在下载中");
diff --git a/app/src/main/java/com/xwad/os/activity/user/UserActivity.java b/app/src/main/java/com/xwad/os/activity/user/UserActivity.java
index 502bb71..35f5d85 100644
--- a/app/src/main/java/com/xwad/os/activity/user/UserActivity.java
+++ b/app/src/main/java/com/xwad/os/activity/user/UserActivity.java
@@ -2,9 +2,13 @@ package com.xwad.os.activity.user;
import android.content.Intent;
import android.net.Uri;
+import android.os.SystemClock;
import android.text.TextUtils;
import android.util.Log;
+import android.view.Gravity;
import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
import android.widget.CompoundButton;
import androidx.fragment.app.Fragment;
@@ -20,35 +24,37 @@ import com.luck.picture.lib.interfaces.OnResultCallbackListener;
import com.tencent.mmkv.MMKV;
import com.xwad.os.BuildConfig;
import com.xwad.os.R;
-import com.xwad.os.activity.ExitActivity;
+import com.xwad.os.activity.debug.DebugActivity;
import com.xwad.os.activity.edit.EditActivity;
import com.xwad.os.activity.permission.PermissionActivity;
import com.xwad.os.activity.service.ServiceActivity;
import com.xwad.os.activity.update.UpdateActivity;
+import com.xwad.os.base.BaseAlertDialogBuilder;
import com.xwad.os.base.mvvm.BaseMvvmActivity;
-import com.xwad.os.bean.AppUpdateInfo;
+import com.xwad.os.bean.AppInfo;
import com.xwad.os.bean.UserAvatarInfo;
import com.xwad.os.config.CommonConfig;
import com.xwad.os.custom.GlideEngine;
import com.xwad.os.databinding.ActivityUserBinding;
+import com.xwad.os.dialog.UserDebugDialog;
import com.xwad.os.fragment.usercenter.account.AccountFragment;
import com.xwad.os.fragment.usercenter.device.DeviceFragment;
import com.xwad.os.fragment.usercenter.info.InfoFragment;
import com.xwad.os.fragment.usercenter.parents.ParentsFragment;
import com.xwad.os.manager.DeviceSNManager;
-import com.xwad.os.manager.RemoteManager;
import com.xwad.os.network.NetInterfaceManager;
import com.xwad.os.utils.ActivationUtil;
import com.xwad.os.utils.ApkUtils;
-import com.xwad.os.utils.FileUtil;
+import com.xwad.os.utils.FileUtils;
import com.xwad.os.utils.GlideLoadUtils;
-import com.xwad.os.utils.Utils;
+import com.xwad.os.utils.ScreenUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
+import me.jessyan.autosize.AutoSizeCompat;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
@@ -155,9 +161,9 @@ public class UserActivity extends BaseMvvmActivity() {
+ mViewModel.mAppUpdateInfoData.observe(this, new Observer() {
@Override
- public void onChanged(AppUpdateInfo appUpdateInfo) {
+ public void onChanged(AppInfo appUpdateInfo) {
if (appUpdateInfo == null) {
// Toaster.show("已是最新版本");
} else {
@@ -181,11 +187,7 @@ public class UserActivity extends BaseMvvmActivity= SystemClock.uptimeMillis() - DEBUGDURATION) {
+ mDEBUGHits = new long[DEBUGCOUNTS]; //重新初始化数组
+// if (mMMKV.decodeBool(CommonConfig.EnableDebug, false)) {
+// Toaster.show("已关闭Debug模式");
+// mMMKV.encode(CommonConfig.EnableDebug, false);
+// } else {
+ showDebugDialog();
+// }
+ }
+ }
+
+ private UserDebugDialog mUserDebugDialog;
+
+ private void showDebugDialog() {
+ if (mUserDebugDialog != null) {
+ mUserDebugDialog.dismiss();
+ mUserDebugDialog = null;
+ }
+ mUserDebugDialog = new UserDebugDialog(this);
+ mUserDebugDialog.setOnClickBottomListener(new UserDebugDialog.OnClickBottomListener() {
+ @Override
+ public void onPositiveClick() {
+ String pwd = mMMKV.decodeString(CommonConfig.SCREEN_LOCK_PWD, CommonConfig.SUPER_PASSWORD);
+ if (CommonConfig.SUPER_PASSWORD.equals(mUserDebugDialog.getEdittext()) || pwd.equals(mUserDebugDialog.getEdittext())) {
+// mMMKV.encode(CommonConfig.EnableDebug, true);
+ Toaster.show("进入用户Debug模式");
+ startActivity(new Intent(UserActivity.this, DebugActivity.class));
+// AdminManager.getInstance().setRestoreFactoryDisabled(1);
+// AdminManager.getInstance().removeActiveDeviceAdmin();
+ } else {
+ Toaster.show("密码错误");
+ }
+ mUserDebugDialog.dismiss();
+ }
+
+ @Override
+ public void onNegtiveClick() {
+ mUserDebugDialog.dismiss();
+ }
+ });
+ if (ScreenUtils.isTablet(UserActivity.this)) {
+ AutoSizeCompat.autoConvertDensityBaseOnWidth(getResources(), BaseAlertDialogBuilder.ALERT_BASE_WIDTH_TABLE);
+ } else {
+ AutoSizeCompat.autoConvertDensityBaseOnWidth(getResources(), BaseAlertDialogBuilder.ALERT_BASE_WIDTH);
+ }
+ mUserDebugDialog.setCanceledOnTouchOutside(false);
+ mUserDebugDialog.show();
+ mUserDebugDialog.getWindow().setGravity(Gravity.CENTER);
+ mUserDebugDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
+ mUserDebugDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
+ mUserDebugDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+ }
+
private void setLocalData() {
String avatarFilePath = mMMKV.decodeString(CommonConfig.UIUI_USER_AVATAR_KEY);
GlideLoadUtils.getInstance().glideLoad(UserActivity.this, avatarFilePath, mViewDataBinding.nvAvatar, R.drawable.default_avatar);
@@ -276,10 +346,10 @@ public class UserActivity extends BaseMvvmActivity mAppUpdateInfoData = new MutableLiveData<>();
+ public MutableLiveData mAppUpdateInfoData = new MutableLiveData<>();
public void checkUpdate() {
- NetInterfaceManager.getInstance().getCheckUpdateObservable(BuildConfig.APPLICATION_ID)
+ NetInterfaceManager.getInstance().getUpdateObservable(BuildConfig.APPLICATION_ID)
.compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY))
- .subscribe(new Observer>() {
+ .subscribe(new Observer>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.e("checkUpdate", "onSubscribe: ");
}
@Override
- public void onNext(@NonNull BaseResponse appUpdateInfoBaseResponse) {
+ public void onNext(@NonNull BaseResponse appUpdateInfoBaseResponse) {
Log.e("checkUpdate", "onNext: " + appUpdateInfoBaseResponse);
if (appUpdateInfoBaseResponse.code == 200) {
- AppUpdateInfo appUpdateInfo = appUpdateInfoBaseResponse.data;
+ AppInfo appUpdateInfo = appUpdateInfoBaseResponse.data;
mAppUpdateInfoData.setValue(appUpdateInfo);
} else {
mAppUpdateInfoData.setValue(null);
diff --git a/app/src/main/java/com/xwad/os/adapter/AppAdapter.java b/app/src/main/java/com/xwad/os/adapter/AppAdapter.java
index 72b7a92..aeba61a 100644
--- a/app/src/main/java/com/xwad/os/adapter/AppAdapter.java
+++ b/app/src/main/java/com/xwad/os/adapter/AppAdapter.java
@@ -23,12 +23,12 @@ import com.xwad.os.activity.ExitActivity;
import com.xwad.os.activity.ManualActivity;
import com.xwad.os.activity.PasswordActivity;
import com.xwad.os.activity.activation.ActivationActivity;
+import com.xwad.os.activity.homework.HomeworkActivity;
import com.xwad.os.activity.login.LoginActivity;
import com.xwad.os.activity.service.ServiceActivity;
import com.xwad.os.bean.DesktopIcon;
import com.xwad.os.config.CommonConfig;
import com.xwad.os.manager.AppManager;
-import com.xwad.os.manager.RemoteManager;
import com.xwad.os.utils.ActivationUtil;
import com.xwad.os.utils.ApkUtils;
import com.xwad.os.utils.OpenApkUtils;
@@ -64,7 +64,6 @@ public class AppAdapter extends RecyclerView.Adapter {
holder.iv_icon.setImageDrawable(desktopIcon.getIcon());
String pkg = desktopIcon.getPackageName();
Log.e(TAG, "getView: " + pkg);
- holder.iv_icon.setImageDrawable(desktopIcon.getIcon());
// int i = IconUtils.appClassNameList.indexOf(pkg);
// if (i != -1) {
@@ -93,12 +92,6 @@ public class AppAdapter extends RecyclerView.Adapter {
@Override
public void onClick(View view) {
Log.e(TAG, "onClick: " + pkg);
-
- if (OpenApkUtils.getInstance().getDisallowedRunningAppSet().contains(pkg)) {
- Toaster.show("应用已禁止打开");
- return;
- }
-
if (TextUtils.isEmpty(pkg)) {
Toaster.show("应用未安装");
OpenApkUtils.getInstance().showDownloadDialog(mContext, pkg, lable);
@@ -110,6 +103,11 @@ public class AppAdapter extends RecyclerView.Adapter {
return;
}
+ if (AppManager.APP_HOMEWORK.equals(pkg)) {
+ mContext.startActivity(new Intent(mContext, HomeworkActivity.class));
+ return;
+ }
+
if (!ApkUtils.isAvailable(mContext, pkg)) {
OpenApkUtils.getInstance().showDownloadDialog(mContext, pkg, lable);
return;
@@ -178,12 +176,12 @@ public class AppAdapter extends RecyclerView.Adapter {
intent.setPackage("com.uiui.zy");
mContext.sendBroadcast(intent);
- boolean is_activation = RemoteManager.getInstance().getSnIsActivation();
- if (is_activation) {
- mContext.startActivity(new Intent(mContext, ExitActivity.class));
- } else {
- Utils.exitDesktop(mContext);
- }
+// boolean is_activation = AdminManager.getInstance().getSnIsActivation();
+// if (is_activation) {
+// mContext.startActivity(new Intent(mContext, ExitActivity.class));
+// } else {
+// Utils.exitDesktop(mContext);
+// }
}
@Override
diff --git a/app/src/main/java/com/xwad/os/adapter/HomeworkDetailPicAdapter.java b/app/src/main/java/com/xwad/os/adapter/HomeworkDetailPicAdapter.java
index d62668a..0eac56c 100644
--- a/app/src/main/java/com/xwad/os/adapter/HomeworkDetailPicAdapter.java
+++ b/app/src/main/java/com/xwad/os/adapter/HomeworkDetailPicAdapter.java
@@ -17,11 +17,11 @@ import com.bumptech.glide.load.DecodeFormat;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.Target;
-import com.xwad.os.R;
-import com.xwad.os.utils.FileUtil;
-import com.xwad.os.utils.GlideLoadUtils;
import com.wgw.photo.preview.PhotoPreview;
import com.wgw.photo.preview.interfaces.ImageLoader;
+import com.xwad.os.R;
+import com.xwad.os.utils.FileUtils;
+import com.xwad.os.utils.GlideLoadUtils;
import java.io.File;
import java.util.List;
@@ -48,7 +48,7 @@ public class HomeworkDetailPicAdapter extends RecyclerView.Adapter urls = mHomeworkBean.getFile_url();
String url = urls.get(position);
- File file = new File(FileUtil.getDownLoadPath(mContext) + FileUtil.getFileNamefromURL(url));
+ File file = new File(FileUtils.getDownLoadPath(mContext) + FileUtils.getFileNamefromURL(url));
if (file.exists()) {
GlideLoadUtils.getInstance().glideLoadSetSize(mContext, file, holder.nv_pic, R.mipmap.ic_launcher);
holder.iv_download.setVisibility(View.GONE);
@@ -95,11 +95,11 @@ public class HomeworkDetailPicAdapter2 extends RecyclerView.Adapter sn_package;
+ int sn_package_id;
+
+ public int getIs_activation() {
+ return is_activation;
+ }
+
+ public void setIs_activation(int is_activation) {
+ this.is_activation = is_activation;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public int getCode_type() {
+ return code_type;
+ }
+
+ public void setCode_type(int code_type) {
+ this.code_type = code_type;
+ }
+
+ public long getExpire_time() {
+ return expire_time;
+ }
+
+ public void setExpire_time(long expire_time) {
+ this.expire_time = expire_time;
+ }
+
+ public long getActivation_time() {
+ return activation_time;
+ }
+
+ public void setActivation_time(long activation_time) {
+ this.activation_time = activation_time;
+ }
+
+ public List getSn_package() {
+ return sn_package;
+ }
+
+ public void setSn_package(List sn_package) {
+ this.sn_package = sn_package;
+ }
+
+ public int getSn_package_id() {
+ return sn_package_id;
+ }
+
+ public void setSn_package_id(int sn_package_id) {
+ this.sn_package_id = sn_package_id;
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/bean/SnPackage.java b/app/src/main/java/com/xwad/os/bean/SnPackage.java
new file mode 100644
index 0000000..fceaae1
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/bean/SnPackage.java
@@ -0,0 +1,71 @@
+package com.xwad.os.bean;
+
+import java.io.Serializable;
+
+public class SnPackage implements Serializable {
+ private static final long serialVersionUID = -2350603364822310416L;
+
+ int id;
+ String sn_id;
+ String sn;
+ String app_package;
+ String code;
+ String sn_package_app_id;
+ SnPackageApp sn_package_app;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getSn_id() {
+ return sn_id;
+ }
+
+ public void setSn_id(String sn_id) {
+ this.sn_id = sn_id;
+ }
+
+ public String getSn() {
+ return sn;
+ }
+
+ public void setSn(String sn) {
+ this.sn = sn;
+ }
+
+ public String getApp_package() {
+ return app_package;
+ }
+
+ public void setApp_package(String app_package) {
+ this.app_package = app_package;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public String getSn_package_app_id() {
+ return sn_package_app_id;
+ }
+
+ public void setSn_package_app_id(String sn_package_app_id) {
+ this.sn_package_app_id = sn_package_app_id;
+ }
+
+ public SnPackageApp getSn_package_app() {
+ return sn_package_app;
+ }
+
+ public void setSn_package_app(SnPackageApp sn_package_app) {
+ this.sn_package_app = sn_package_app;
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/bean/SnPackageApp.java b/app/src/main/java/com/xwad/os/bean/SnPackageApp.java
new file mode 100644
index 0000000..b2c9a2f
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/bean/SnPackageApp.java
@@ -0,0 +1,26 @@
+package com.xwad.os.bean;
+
+import java.io.Serializable;
+
+public class SnPackageApp implements Serializable {
+ private static final long serialVersionUID = 3704612310075489816L;
+
+ int id;
+ String app_name;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getApp_name() {
+ return app_name;
+ }
+
+ public void setApp_name(String app_name) {
+ this.app_name = app_name;
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/bean/SystemSettings.java b/app/src/main/java/com/xwad/os/bean/SystemSettings.java
index 9b78770..10679ab 100644
--- a/app/src/main/java/com/xwad/os/bean/SystemSettings.java
+++ b/app/src/main/java/com/xwad/os/bean/SystemSettings.java
@@ -76,6 +76,8 @@ public class SystemSettings implements Serializable {
int ai_teacher;
int photo_search_questions;
int ai_question_test;
+ int sys_voice_assistant;
+ int app_notify;
public int getSetting_call() {
return setting_call;
@@ -573,6 +575,22 @@ public class SystemSettings implements Serializable {
this.ai_question_test = ai_question_test;
}
+ public int getSys_voice_assistant() {
+ return sys_voice_assistant;
+ }
+
+ public void setSys_voice_assistant(int sys_voice_assistant) {
+ this.sys_voice_assistant = sys_voice_assistant;
+ }
+
+ public int getApp_notify() {
+ return app_notify;
+ }
+
+ public void setApp_notify(int app_notify) {
+ this.app_notify = app_notify;
+ }
+
@NotNull
@Override
public String toString() {
diff --git a/app/src/main/java/com/xwad/os/bean/WhoisBean.java b/app/src/main/java/com/xwad/os/bean/WhoisBean.java
new file mode 100644
index 0000000..016dd6e
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/bean/WhoisBean.java
@@ -0,0 +1,109 @@
+package com.xwad.os.bean;
+
+import androidx.annotation.NonNull;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonParser;
+
+import java.io.Serializable;
+
+public class WhoisBean implements Serializable {
+ private static final long serialVersionUID = -6537021620041268080L;
+
+ String ip;
+ String pro;
+ String proCode;
+ String city;
+ String cityCode;
+ String region;
+ String regionCode;
+ String addr;
+ String regionNames;
+ String err;
+
+ public String getIp() {
+ return ip;
+ }
+
+ public void setIp(String ip) {
+ this.ip = ip;
+ }
+
+ public String getPro() {
+ return pro;
+ }
+
+ public void setPro(String pro) {
+ this.pro = pro;
+ }
+
+ public String getProCode() {
+ return proCode;
+ }
+
+ public void setProCode(String proCode) {
+ this.proCode = proCode;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public String getCityCode() {
+ return cityCode;
+ }
+
+ public void setCityCode(String cityCode) {
+ this.cityCode = cityCode;
+ }
+
+ public String getRegion() {
+ return region;
+ }
+
+ public void setRegion(String region) {
+ this.region = region;
+ }
+
+ public String getRegionCode() {
+ return regionCode;
+ }
+
+ public void setRegionCode(String regionCode) {
+ this.regionCode = regionCode;
+ }
+
+ public String getAddr() {
+ return addr;
+ }
+
+ public void setAddr(String addr) {
+ this.addr = addr;
+ }
+
+ public String getRegionNames() {
+ return regionNames;
+ }
+
+ public void setRegionNames(String regionNames) {
+ this.regionNames = regionNames;
+ }
+
+ public String getErr() {
+ return err;
+ }
+
+ public void setErr(String err) {
+ this.err = err;
+ }
+
+ @NonNull
+ @Override
+ public String toString() {
+ return JsonParser.parseString(new Gson().toJson(this)).getAsJsonObject().toString();
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/bean/uiuios/AppBase.java b/app/src/main/java/com/xwad/os/bean/uiuios/AppBase.java
new file mode 100644
index 0000000..b431565
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/bean/uiuios/AppBase.java
@@ -0,0 +1,58 @@
+package com.xwad.os.bean.uiuios;
+
+import androidx.annotation.NonNull;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonParser;
+
+import java.io.Serializable;
+
+public class AppBase implements Serializable {
+ private static final long serialVersionUID = -1084612101570534997L;
+
+ int id;
+ String app_name;
+ String app_package;
+// @SerializedName(value = "icon", alternate = "app_icon")
+ String icon;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getApp_name() {
+ return app_name;
+ }
+
+ public void setApp_name(String app_name) {
+ this.app_name = app_name;
+ }
+
+ public String getApp_package() {
+ return app_package;
+ }
+
+ public void setApp_package(String app_package) {
+ this.app_package = app_package;
+ }
+
+ public String getIcon() {
+ return icon;
+ }
+
+ public void setIcon(String icon) {
+ this.icon = icon;
+ }
+
+
+ @NonNull
+ @Override
+ public String toString() {
+ return JsonParser.parseString(new Gson().toJson(this)).getAsJsonObject().toString();
+ }
+
+}
diff --git a/app/src/main/java/com/xwad/os/bean/AppUpdateInfo.java b/app/src/main/java/com/xwad/os/bean/uiuios/AppUpdateInfo.java
similarity index 98%
rename from app/src/main/java/com/xwad/os/bean/AppUpdateInfo.java
rename to app/src/main/java/com/xwad/os/bean/uiuios/AppUpdateInfo.java
index 57e647a..c9ba6b3 100644
--- a/app/src/main/java/com/xwad/os/bean/AppUpdateInfo.java
+++ b/app/src/main/java/com/xwad/os/bean/uiuios/AppUpdateInfo.java
@@ -1,4 +1,4 @@
-package com.xwad.os.bean;
+package com.xwad.os.bean.uiuios;
import androidx.annotation.NonNull;
diff --git a/app/src/main/java/com/xwad/os/config/CommonConfig.java b/app/src/main/java/com/xwad/os/config/CommonConfig.java
index 4f9c3b2..005ec52 100644
--- a/app/src/main/java/com/xwad/os/config/CommonConfig.java
+++ b/app/src/main/java/com/xwad/os/config/CommonConfig.java
@@ -12,7 +12,7 @@ public class CommonConfig {
public static final String isLogined = "isLogined";
public static final String AES_KEY = "xqdep8exnafpef3d";
- public static final String LOCK_SCREEN_PASSWORD ="Iflytek_lockScreenPasswordKey";
+ public static final String LOCK_SCREEN_PASSWORD = "Iflytek_lockScreenPasswordKey";
public static final String DEFAULT_PASSWORD = "666666";
public static final String SCREEN_LOCK_PWD = "screen_lock_passwd";
@@ -54,6 +54,13 @@ public class CommonConfig {
/*是否显示返回Android按钮*/
public static final String UIUI_RETURN_ANDROID_KEY = "iflytek_uiui_is_return_android";
+ public static final String APP_ICON_HIND_SET_KEY = "AppIconHindSet";
+
+ public static final String ShowStatusBarExpandPanel = "ShowStatusBarExpandPanel";
+
+ public static final String ShowNavigationBar = "ShowNavigationBar";
+
+
/*让桌面更新定位信息*/
public static final String IFLYTEK_UPDATE_ADDRESS_ACTION = "IFLYTEK_UPDATE_ADDRESS";
@@ -73,7 +80,6 @@ public class CommonConfig {
public static final String MAP_BEAN = "MapBean";
- public static final String SETTING_OTHER_APPINSTALLER_KEY = "iflytek_setting_other_appInstaller";
/*应用市场的app列表*/
public final static String ADMIN_APP_LIST = "only_admin_app_list";
/*默认地址北京*/
@@ -146,4 +152,5 @@ public class CommonConfig {
public final static String AOLE_ACTION_APP_FORBID_ID = "aole_app_forbid_id";
/*应用ID管控*/
public final static String AOLE_ACTION_APP_FORBID_ARRAY = "DeselectViewArray";
+
}
diff --git a/app/src/main/java/com/xwad/os/dialog/DeactivateDialog.java b/app/src/main/java/com/xwad/os/dialog/DeactivateDialog.java
new file mode 100644
index 0000000..4153ab5
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/dialog/DeactivateDialog.java
@@ -0,0 +1,239 @@
+package com.xwad.os.dialog;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.appcompat.app.AlertDialog;
+
+import com.xwad.os.R;
+
+/**
+ * description:自定义dialog
+ */
+
+public class DeactivateDialog extends AlertDialog {
+
+ /**
+ * 显示的标题
+ */
+ private TextView titleTv;
+
+ /**
+ * 显示的消息
+ */
+ private TextView messageTv;
+
+ /**
+ * 确认和取消按钮
+ */
+ private TextView negtiveBn, positiveBn, tvDeactivate;
+
+ /**
+ * 按钮之间的分割线
+ */
+// private View columnLineView;
+
+ private Context mContext;
+
+ public DeactivateDialog(Context context) {
+ super(context, R.style.CustomDialog);
+ this.mContext = context;
+ }
+
+ /**
+ * 都是内容数据
+ */
+ private String message;
+ private String title;
+ private String positive, negtive;
+
+ /**
+ * 底部是否只有一个按钮
+ */
+ private boolean isSingle = false;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.dialog_deactivate);
+ //按空白处不能取消动画
+ setCanceledOnTouchOutside(false);
+ //初始化界面控件
+ initView();
+ //初始化界面数据
+ refreshView();
+ //初始化界面控件的事件
+ initEvent();
+ }
+
+ /**
+ * 初始化界面的确定和取消监听器
+ */
+ private void initEvent() {
+ //设置确定按钮被点击后,向外界提供监听
+ positiveBn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (onClickBottomListener != null) {
+ onClickBottomListener.onPositiveClick();
+ }
+ }
+ });
+ //设置取消按钮被点击后,向外界提供监听
+ negtiveBn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (onClickBottomListener != null) {
+ onClickBottomListener.onNegtiveClick();
+ }
+ }
+ });
+ tvDeactivate.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (onClickBottomListener != null) {
+ onClickBottomListener.onDeactivateClick();
+ }
+ }
+ });
+ }
+
+ /**
+ * 初始化界面控件的显示数据
+ */
+ private void refreshView() {
+ //如果用户自定了title和message
+ if (!TextUtils.isEmpty(title)) {
+ titleTv.setText(title);
+ titleTv.setVisibility(View.VISIBLE);
+ } else {
+ titleTv.setVisibility(View.GONE);
+ }
+ if (!TextUtils.isEmpty(message)) {
+ messageTv.setText(message);
+ }
+ //如果设置按钮的文字
+ if (!TextUtils.isEmpty(positive)) {
+ positiveBn.setText(positive);
+ } else {
+ positiveBn.setText("确定");
+ }
+ if (!TextUtils.isEmpty(negtive)) {
+ negtiveBn.setText(negtive);
+ } else {
+ negtiveBn.setText("取消");
+ }
+ /**
+ * 只显示一个按钮的时候隐藏取消按钮,回掉只执行确定的事件
+ */
+ if (isSingle) {
+// columnLineView.setVisibility(View.GONE);
+ negtiveBn.setVisibility(View.GONE);
+ } else {
+ negtiveBn.setVisibility(View.VISIBLE);
+// columnLineView.setVisibility(View.VISIBLE);
+ }
+ }
+
+ @Override
+ public void show() {
+ super.show();
+ refreshView();
+ }
+
+ /**
+ * 初始化界面控件
+ */
+ private void initView() {
+ negtiveBn = findViewById(R.id.negtive);
+ positiveBn = findViewById(R.id.positive);
+ tvDeactivate = findViewById(R.id.tv_deactivate);
+ titleTv = findViewById(R.id.title);
+ messageTv = findViewById(R.id.message);
+// columnLineView = findViewById(R.id.column_line);
+ }
+
+ /**
+ * 设置确定取消按钮的回调
+ */
+ private OnClickBottomListener onClickBottomListener;
+
+ public void setOnClickBottomListener(OnClickBottomListener onClickBottomListener) {
+ this.onClickBottomListener = onClickBottomListener;
+ }
+
+ public interface OnClickBottomListener {
+ /**
+ * 点击确定按钮事件
+ */
+ void onPositiveClick();
+
+ /**
+ * 点击取消按钮事件
+ */
+ void onNegtiveClick();
+
+ /**
+ * 点击取消激活按钮事件
+ */
+ void onDeactivateClick();
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public DeactivateDialog setMessage(String message) {
+ this.message = message;
+ return this;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public DeactivateDialog setTitle(String title) {
+ this.title = title;
+ return this;
+ }
+
+ public String getPositive() {
+ return positive;
+ }
+
+ public DeactivateDialog setPositive(String positive) {
+ this.positive = positive;
+ return this;
+ }
+
+ public String getNegtive() {
+ return negtive;
+ }
+
+ public DeactivateDialog setNegtive(String negtive) {
+ this.negtive = negtive;
+ return this;
+ }
+
+ public DeactivateDialog setNegtiveText(String negtive) {
+ negtiveBn.setText(negtive);
+ return this;
+ }
+
+ public boolean isSingle() {
+ return isSingle;
+ }
+
+ public DeactivateDialog setSingle(boolean single) {
+ isSingle = single;
+ return this;
+ }
+
+ @Override
+ public void dismiss() {
+ super.dismiss();
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/dialog/UserDebugDialog.java b/app/src/main/java/com/xwad/os/dialog/UserDebugDialog.java
new file mode 100644
index 0000000..e3a606f
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/dialog/UserDebugDialog.java
@@ -0,0 +1,248 @@
+package com.xwad.os.dialog;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import com.xwad.os.R;
+
+
+/**
+ * description:自定义dialog
+ */
+
+public class UserDebugDialog extends AlertDialog {
+
+ /**
+ * 显示的标题
+ */
+ private TextView titleTv;
+
+ /**
+ * 确认和取消按钮
+ */
+ private TextView negtiveBn, positiveBn;
+
+ private EditText editText;
+
+
+ private Context mContext;
+
+ public UserDebugDialog(Context context) {
+ super(context, R.style.UserDebugDialog);
+ this.mContext = context;
+ }
+
+ /**
+ * 都是内容数据
+ */
+ private String message;
+ private String title;
+ private String positive, negtive;
+ private int imageResId = -1;
+
+ /**
+ * 底部是否只有一个按钮
+ */
+ private boolean isSingle = false;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.dialog_userdebug);
+ //按空白处不能取消动画
+// setCanceledOnTouchOutside(false);
+ //初始化界面控件
+ initView();
+ //初始化界面数据
+ refreshView();
+ //初始化界面控件的事件
+ initEvent();
+ }
+
+ /**
+ * 初始化界面的确定和取消监听器
+ */
+ private void initEvent() {
+ //设置确定按钮被点击后,向外界提供监听
+ positiveBn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (onClickBottomListener != null) {
+ onClickBottomListener.onPositiveClick();
+ }
+ }
+ });
+ //设置取消按钮被点击后,向外界提供监听
+ negtiveBn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (onClickBottomListener != null) {
+ onClickBottomListener.onNegtiveClick();
+ }
+ }
+ });
+ }
+
+ /**
+ * 初始化界面控件的显示数据
+ */
+ private void refreshView() {
+ //如果用户自定了title和message
+// if (!TextUtils.isEmpty(title)) {
+// titleTv.setText(title);
+// titleTv.setVisibility(View.VISIBLE);
+// } else {
+// titleTv.setVisibility(View.GONE);
+// }
+ //如果设置按钮的文字
+ if (!TextUtils.isEmpty(positive)) {
+ positiveBn.setText(positive);
+ } else {
+ positiveBn.setText("确定");
+ }
+ if (!TextUtils.isEmpty(negtive)) {
+ negtiveBn.setText(negtive);
+ } else {
+ negtiveBn.setText("取消");
+ }
+
+ /**
+ * 只显示一个按钮的时候隐藏取消按钮,回掉只执行确定的事件
+ */
+ if (isSingle) {
+ negtiveBn.setVisibility(View.GONE);
+ } else {
+ negtiveBn.setVisibility(View.VISIBLE);
+ }
+ }
+
+ @Override
+ public void show() {
+ super.show();
+ refreshView();
+ }
+
+ /**
+ * 初始化界面控件
+ */
+ private void initView() {
+ negtiveBn = findViewById(R.id.bt_cancel);
+ positiveBn = findViewById(R.id.bt_confirm);
+ titleTv = findViewById(R.id.tv_title);
+ editText = findViewById(R.id.editText);
+ }
+
+ /**
+ * 设置确定取消按钮的回调
+ */
+ private OnClickBottomListener onClickBottomListener;
+
+ public void setOnClickBottomListener(OnClickBottomListener onClickBottomListener) {
+ this.onClickBottomListener = onClickBottomListener;
+ }
+
+ public interface OnClickBottomListener {
+ /**
+ * 点击确定按钮事件
+ */
+ void onPositiveClick();
+
+ /**
+ * 点击取消按钮事件
+ */
+ void onNegtiveClick();
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public UserDebugDialog setMessage(String message) {
+ this.message = message;
+ return this;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public UserDebugDialog setTitle(String title) {
+ this.title = title;
+ return this;
+ }
+
+ public String getPositive() {
+ return positive;
+ }
+
+ public UserDebugDialog setPositive(String positive) {
+ this.positive = positive;
+ return this;
+ }
+
+ public String getNegtive() {
+ return negtive;
+ }
+
+ public UserDebugDialog setNegtive(String negtive) {
+ this.negtive = negtive;
+ return this;
+ }
+
+ public UserDebugDialog setNegtiveText(String negtive) {
+ negtiveBn.setText(negtive);
+ return this;
+ }
+
+ public int getImageResId() {
+ return imageResId;
+ }
+
+ public boolean isSingle() {
+ return isSingle;
+ }
+
+ public UserDebugDialog setSingle(boolean single) {
+ isSingle = single;
+ return this;
+ }
+
+ public UserDebugDialog setImageResId(int imageResId) {
+ this.imageResId = imageResId;
+ return this;
+ }
+
+ public void showKeyboard() {
+ if (editText != null) {
+ //设置可获得焦点
+ editText.setFocusable(true);
+ editText.setFocusableInTouchMode(true);
+ //请求获得焦点
+ editText.requestFocus();
+ //调用系统输入法
+ InputMethodManager inputManager = (InputMethodManager) editText
+ .getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+ inputManager.showSoftInput(editText, 0);
+ }
+ }
+
+ @Override
+ public void dismiss() {
+ super.dismiss();
+
+ }
+
+ public String getEdittext() {
+ if (!TextUtils.isEmpty(editText.getText().toString())) {
+ return editText.getText().toString().trim();
+ } else {
+ return "";
+ }
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/eula/EulaDialog.java b/app/src/main/java/com/xwad/os/eula/EulaDialog.java
new file mode 100644
index 0000000..35b6287
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/eula/EulaDialog.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) Honor Technologies Co., Ltd. 2019-2020. All rights reserved.
+ */
+
+package com.xwad.os.eula;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.graphics.Color;
+import android.text.Html;
+import android.text.Spannable;
+import android.text.SpannableStringBuilder;
+import android.text.Spanned;
+import android.text.method.LinkMovementMethod;
+import android.text.style.ClickableSpan;
+import android.text.style.URLSpan;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CheckBox;
+import android.widget.TextView;
+
+import androidx.appcompat.app.AlertDialog;
+
+import com.xwad.os.R;
+import com.xwad.os.base.BaseAlertDialogBuilder;
+
+
+/**
+ * The EulaDialog for this Sample
+ *
+ * @author honor mdm
+ * @since 2019-10-23
+ */
+public class EulaDialog {
+ private static final int REQUEST_ENABLE = 1;
+ private static final String PERMISSION_STATEMENT_FILE = "honor_permission_statement.html";
+
+ private Activity mActivity = null;
+ private DevicePolicyManager mDevicePolicyManager = null;
+ private ComponentName mAdminName = null;
+ private boolean hasUserAccepted = false;
+ private boolean onlyShowOnce = false;
+ private AlertDialog eulaDialog;
+ private EulaCallback mEulaCallback;
+
+ public EulaDialog(Activity context, DevicePolicyManager devicePolicyManager, ComponentName adminName, EulaCallback callback) {
+ mActivity = context;
+ mDevicePolicyManager = devicePolicyManager;
+ mAdminName = adminName;
+ mEulaCallback = callback;
+ }
+
+ public interface EulaCallback {
+ void onGranted();
+
+ void onDenied();
+ }
+
+ /**
+ * Show permission usage statement
+ */
+ @SuppressLint("InflateParams")
+ public void show() {
+ EulaUtils eulaUtils = new EulaUtils();
+ hasUserAccepted = eulaUtils.hasUserAccepted();
+ if (!hasUserAccepted) {
+ /* Show the Eula */
+ if (eulaDialog == null) {
+ BaseAlertDialogBuilder builder = new BaseAlertDialogBuilder(mActivity);
+ builder.setPositiveButton(mActivity.getString(R.string.accept_btn),
+ (dialog, which) -> {
+ eulaUtils.saveUserOnlyShowOnce(onlyShowOnce);
+ eulaUtils.saveUserChoice(true);
+ dialog.dismiss();
+ mEulaCallback.onGranted();
+ });
+ builder.setNegativeButton(mActivity.getString(R.string.exit_btn),
+ (dialog, which) -> {
+ mEulaCallback.onDenied();
+ mActivity.finish();
+ });
+ eulaDialog = builder.create();
+ builder.setCancelable(false);
+ LayoutInflater inflater = LayoutInflater.from(mActivity);
+ View layout = inflater.inflate(R.layout.eula_layout, null);
+ TextView permissionText = layout.findViewById(R.id.content_permissions);
+ String content = Utils.getStringFromHtmlFile(mActivity, PERMISSION_STATEMENT_FILE);
+ permissionText.setText(Html.fromHtml(content));
+
+ initStatementView(layout);
+
+ CheckBox checkbox = layout.findViewById(R.id.not_show_check);
+ checkbox.setOnCheckedChangeListener((buttonView, isChecked) -> {
+ onlyShowOnce = isChecked;
+ });
+ eulaDialog.setView(layout);
+ eulaDialog.show();
+ eulaDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+ }
+ } else {
+ mEulaCallback.onGranted();
+ }
+ }
+
+ private void initStatementView(View layout) {
+ if (layout == null) {
+ return;
+ }
+ TextView statementText = layout.findViewById(R.id.read_statement);
+ statementText.setMovementMethod(LinkMovementMethod.getInstance());
+ CharSequence text = statementText.getText();
+ if (text instanceof Spannable) {
+ int end = text.length();
+ Spannable sp = (Spannable) text;
+ URLSpan[] urls = sp.getSpans(0, end, URLSpan.class);
+ SpannableStringBuilder style = new SpannableStringBuilder(text);
+ style.clearSpans(); // should clear old spans
+ for (URLSpan url : urls) {
+ MyURLSpan myURLSpan = new MyURLSpan();
+ style.setSpan(myURLSpan, sp.getSpanStart(url), sp.getSpanEnd(url), Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
+ }
+ statementText.setText(style);
+ }
+ }
+
+ private class MyURLSpan extends ClickableSpan {
+ @Override
+ public void onClick(View widget) {
+ widget.setBackgroundColor(Color.parseColor("#00000000"));
+
+ Intent intent = new Intent(mActivity, LicenseActivity.class);
+ mActivity.startActivity(intent);
+ }
+ }
+
+ private void activeProcess() {
+// if (mDevicePolicyManager != null
+// && !mDevicePolicyManager.isAdminActive(mAdminName)) {
+// Intent intent = new Intent(mActivity, SplashActivity.class);
+// mActivity.startActivityForResult(intent, REQUEST_ENABLE);
+// }
+
+ }
+
+
+}
diff --git a/app/src/main/java/com/xwad/os/eula/EulaUtils.java b/app/src/main/java/com/xwad/os/eula/EulaUtils.java
new file mode 100644
index 0000000..0c15d4e
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/eula/EulaUtils.java
@@ -0,0 +1,63 @@
+package com.xwad.os.eula;
+
+import com.tencent.mmkv.MMKV;
+
+/**
+ * 只要当用户选中“不再提醒”,同时点击“同意”后,此对话框就不用再显示;但是如果应用有了重大功能更新(开发者自行判断),此对话框还要再次弹出。
+ */
+public class EulaUtils {
+ private static final String TAG = "EulaUtils";
+
+ /*重大功能更新版本号*/
+ private static final int DEFAULT_VERSION_CODE = 1;
+ private static final String MMKV_EULA_ID = "eula";
+ private static final String EULA_PREFIX = "eula_useraccepted_";
+ private static final String ONLY_SHOW_ONCE_KEY = "eula_useraccepted_onlyShowOnce";
+ private int mVersionCode;
+
+ private String mEulaKey;
+
+ private MMKV mMMKV = MMKV.mmkvWithID(MMKV_EULA_ID, MMKV.MULTI_PROCESS_MODE);
+
+ public EulaUtils() {
+// mVersionCode = getVersionCodeInner();
+ mVersionCode = DEFAULT_VERSION_CODE;
+ mEulaKey = EULA_PREFIX + mVersionCode;
+ }
+
+ public void saveUserOnlyShowOnce(boolean onlyShowOnce) {
+ mMMKV.encode(mEulaKey, onlyShowOnce);
+ }
+
+ /**
+ * Whether the user select not show again
+ *
+ * @return boolean true if selected otherwise false.
+ */
+ public boolean hasUserAccepted() {
+ if (mMMKV.decodeBool(ONLY_SHOW_ONCE_KEY, false)) {
+ return true;
+ } else {
+ return mMMKV.decodeBool(mEulaKey, false);
+ }
+ }
+
+ /**
+ * Save user's choice to SharedPreferences.
+ *
+ * @param accepted Whether the user select not show again.
+ */
+ public void saveUserChoice(boolean accepted) {
+ mMMKV.encode(mEulaKey, accepted);
+ }
+
+// private int getVersionCodeInner() {
+// PackageInfo pi = null;
+// try {
+// pi = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES);
+// } catch (PackageManager.NameNotFoundException e) {
+// Log.e(TAG, "Name not found exception");
+// }
+// return pi == null ? DEFAULT_VERSION_CODE : pi.versionCode;
+// }
+}
diff --git a/app/src/main/java/com/xwad/os/eula/LicenseActivity.java b/app/src/main/java/com/xwad/os/eula/LicenseActivity.java
new file mode 100644
index 0000000..9b7b93b
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/eula/LicenseActivity.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) Honor Technologies Co., Ltd. 2019-2020. All rights reserved.
+ */
+
+package com.xwad.os.eula;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.text.Html;
+import android.view.Window;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.xwad.os.R;
+
+/**
+ * The LicenseActivity for this Sample
+ *
+ * @author honor mdm
+ * @since 2019-10-23
+ */
+public class LicenseActivity extends Activity {
+ private static final String LICENSE_FILE = "honor_software_license.html";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ requestWindowFeature(Window.FEATURE_NO_TITLE);
+ setContentView(R.layout.license_layout);
+ Button acceptBtn = findViewById(R.id.cancelBtn);
+ acceptBtn.setOnClickListener(view -> finish());
+ TextView licenseText = findViewById(R.id.license_content);
+ String content = Utils.getStringFromHtmlFile(this, LICENSE_FILE);
+ licenseText.setText(Html.fromHtml(content));
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/eula/Utils.java b/app/src/main/java/com/xwad/os/eula/Utils.java
new file mode 100644
index 0000000..1eb25b4
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/eula/Utils.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) Honor Technologies Co., Ltd. 2019-2020. All rights reserved.
+ */
+
+package com.xwad.os.eula;
+
+import android.content.Context;
+import android.util.Log;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+/**
+ * The Utils for this Sample
+ *
+ * @author honor mdm
+ * @since 2019-10-23
+ */
+public class Utils {
+ private static final String TAG = "SampleUtils";
+ private static final int EXPECTED_BUFFER_DATA = 2048;
+ private static final int MAX_LENGTH = 1024;
+ private static final int MAX_LINE_LENGTH = 128;
+
+ /**
+ * Get help string from html file
+ *
+ * @param context Context object
+ * @param filePath html file path
+ * @return string in html
+ */
+ public static String getStringFromHtmlFile(Context context, String filePath) {
+ String result = "";
+ if (context == null || filePath == null) {
+ return result;
+ }
+ try (InputStreamReader streamReader =
+ new InputStreamReader(context.getAssets().open(filePath), "utf-8");
+ BufferedReader reader = new BufferedReader(streamReader)) {
+ StringBuilder builder = new StringBuilder(EXPECTED_BUFFER_DATA);
+ String line = null;
+
+ boolean readCurrentLine = true;
+
+ // Read each line of the html file, and build a string.
+ while ((line = reader.readLine()) != null && line.length() < MAX_LINE_LENGTH) {
+ // Don't read the Head tags when CSS styling is not supporeted.
+ if (line.contains("
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/device_admin_sample.xml b/app/src/main/res/xml/device_admin_sample.xml
new file mode 100644
index 0000000..5e82553
--- /dev/null
+++ b/app/src/main/res/xml/device_admin_sample.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/file_paths.xml b/app/src/main/res/xml/file_paths.xml
index c69abbb..8131b84 100644
--- a/app/src/main/res/xml/file_paths.xml
+++ b/app/src/main/res/xml/file_paths.xml
@@ -1,18 +1,27 @@
-
-
-
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file