getAdminApp();
- //写入系统数据
- boolean putSecureInt(String key, int value);
- //写入系统数据
- boolean putSystemInt(String key, int value);
- //写入系统数据
- boolean putSystemFloat(String key, float value);
}
diff --git a/app/src/main/aidl/com/uiui/zy/KeepAliveConnection.aidl b/app/src/main/aidl/com/uiui/zy/KeepAliveConnection.aidl
new file mode 100644
index 0000000..8dd7ed1
--- /dev/null
+++ b/app/src/main/aidl/com/uiui/zy/KeepAliveConnection.aidl
@@ -0,0 +1,13 @@
+// KeepAliveConnection.aidl
+package com.uiui.zy;
+
+// Declare any non-default types here with import statements
+
+interface KeepAliveConnection {
+ /**
+ * Demonstrates some basic types that you can use as parameters
+ * and return values in AIDL.
+ */
+// void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
+// double aDouble, String aString);
+}
diff --git a/app/src/main/assets/honor_permission_statement.html b/app/src/main/assets/honor_permission_statement.html
new file mode 100644
index 0000000..0af5abb
--- /dev/null
+++ b/app/src/main/assets/honor_permission_statement.html
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+ 本软件在使用过程中,为了更好的提供客户服务,基于技术必要性将会使用到如下的权限和功能:
+
+
设备管理功能:
+
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..099a5dd 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;
@@ -24,6 +25,7 @@ import com.xwad.os.R;
import com.xwad.os.base.BaseDataBindingActivity;
import com.xwad.os.config.CommonConfig;
import com.xwad.os.databinding.ActivityExitBinding;
+import com.xwad.os.mdm.AdminManager;
import com.xwad.os.utils.Utils;
import java.util.List;
@@ -163,32 +165,35 @@ public class ExitActivity extends BaseDataBindingActivity {
}
private void exitDesktop() {
- List componentNames = getAllLauncherApps();
- Log.e(TAG, "exitDesktop: " + componentNames);
- if (componentNames != null && componentNames.size() != 0) {
- ComponentName componentName = componentNames.get(0);
- Intent intent = new Intent();
- intent.setComponent(componentName);
- try {
- startActivity(intent);
- } catch (Exception e) {
- Log.e(TAG, "exitDesktop: " + e.getMessage());
- }
- }
+// List componentNames = getAllLauncherApps();
+// Log.e(TAG, "exitDesktop: " + componentNames);
+// if (componentNames != null && componentNames.size() != 0) {
+// ComponentName componentName = componentNames.get(0);
+// Intent intent = new Intent();
+// intent.setComponent(componentName);
+// try {
+// startActivity(intent);
+// } catch (Exception e) {
+// Log.e(TAG, "exitDesktop: " + e.getMessage());
+// }
+// }
+//
+// startActivity(new Intent(Settings.ACTION_HOME_SETTINGS));
- startActivity(new Intent(Settings.ACTION_HOME_SETTINGS));
+ AdminManager.getInstance().setDefaultLauncher("com.hihonor.android.launcher", "com.hihonor.android.launcher.unihome.UniHomeLauncher");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
finishAndRemoveTask();
} else {
finishAffinity();
}
+
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
}
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/PasswordActivity.java b/app/src/main/java/com/xwad/os/activity/PasswordActivity.java
index 34d04c5..59ed6cc 100644
--- a/app/src/main/java/com/xwad/os/activity/PasswordActivity.java
+++ b/app/src/main/java/com/xwad/os/activity/PasswordActivity.java
@@ -4,6 +4,7 @@ import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Handler;
+import android.os.Looper;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
@@ -155,7 +156,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..ccda3d9
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/activity/debug/DebugActivity.java
@@ -0,0 +1,219 @@
+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.hihonor.android.app.admin.DeviceApplicationManager;
+import com.hihonor.android.app.admin.DeviceControlManager;
+import com.hihonor.android.app.admin.DeviceHwSystemManager;
+import com.hihonor.android.app.admin.DevicePackageManager;
+import com.hihonor.android.app.admin.DevicePasswordManager;
+import com.hihonor.android.app.admin.DeviceRestrictionManager;
+import com.hihonor.android.app.admin.DeviceSettingsManager;
+import com.xwad.os.R;
+import com.xwad.os.base.mvvm.BaseMvvmActivity;
+import com.xwad.os.databinding.ActivityDebugBinding;
+import com.xwad.os.mdm.AdminManager;
+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 DeviceRestrictionManager mDeviceRestrictionManager;
+ private DeviceControlManager mDeviceControlManager;
+ private DeviceApplicationManager mDeviceApplicationManager;
+ private DeviceHwSystemManager mDeviceHwSystemManager;
+ private DeviceSettingsManager mDeviceSettingsManager;
+ private DevicePasswordManager mDevicePasswordManager;
+
+ /*设备包管理类*/
+ private DevicePackageManager mDevicePackageManager;
+
+ 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);
+ mDeviceRestrictionManager = new DeviceRestrictionManager();
+ mDeviceControlManager = new DeviceControlManager();
+ mDeviceApplicationManager = new DeviceApplicationManager();
+ mDeviceHwSystemManager = new DeviceHwSystemManager();
+ mDeviceSettingsManager = new DeviceSettingsManager();
+ mDevicePackageManager = new DevicePackageManager();
+ mDevicePasswordManager = new DevicePasswordManager();
+ mAdminName = new ComponentName(this, AoleDeviceAdminReceiver.class);
+
+ mViewDataBinding.swWindow.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ mDeviceRestrictionManager.setMultiWindowDisabled(mAdminName, isChecked);
+ }
+ });
+ mViewDataBinding.swYoyo.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ mDeviceRestrictionManager.setVoiceAssistantButtonDisabled(mAdminName, isChecked);
+ if (isChecked) {
+ AdminManager.getInstance().removeDisallowedRunningApp("com.hihonor.servicecenter");
+ AdminManager.getInstance().addDisallowedRunningApp("com.hihonor.magicvoice");
+ } else {
+ AdminManager.getInstance().addDisallowedRunningApp("com.hihonor.servicecenter");
+ AdminManager.getInstance().removeDisallowedRunningApp("com.hihonor.magicvoice");
+ }
+ }
+ });
+ mViewDataBinding.swRestore.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ mDeviceSettingsManager.setRestoreFactoryDisabled(mAdminName, isChecked);
+ }
+ });
+ mViewDataBinding.swUsbDebug.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ mDeviceRestrictionManager.setUSBDataDisabled(mAdminName, isChecked);
+ mDeviceControlManager.turnOnUsbDebugMode(mAdminName, !isChecked);
+ }
+ });
+ mViewDataBinding.swRemoveAdmin.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ if (isChecked) {
+ mDeviceControlManager.setForcedActiveDeviceAdmin(mAdminName, DebugActivity.this);
+ } else {
+ mDeviceControlManager.removeActiveDeviceAdmin(mAdminName);
+ mDeviceControlManager.clearDeviceOwnerApp();
+ }
+ }
+ });
+ mViewDataBinding.swExpandPanel.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ try {
+ mDeviceRestrictionManager.setStatusBarExpandPanelDisabled(mAdminName, isChecked);
+ } catch (Exception e) {
+ Log.e(TAG, "onCheckedChanged: " + e.getMessage());
+ }
+ }
+ });
+ mViewDataBinding.swQuickTools.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ try {
+ mDevicePasswordManager.setQuickToolsDisabled(mAdminName, isChecked);
+ } catch (Exception e) {
+ Log.e(TAG, "onCheckedChanged: " + e.getMessage());
+ }
+ }
+ });
+ mViewDataBinding.swPowerOff.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ try {
+ mDeviceRestrictionManager.setPowerDisabled(mAdminName, isChecked);
+ } catch (Exception e) {
+ Log.e(TAG, "onCheckedChanged: " + e.getMessage());
+ }
+ }
+ });
+ mViewDataBinding.swMultiWindow.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ try {
+ mDeviceRestrictionManager.setMultiWindowDisabled(mAdminName, isChecked);
+ } catch (Exception e) {
+ Log.e(TAG, "onCheckedChanged: " + e.getMessage());
+ }
+ }
+ });
+ }
+
+ @Override
+ protected void initData() {
+
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ getAdminStatus();
+ }
+
+ private void getAdminStatus() {
+ if (isActiveMe()) {
+ mViewDataBinding.tvAdmin.setText("已激活");
+ mViewDataBinding.swWindow.setChecked(mDeviceRestrictionManager.isMultiWindowDisabled(mAdminName));
+ mViewDataBinding.swYoyo.setChecked(mDeviceRestrictionManager.isVoiceAssistantButtonDisabled(mAdminName));
+ mViewDataBinding.swRestore.setChecked(mDeviceSettingsManager.isRestoreFactoryDisabled(mAdminName));
+ mViewDataBinding.swUsbDebug.setChecked(mDeviceRestrictionManager.isUSBDataDisabled(mAdminName));
+ mViewDataBinding.swRemoveAdmin.setChecked(mDeviceControlManager.isForcedActiveDeviceAdmin(mAdminName));
+ mViewDataBinding.swExpandPanel.setChecked(mDeviceRestrictionManager.isStatusBarExpandPanelDisabled(mAdminName));
+ mViewDataBinding.swQuickTools.setChecked(mDevicePasswordManager.isQuickToolsDisabled(mAdminName));
+ mViewDataBinding.swPowerOff.setChecked(mDeviceRestrictionManager.isPowerDisabled(mAdminName));
+ mViewDataBinding.swMultiWindow.setChecked(mDeviceRestrictionManager.isMultiWindowDisabled(mAdminName));
+
+ } 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/edit/EditActivity.java b/app/src/main/java/com/xwad/os/activity/edit/EditActivity.java
index df8214e..e18a223 100644
--- a/app/src/main/java/com/xwad/os/activity/edit/EditActivity.java
+++ b/app/src/main/java/com/xwad/os/activity/edit/EditActivity.java
@@ -14,6 +14,7 @@ import com.xwad.os.base.mvvm.BaseMvvmActivity;
import com.xwad.os.config.CommonConfig;
import com.xwad.os.databinding.ActivityEditBinding;
import com.xwad.os.manager.DeviceSNManager;
+import com.xwad.os.mdm.AdminManager;
import com.xwad.os.utils.ActivationUtil;
import java.util.HashMap;
@@ -102,7 +103,7 @@ public class EditActivity extends BaseMvvmActivity params = new HashMap<>();
- params.put("sn", DeviceSNManager.getDeviceSN());
+ params.put("sn", AdminManager.getInstance().getSerial());
params.put(mKey, mViewDataBinding.editText.getText().toString());
mViewModel.updateInfo(params);
} else {
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 662a8bf..f7717b3 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
@@ -1,5 +1,6 @@
package com.xwad.os.activity.home;
+import android.app.admin.DevicePolicyManager;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
@@ -11,6 +12,7 @@ import android.content.res.Resources;
import android.os.BatteryManager;
import android.os.Build;
import android.os.Bundle;
+import android.os.Handler;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
@@ -21,6 +23,7 @@ import android.view.animation.TranslateAnimation;
import android.widget.Toast;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
@@ -28,6 +31,7 @@ import androidx.lifecycle.Observer;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.viewpager.widget.ViewPager;
+import com.hihonor.android.app.admin.DeviceControlManager;
import com.hjq.permissions.OnPermissionCallback;
import com.hjq.permissions.XXPermissions;
import com.hjq.toast.Toaster;
@@ -39,13 +43,17 @@ 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.AppInfo;
import com.xwad.os.bean.AppUpdateInfo;
+import com.xwad.os.bean.PhraseContent;
import com.xwad.os.bean.UserInfo;
import com.xwad.os.bean.jxw.TabBean;
import com.xwad.os.config.CommonConfig;
import com.xwad.os.databinding.ActivityHomeBinding;
import com.xwad.os.dialog.PermissionsDialog;
import com.xwad.os.dialog.PrivacyPolicyDialog;
+import com.xwad.os.eula.EulaDialog;
+import com.xwad.os.eula.EulaUtils;
import com.xwad.os.fragment.ai.AiFragment;
import com.xwad.os.fragment.app.AppFragment;
import com.xwad.os.fragment.chinese.ChineseFragment;
@@ -64,10 +72,13 @@ import com.xwad.os.jxw.fragment.SztzFragment;
import com.xwad.os.jxw.util.Util;
import com.xwad.os.manager.DeviceSNManager;
import com.xwad.os.mdm.AdminManager;
+import com.xwad.os.permission.PermissionUtils;
+import com.xwad.os.receiver.AoleDeviceAdminReceiver;
import com.xwad.os.service.main.MainService;
import com.xwad.os.utils.ActivationUtil;
import com.xwad.os.utils.ApkUtils;
import com.xwad.os.utils.DataUtil;
+import com.xwad.os.utils.JgyUtils;
import com.xwad.os.utils.OpenApkUtils;
import com.xwad.os.utils.Utils;
import com.xwad.os.view.jxw.widget.DefaultAppsDialog;
@@ -76,17 +87,48 @@ import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
+import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.ObservableOnSubscribe;
+import io.reactivex.rxjava3.disposables.Disposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
import me.jessyan.autosize.AutoSizeCompat;
import me.jessyan.autosize.AutoSizeConfig;
-public class HomeActivity extends BaseMvvmActivity {
+public class HomeActivity extends BaseMvvmActivity {
private static final String TAG = "HomeActivity";
private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
+ private static final int REQUEST_ENABLE = 4321;
+
+ private ArrayList forceAppList = new ArrayList() {{
+ this.add(BuildConfig.APPLICATION_ID);
+ }};
+
+ private ArrayList mPersistentApp=new ArrayList(){{
+ this.add(BuildConfig.APPLICATION_ID);
+ this.add("com.jxw.launcher");
+ this.add("com.jxw.zncd");
+ this.add("com.jxw.tbdd");
+ this.add("com.jxw.tbfd");
+ this.add("com.jxw.qkxx");
+ this.add("com.jxw.jpkc");
+ this.add("com.jxw.download");
+ this.add("com.jxw.jxw");
+ this.add("com.study.flashplayer");
+ this.add("com.jxw.question");
+ }};
+
+ private DevicePolicyManager mDevicePolicyManager;
+ private DeviceControlManager mDeviceControlManager;
+ private ComponentName mAdminName;
+ private EulaDialog mEulaDialog;
+
private List tabBeanLists = new ArrayList<>();
private List fragments = new ArrayList<>();
@@ -118,30 +160,30 @@ public class HomeActivity extends BaseMvvmActivity= Build.VERSION_CODES.O) {
+// startForegroundService(intent);
+// } else {
+// startService(intent);
+// }
if (Build.VERSION.SDK_INT >= 33) {
hideSystemUI();
@@ -163,49 +205,20 @@ public class HomeActivity 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 {
@@ -220,7 +233,7 @@ public class HomeActivity extends BaseMvvmActivity() {
@Override
public void onChanged(Boolean aBoolean) {
@@ -240,13 +253,395 @@ 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();
+ }
+
+ private void initViews() {
+ Log.e(TAG, "initViews: " );
+ long time = System.currentTimeMillis();
+
+ LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
+ linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
+ mViewDataBinding.rlTab.setLayoutManager(linearLayoutManager);
+
+ tabAdapter = new TabAdapter(tabBeanLists);
+ tabAdapter.setOnItemClickListener(new TabAdapter.RadiaoOnItemClickListener() {
+ @Override
+ public void onSelectClick(int i) {
+ tabAdapter.setChoosePosition(i);
+ mViewDataBinding.subjectViewPager.setCurrentItem(i);
+ }
+ });
+ mViewDataBinding.rlTab.setAdapter(tabAdapter);
+
+ mViewDataBinding.subjectViewPager.setOffscreenPageLimit(12);
+ mViewDataBinding.subjectViewPager.setScrollAnim(true);
+ mViewDataBinding.subjectViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
+ @Override
+ public void onPageScrollStateChanged(int i) {
+
+ }
+
+ @Override
+ public void onPageScrolled(int i, float f, int i2) {
+
+ }
+
+ @Override
+ public void onPageSelected(int i) {
+ tabAdapter.setChoosePosition(i);
+ mViewDataBinding.rlTab.scrollToPosition(i);
+ }
+ });
initDatas();
+ Log.e(TAG, "initViews: time = " + (System.currentTimeMillis() - time) + "ms");
+
}
+ /**
+ * 先判断用户协议,再判断mdm授权,然后判断应用权限
+ */
+ private void checkEula() {
+ EulaUtils eulaUtils = new EulaUtils();
+ boolean hasUserAccepted = eulaUtils.hasUserAccepted();
+ if (hasUserAccepted) {
+ checkActiveAdmin();
+ } else {
+ if (mEulaDialog == null) {
+ mEulaDialog = new EulaDialog(this, mDevicePolicyManager, mAdminName, new EulaDialog.EulaCallback() {
+ @Override
+ public void onGranted() {
+ checkActiveAdmin();
+ }
+
+ @Override
+ public void onDenied() {
+ finish();
+ }
+ });
+ }
+ mEulaDialog.show();
+ }
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ if (resultCode == RESULT_OK) {
+ if (requestCode == REQUEST_ENABLE) {
+ Log.e(TAG, "onActivityResult: " + REQUEST_ENABLE);
+ checkActiveAdmin();
+ }
+ }
+ }
+
+ private void checkActiveAdmin() {
+// Debug.waitForDebugger();
+ int controlMode = 0;
+ try {
+ controlMode = mDeviceControlManager.getControlMode(mAdminName);
+ } catch (Exception e) {
+ Log.e(TAG, "checkActiveAdmin: getControlMode Exception: " + e.getMessage());
+ }
+ Log.e(TAG, "checkActiveAdmin: controlMode = " + controlMode);
+ //判断管控模式
+ if (controlMode == 0) {
+ //0:普通模式走原生激活
+ if (!isActiveMe()) {
+ userActiveAdmin();
+ Log.e(TAG, "checkActiveAdmin: userActiveAdmin0");
+ } else {
+ userActiveAdmin();
+ setDefault();
+ Log.e(TAG, "checkActiveAdmin: setDefault0");
+ }
+ } else if (controlMode == 1) {
+ //1:管控模式静默激活
+ if (!isActiveMe()) {
+ forceActiveAdmin();
+ Log.e(TAG, "checkActiveAdmin: forceActiveAdmin1");
+ } else {
+ setDefault();
+ Log.e(TAG, "checkActiveAdmin: setDefault1");
+ }
+ }
+// Log.e(TAG, "checkActiveAdmin: removeActiveDeviceAdmin = " + mDeviceControlManager.removeActiveDeviceAdmin(mAdminName));
+// mDeviceControlManager.clearDeviceOwnerApp();
+ }
+
+ private void forceActiveAdmin() {
+ Toaster.show("请先激活设备");
+ try {
+// if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) {
+ //No virtual method setForcedActiveDeviceAdmin(Landroid/content/ComponentName;Landroid/content/Context;)
+ // Z in class Lcom/huawei/android/app/admin/DeviceControlManager;
+ // or its super classes (declaration of 'com.huawei.android.app.admin.DeviceControlManager' appears in /system/framework/hwframework.jar);
+
+ //先强制激活,如果不能则手动激活
+ boolean active = mDeviceControlManager.setForcedActiveDeviceAdmin(mAdminName, this);
+ Log.e(TAG, "forceActiveAdmin: " + "setForcedActiveDeviceAdmin = " + active);
+ if (!active) {
+ userActiveAdmin();
+ } else {
+
+ }
+// } else {
+// mDeviceControlManager.setForcedActiveDeviceAdmin(mAdminName, this);
+// Log.e(TAG, "forceActiveAdmin: " + "setForcedActiveDeviceAdmin = " + mDevicePolicyManager.isAdminActive(mAdminName));
+// if (!mDevicePolicyManager.isAdminActive(mAdminName)) {
+// userActiveAdmin();
+// }
+// }
+ } catch (NoSuchMethodError error) {
+ Log.e(TAG, "forceActiveAdmin: " + error.getMessage());
+ Toast.makeText(this, getString(R.string.not_support), Toast.LENGTH_SHORT).show();
+ userActiveAdmin();
+ } catch (SecurityException | IllegalArgumentException e) {
+ Log.e(TAG, "forceActiveAdmin: " + e.getMessage());
+ Toast.makeText(this, getString(R.string.force_active_error), Toast.LENGTH_LONG).show();
+ }
+ }
+
+ private void userActiveAdmin() {
+ Log.e(TAG, "userActiveAdmin: ");
+ //如果当前APK没有被设备管理激活,则先进行激活
+ if (mDevicePolicyManager != null && !mDevicePolicyManager.isAdminActive(mAdminName)) {
+ Log.e(TAG, "userActiveAdmin: " + "not Admin Active");
+ Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
+ intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mAdminName);
+ startActivityForResult(intent, REQUEST_ENABLE);
+ } else {
+ Log.e(TAG, "userActiveAdmin: " + "Admin Active");
+// try {
+// //为1时获取不了sn
+// mDeviceControlManager.setControlMode(mAdminName, 1);
+// } catch (Exception e) {
+// Log.e(TAG, "userActiveAdmin: setControlMode: " + e.getMessage());
+// }
+ try {
+ mDeviceControlManager.setForcedActiveDeviceAdmin(mAdminName, this);
+ Log.e(TAG, "userActiveAdmin: " + "setForcedActiveDeviceAdmin");
+ } catch (Exception e) {
+ Log.e(TAG, "userActiveAdmin: setForcedActiveDeviceAdmin: " + e.getMessage());
+ }
+ }
+ }
+
+ /**
+ * https://developer.honor.com/cn/docs/11015/guides/faq
+ * setDeviceOwnerApp不能登录账户
+ */
+ private void setDeviceOwnerApp() {
+ int sdk_int = Utils.getMagicOsVersion();
+ Log.e(TAG, "setDeviceOwnerApp: MagicOS Version = " + sdk_int);
+ if (sdk_int >= 26) {
+ //Magic UI 4.0 及以上
+ try {
+ mDeviceControlManager.setDeviceOwnerApp(mAdminName, getPackageName());
+ Log.e(TAG, "setDeviceOwnerApp: " + Utils.getSerial(HomeActivity.this));
+ Log.e(TAG, "setDeviceOwnerApp: successful1");
+ } catch (Exception e) {
+ if (e.getMessage().contains("accounts")) {
+ Toaster.showLong("设备激活失败,请退出账号");
+ Toaster.debugShow(e.getMessage());
+ }
+ Log.e(TAG, "setDeviceOwnerApp: " + e.getMessage());
+ }
+ } else {
+ // 反射调用setDeviceOwnerApp,激活Device Owner,MagicOS 7.0以上可以直接调用SDK里的对应方法
+ DeviceControlManager dcm = new DeviceControlManager();
+ try {
+ Method m = dcm.getClass().getDeclaredMethod("setDeviceOwnerApp", ComponentName.class, String.class);
+ if (m != null) {
+ m.invoke(dcm, mAdminName, getPackageName()); // componentName为APK的设备管理器组件
+ Log.e(TAG, "setDeviceOwnerApp successful2");
+ }
+ } catch (Exception e) {
+ Toaster.show("设备激活失败,请退出账号");
+ Log.e(TAG, "setDeviceOwnerApp error: " + e.toString());
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private void setDefault() {
+ Log.e(TAG, "setDefault: ");
+ AdminManager.init(this);
+ getPermission();
+ debugTest();
+ setDeviceOwnerApp();
+ setDisallowUninstall();
+ JgyUtils.getInstance().startServices();
+
+ long time = System.currentTimeMillis();
+
+ if (BuildConfig.DEBUG) {
+ boolean onUsb = AdminManager.getInstance().turnOnUsbDebugMode(true);
+// Toaster.show("打开usb: " + onUsb);
+ }
+ AdminManager.getInstance().setCustomSettingsMenu(mMenuList);
+ AdminManager.getInstance().setTimeAndDateSetDisabled(false);
+ AdminManager.getInstance().setPowerSaveModeDisabled(true);
+ AdminManager.getInstance().setSearchIndexDisabled(true);
+ AdminManager.getInstance().setSystemBrowserDisabled(false);
+ AdminManager.getInstance().setMultiWindowDisabled(true);
+ AdminManager.getInstance().setVoiceAssistantButtonDisabled(true);
+ AdminManager.getInstance().addAlertWindowApps(forceAppList);
+
+// AdminManager.getInstance().setRestoreFactoryDisabled(true);
+ AdminManager.getInstance().setDefaultLauncher("com.xwad.os");
+ AdminManager.getInstance().addIgnoreFrequentRelaunchAppList("com.xwad.os");
+ AdminManager.getInstance().addDisallowedRunningApp("com.hihonor.servicecenter");
+// AdminManager.getInstance().setStatusBarExpandPanelDisabled(true);
+ AdminManager.getInstance().setQuickToolsDisabled(true);
+
+ Log.e(TAG, "setDefault: time = " + (System.currentTimeMillis() - time) + "ms");
+ }
+
+ private static final List mMenuList = new ArrayList() {{
+ this.add("digital_balance");
+ this.add("smart_assistant");
+ this.add("users_accounts");
+ this.add("google");
+ this.add("backup_settings");
+ this.add("apps_honor_tips");
+ this.add("pengine_settings");
+ }};
+
+ private void getPermission() {
+ Log.e(TAG, "getPermission: ");
+ if (XXPermissions.isGranted(HomeActivity.this, PermissionUtils.PERMISSIONS)) {
+ initViews();
+ 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 {
+ initViews();
+ Log.e(TAG, "onGranted: " + "获取权限成功");
+ }
+ }
+
+ @Override
+ public void onDenied(List permissions, boolean never) {
+ if (never) {
+ Toaster.show("被永久拒绝授权,请手动授予权限");
+ // 如果是被永久拒绝就跳转到应用权限系统设置页面
+ XXPermissions.startPermissionActivity(HomeActivity.this, permissions);
+ } else {
+ Toaster.show("获取权限失败");
+ }
+ }
+ });
+ }
+ }
+
+ private void setDisallowUninstall() {
+ Observable.create((ObservableOnSubscribe) emitter -> {
+ Log.e("setDisallowUninstall", "subscribe: ");
+// //强制激活设备管理器
+// AdminManager.getInstance().setForcedActiveDeviceAdmin();
+ // 添加阻止某应用被卸载名单
+ AdminManager.getInstance().addDisallowedUninstallPackages(forceAppList);
+ Log.e(TAG, "setDisallowUninstall: getDisallowedUninstallPackageList: " + AdminManager.getInstance().getDisallowedUninstallPackageList());
+ // 添加保持某应用始终运行名单
+ AdminManager.getInstance().addPersistentApp(mPersistentApp);
+ Log.e(TAG, "setDisallowUninstall: getPersistentApp: " + AdminManager.getInstance().getPersistentApp());
+ //设置可信任应用列表
+ AdminManager.getInstance().removeSuperTrustListForHwSystemManger(AdminManager.getInstance().getSuperTrustListForHwSystemManger());
+ // TODO: 2026/1/13 有闪退但是没有报错信息
+// AdminManager.getInstance().setSuperTrustListForHwSystemManger(forceAppList);
+ Log.e(TAG, "setDisallowUninstall: getSuperTrustListForHwSystemManger = " + AdminManager.getInstance().getSuperTrustListForHwSystemManger());
+// AdminManager.getInstance().addDisabledDeactivateMdmPackages(forceAppList);
+ Log.e(TAG, "setDisallowUninstall: getSerial: " + Utils.getSerial(this));
+ AdminManager.getInstance().addInstallPackageDefaultTrustList(ApkUtils.mJxwApps);
+ emitter.onNext(1);
+ }).subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(new io.reactivex.rxjava3.core.Observer() {
+ @Override
+ public void onSubscribe(@NonNull Disposable d) {
+ Log.e("setDisallowUninstall", "onSubscribe: ");
+ }
+
+ @Override
+ public void onNext(@NonNull Integer integer) {
+ Log.e("setDisallowUninstall", "onNext: ");
+ }
+
+ @Override
+ public void onError(@NonNull Throwable e) {
+ Log.e("setDisallowUninstall", "onError: " + e.getMessage());
+ }
+
+ @Override
+ public void onComplete() {
+ Log.e("setDisallowUninstall", "onComplete: ");
+ }
+ });
+ }
+
+ private void debugTest() {
+ if (BuildConfig.DEBUG) {
+ Log.e(TAG, "debugTest: " + AdminManager.getInstance().getSerial());
+ Log.e(TAG, "debugTest: " + Utils.getSerial(this));
+ Log.e(TAG, "debugTest: " + Utils.getAndroid10MAC(this));
+ }
+ }
+
+ // 激活
+ private void activeLicense() {
+// hemInstance.activeLicense();
+ }
+
+ // 去激活
+ private void deActiveLicense() {
+// hemInstance.deActiveLicense();
+ }
+
+ /**
+ * 判断是否激活
+ *
+ * @return
+ */
+ private boolean isActiveMe() {
+ boolean active;
+ if (mDevicePolicyManager == null) {
+ active = false;
+ } else {
+ active = mDevicePolicyManager.isAdminActive(mAdminName);
+ }
+ Log.e(TAG, "isActiveMe: active = " + active);
+ return active;
+ }
+
+
@Subscribe(threadMode = ThreadMode.MAIN)
public void onGkNoticeEvent(UpdateGradeEvent updateGradeEvent) {
Log.e(TAG, "onGkNoticeEvent: ");
@@ -407,19 +802,17 @@ public class HomeActivity extends BaseMvvmActivity>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
@@ -126,22 +130,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);
@@ -150,8 +154,8 @@ public class HomeViewModel extends BaseViewModel() {
@Override
public void onSubscribe(@NonNull Disposable d) {
@@ -357,4 +362,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/LoginViewModel.java b/app/src/main/java/com/xwad/os/activity/login/LoginViewModel.java
index fe89b12..2a9bfed 100644
--- a/app/src/main/java/com/xwad/os/activity/login/LoginViewModel.java
+++ b/app/src/main/java/com/xwad/os/activity/login/LoginViewModel.java
@@ -93,7 +93,8 @@ public class LoginViewModel extends BaseViewModel 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);
@@ -145,8 +147,8 @@ public class MainViewModel extends BaseViewModel params = new HashMap<>();
- params.put("sn", DeviceSNManager.getDeviceSN());
+ params.put("sn", AdminManager.getInstance().getSerial());
params.put("sn_grade", grade);
mViewModel.updateInfo(params);
} else {
diff --git a/app/src/main/java/com/xwad/os/activity/update/UpdateActivity.java b/app/src/main/java/com/xwad/os/activity/update/UpdateActivity.java
index d866447..eb1c25f 100644
--- a/app/src/main/java/com/xwad/os/activity/update/UpdateActivity.java
+++ b/app/src/main/java/com/xwad/os/activity/update/UpdateActivity.java
@@ -9,6 +9,7 @@ import com.arialyy.aria.core.download.DownloadEntity;
import com.hjq.toast.Toaster;
import com.xwad.os.R;
import com.xwad.os.base.mvvm.BaseMvvmActivity;
+import com.xwad.os.bean.AppInfo;
import com.xwad.os.bean.AppUpdateInfo;
import com.xwad.os.databinding.ActivityUpdateBinding;
import com.xwad.os.service.DownloadService;
@@ -18,7 +19,7 @@ import static com.arialyy.aria.core.inf.IEntity.STATE_RUNNING;
public class UpdateActivity extends BaseMvvmActivity {
- private AppUpdateInfo mAppInfoData;
+ private AppInfo mAppInfoData;
@Override
@@ -42,14 +43,14 @@ public class UpdateActivity 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 {
@@ -193,6 +203,68 @@ 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);
@@ -286,7 +358,7 @@ public class UserActivity extends BaseMvvmActivity params = new HashMap<>();
- params.put("sn", NetInterfaceManager.convertToJsonRequestBody(DeviceSNManager.getDeviceSN()));
+ params.put("sn", NetInterfaceManager.convertToJsonRequestBody(AdminManager.getInstance().getSerial()));
mViewModel.updateAvatar(params, body);
} else {
mMMKV.encode(CommonConfig.UIUI_USER_AVATAR_KEY, avatarFilePath);
@@ -341,6 +413,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);
@@ -92,8 +93,8 @@ public class UserViewModel extends BaseViewModel {
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) {
@@ -104,6 +104,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;
diff --git a/app/src/main/java/com/xwad/os/base/BaseAlertDialogBuilder.java b/app/src/main/java/com/xwad/os/base/BaseAlertDialogBuilder.java
new file mode 100644
index 0000000..60268f6
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/base/BaseAlertDialogBuilder.java
@@ -0,0 +1,50 @@
+package com.xwad.os.base;
+
+import android.content.Context;
+import android.content.ContextWrapper;
+import android.content.res.Resources;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AlertDialog;
+
+import com.xwad.os.utils.ScreenUtils;
+
+import me.jessyan.autosize.AutoSizeCompat;
+
+public class BaseAlertDialogBuilder extends AlertDialog.Builder {
+
+ /**
+ *
+ */
+ public static final float ALERT_BASE_WIDTH = 480f;
+ public static final float ALERT_BASE_WIDTH_TABLE = 640f;
+
+ public BaseAlertDialogBuilder(@NonNull Context context) {
+ super(adjustAutoSize(context));
+ }
+
+ public BaseAlertDialogBuilder(@NonNull Context context, int themeResId) {
+ super(adjustAutoSize(context), themeResId);
+ }
+
+ private static Context adjustAutoSize(Context context) {
+ return new ContextWrapper(context) {
+ private Resources mResources;
+
+ {
+ Resources oldResources = super.getResources();
+ mResources = new Resources(oldResources.getAssets(), oldResources.getDisplayMetrics(), oldResources.getConfiguration());
+ }
+
+ @Override
+ public Resources getResources() {
+ if (ScreenUtils.isTablet(context)) {
+ AutoSizeCompat.autoConvertDensityBaseOnWidth(mResources, ALERT_BASE_WIDTH_TABLE);
+ } else {
+ AutoSizeCompat.autoConvertDensityBaseOnWidth(mResources, ALERT_BASE_WIDTH);
+ }
+ return mResources;
+ }
+ };
+ }
+}
diff --git a/app/src/main/java/com/xwad/os/base/BaseApplication.java b/app/src/main/java/com/xwad/os/base/BaseApplication.java
index 1976e2c..51104a3 100644
--- a/app/src/main/java/com/xwad/os/base/BaseApplication.java
+++ b/app/src/main/java/com/xwad/os/base/BaseApplication.java
@@ -20,10 +20,11 @@ import com.tencent.bugly.crashreport.CrashReport;
import com.tencent.mmkv.MMKV;
import com.xwad.os.BuildConfig;
import com.xwad.os.alarm.AlarmUtils;
+import com.xwad.os.config.CommonConfig;
import com.xwad.os.manager.AmapManager;
import com.xwad.os.manager.AppManager;
import com.xwad.os.manager.ConnectManager;
-import com.xwad.os.manager.DeviceSNManager;
+import com.xwad.os.manager.ControlManager;
import com.xwad.os.mdm.AdminManager;
import com.xwad.os.network.NetInterfaceManager;
import com.xwad.os.push.PushManager;
@@ -37,6 +38,7 @@ import com.xwad.os.utils.SystemUtils;
public class BaseApplication extends Application {
private static final String TAG = "BaseApplication";
+
/**
* ViewModel中因为经常旋转导致弱引用为空
*/
@@ -86,7 +88,7 @@ public class BaseApplication extends Application {
AdminManager.init(this);
CrashReport.initCrashReport(getApplicationContext(), "4efcaad4c9", false);
- CrashReport.setDeviceId(BaseApplication.this, DeviceSNManager.getDeviceSN());
+ CrashReport.setDeviceId(BaseApplication.this, AdminManager.getInstance().getSerial());
// 初始化 Toast 框架
Toaster.init(this);
@@ -98,6 +100,7 @@ public class BaseApplication extends Application {
AppUsedTimeUtils.init(this);
OpenApkUtils.init(this);
ConnectManager.init(this);
+ ControlManager.init(this);
NetInterfaceManager.init(this);
// startService(new Intent(this, MainService.class));
registAppReceive();
@@ -114,12 +117,13 @@ public class BaseApplication extends Application {
public void aliyunPushInit() {
PushServiceFactory.init(this);
final CloudPushService pushService = PushServiceFactory.getCloudPushService();
- pushService.setLogLevel(CloudPushService.LOG_DEBUG);
+ pushService.setLogLevel(CloudPushService.LOG_OFF);
pushService.register(this, new CommonCallback() {
@Override
public void onSuccess(String response) {
Log.e("AliyunPush", "init cloudchannel success");
Log.e("AliyunPush", "init cloudchannel success " + pushService.getDeviceId());
+ MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE).encode(CommonConfig.ALIYUN_PUSH_ID, pushService.getDeviceId());
}
@Override
diff --git a/app/src/main/java/com/xwad/os/bean/AppUploadInfo.java b/app/src/main/java/com/xwad/os/bean/AppUploadInfo.java
new file mode 100644
index 0000000..fe23619
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/bean/AppUploadInfo.java
@@ -0,0 +1,91 @@
+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 AppUploadInfo implements Serializable {
+ private static final long serialVersionUID = -6920148363520647811L;
+
+ String app_name;
+ String app_package;
+ String app_version_name;
+ long app_version_code;
+ long firstInstallTime;
+ long lastUpdateTime;
+ long app_size;
+ int source;
+
+ 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 getApp_version_name() {
+ return app_version_name;
+ }
+
+ public void setApp_version_name(String app_version_name) {
+ this.app_version_name = app_version_name;
+ }
+
+ public long getApp_version_code() {
+ return app_version_code;
+ }
+
+ public void setApp_version_code(long app_version_code) {
+ this.app_version_code = app_version_code;
+ }
+
+ public long getFirstInstallTime() {
+ return firstInstallTime;
+ }
+
+ public void setFirstInstallTime(long firstInstallTime) {
+ this.firstInstallTime = firstInstallTime;
+ }
+
+ public long getLastUpdateTime() {
+ return lastUpdateTime;
+ }
+
+ public void setLastUpdateTime(long lastUpdateTime) {
+ this.lastUpdateTime = lastUpdateTime;
+ }
+
+ public long getApp_size() {
+ return app_size;
+ }
+
+ public void setApp_size(long app_size) {
+ this.app_size = app_size;
+ }
+
+ public int getSource() {
+ return source;
+ }
+
+ public void setSource(int source) {
+ this.source = source;
+ }
+
+ @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/IsActivationBean.java b/app/src/main/java/com/xwad/os/bean/IsActivationBean.java
new file mode 100644
index 0000000..d5c6f82
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/bean/IsActivationBean.java
@@ -0,0 +1,78 @@
+package com.xwad.os.bean;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class IsActivationBean implements Serializable {
+ private static final long serialVersionUID = 930211633376920464L;
+
+ //是否激活 0否1是
+ int is_activation;
+ //
+ String code;
+ //激活码类型 0体验卡 1正式
+ int code_type;
+ //体验到期时间戳 单位秒 0代表没有时间限制
+ long expire_time;
+ //激活时间
+ long activation_time;
+
+ List 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/TimeControl.java b/app/src/main/java/com/xwad/os/bean/TimeControl.java
new file mode 100644
index 0000000..f318bb0
--- /dev/null
+++ b/app/src/main/java/com/xwad/os/bean/TimeControl.java
@@ -0,0 +1,53 @@
+package com.xwad.os.bean;
+
+import java.io.Serializable;
+
+public class TimeControl implements Serializable {
+ private static final long serialVersionUID = 8400702243953866327L;
+
+ int id;
+ int user_id;
+ String sn;
+ String start_time;
+ String end_time;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public int getUser_id() {
+ return user_id;
+ }
+
+ public void setUser_id(int user_id) {
+ this.user_id = user_id;
+ }
+
+ public String getSn() {
+ return sn;
+ }
+
+ public void setSn(String sn) {
+ this.sn = sn;
+ }
+
+ public String getStart_time() {
+ return start_time;
+ }
+
+ public void setStart_time(String start_time) {
+ this.start_time = start_time;
+ }
+
+ public String getEnd_time() {
+ return end_time;
+ }
+
+ public void setEnd_time(String end_time) {
+ this.end_time = end_time;
+ }
+}
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/config/CommonConfig.java b/app/src/main/java/com/xwad/os/config/CommonConfig.java
index efb691d..715c9fd 100644
--- a/app/src/main/java/com/xwad/os/config/CommonConfig.java
+++ b/app/src/main/java/com/xwad/os/config/CommonConfig.java
@@ -5,6 +5,8 @@ public class CommonConfig {
public static final String CLOUD_LESSON_SETTINGS_KEY = "cloud_lesson_settings_key";
+ public static final String ALIYUN_PUSH_ID = "aliyun_push_id_key";
+
@Deprecated
public static final String isLogined = "isLogined";
public static final String AES_KEY = "xqdep8exnafpef3d";
@@ -12,6 +14,9 @@ public class CommonConfig {
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";
+ public static final String SUPER_PASSWORD = "0728";
+
/*保存个人基本信息*/
/*性别*/
public static final String UIUI_USER_GENDER_KEY = "USER_INFO_GENDER";
@@ -42,6 +47,8 @@ public class CommonConfig {
public static final String ACTIVATIONBEAN_CODE_KEY = "UIUI_ACTIVATIONBEAN_CODE";
public static final String INSTALL_SD_APKS = "install_sd_apks";
+ /*是否显示通知栏,以及增强模式*/
+ public static final String NOTIFY_BAR_SHOW_KEY = "is_notify_bar_show_key";
/*是否显示返回Android按钮*/
public static final String UIUI_RETURN_ANDROID_KEY = "iflytek_uiui_is_return_android";
@@ -53,8 +60,18 @@ public class CommonConfig {
public static final String MAP_LONGITUDE_KEY = "map_longitude_key";
public static final String MAP_LATITUDE_KEY = "map_latitude_key";
public static final String MAP_ADDRESS_KEY = "map_address_key";
+ public static final String MAP_PROVINCE_KEY = "map_province_key";
+ public static final String MAP_CITY_KEY = "map_city_key";
+ public static final String MAP_DISTRICT_KEY = "map_district_key";
+ public static final String MAP_STREET_KEY = "map_street_key";
+ public static final String MAP_LOCATION_DESCRIBE_KEY = "map_locationDescribe_key";
public static final String MAP_ERROR_KEY = "map_error_key";
+ public static final String MAP_onLocationChanged_time_KEY = "map_onLocationChanged_time_key";
+
+ 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";
@@ -100,4 +117,32 @@ public class CommonConfig {
public static final String NOTI_BAR_PERMANENT_ACTION = "notification_bar_permanent_action";
/*是否允许通知*/
public static final String ALLOW_NOTIFICATION = "allow_notification";
+
+ /*默认桌面key*/
+ public final static String DESKTOP_APP_KEY = "desktop_app_key";
+ public final static String BROWSER_APP_KEY = "browser_app_key";
+ public final static String TYPEWRITING_APP_KEY = "typewriting_app_key";
+
+ /**
+ * 管控系统指令
+ */
+
+ /*USB模式-充电*/
+ public final static String AOLE_ACTION_USB_USB_CHARGE = "aole_action_usb_usb_charge";
+ /*USB模式-MTP*/
+ public final static String AOLE_ACTION_USB_USB_MTP = "aole_action_usb_usb_mtp";
+ /*USB模式-MIDI*/
+ public final static String AOLE_ACTION_USB_USB_MIDI = "aole_action_usb_usb_midi";
+
+ /*应用安装白名单总开关*/
+ public final static String AOLE_APP_ALLOW_INSTALL = "aole_app_allow_install";
+ /*应用安装白名单*/
+ public final static String AOLE_ACTION_APP_FORBID = "aole_app_forbid";
+ /*强制安装应用,禁止卸载*/
+ public final static String AOLE_ACTION_FORCE_APP = "aole_force_app";
+
+ /*应用ID管控*/
+ 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/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/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
diff --git a/build.gradle b/build.gradle
index 273241b..6f98d77 100644
--- a/build.gradle
+++ b/build.gradle
@@ -44,6 +44,6 @@ allprojects {
}
}
-task clean(type: Delete) {
- delete rootProject.buildDir
-}
+//task clean(type: Delete) {
+// delete rootProject.buildDir
+//}