diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..6aff598 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,5 @@ +# AGENTS.md — ElderlyDialerMdm + +本文件是 `ElderlyDialerMdm/` 工程的 **AI 协作规则与开发规范** +## 1.所有ai生成的临时文件全部放在app/build/temp 目录下 +## 2.所有实现IMdmManager接口的类,在调用以Manager结尾的类的方法时,都要加入try-catch块,防止异常 diff --git a/app/build.gradle b/app/build.gradle index bf65523..e6fa155 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,9 +37,6 @@ android { //选择要添加的对应 cpu 类型的 .so 库。 abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86' } - - buildConfigField "String", "platform", '"honor"' - } compileOptions { @@ -53,6 +50,25 @@ android { aidl true } + // 平台维度:honor(荣耀 MagicOS)/ huawei(华为 MDM Kit)/ emui(华为 EMUI) + flavorDimensions "platform" + productFlavors { + honor { + dimension "platform" + versionNameSuffix "_honor" + buildConfigField "String", "PLATFORM", '"honor"' + } + huawei { + dimension "platform" + versionNameSuffix "_huawei" + buildConfigField "String", "PLATFORM", '"huawei"' + } + emui { + dimension "platform" + versionNameSuffix "_emui" + buildConfigField "String", "PLATFORM", '"emui"' + } + } buildTypes { debug { @@ -73,17 +89,27 @@ android { applicationVariants.all { variant -> variant.outputs.each { output -> def buildType = variant.buildType.name + def flavorName = variant.flavorName if (buildType.contains("debug")) { - output.outputFileName = "app_debug.apk" + output.outputFileName = "app_${flavorName}_debug.apk" } else { - output.outputFileName = "${appName()}_${variant.versionCode}_V${variant.versionName}_${releaseTime()}_${buildType}.apk" + output.outputFileName = "${appName()}_${flavorName}_${variant.versionCode}_V${variant.versionName}_${releaseTime()}_${buildType}.apk" } } } } dependencies { - compileOnly files('libs/magic-android-34.38.1.200.jar') + // 荣耀 MDM SDK(compileOnly,仅编译期) + honorCompileOnly files('libs/magic-android-34.38.1.200.jar') + + // 华为 MDM Kit(compileOnly,仅编译期) + huaweiCompileOnly 'com.huawei.mdm:mdmkit:11.1.0.300' + // 华为 HEM License SDK(可选,需要授权校验时放开) + //huaweiImplementation 'com.huawei.hms:hemsdk:1.0.4.303' + + // 华为 EMUI MDM SDK(compileOnly,仅编译期) + emuiCompileOnly files('libs/hw_emui_11.0.1_20210408.jar') implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' diff --git a/app/libs/hw_emui_11.0.1_20210408.jar b/app/libs/hw_emui_11.0.1_20210408.jar new file mode 100644 index 0000000..22637d7 Binary files /dev/null and b/app/libs/hw_emui_11.0.1_20210408.jar differ diff --git a/app/src/emui/AndroidManifest.xml b/app/src/emui/AndroidManifest.xml new file mode 100644 index 0000000..5792e1a --- /dev/null +++ b/app/src/emui/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/emui/java/com/ttstd/sn/mdm/AdminManager.java b/app/src/emui/java/com/ttstd/sn/mdm/AdminManager.java new file mode 100644 index 0000000..665f602 --- /dev/null +++ b/app/src/emui/java/com/ttstd/sn/mdm/AdminManager.java @@ -0,0 +1,410 @@ +package com.ttstd.sn.mdm; + +import android.annotation.SuppressLint; +import android.app.admin.DevicePolicyManager; +import android.content.ComponentName; +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.Build; +import android.text.TextUtils; +import android.util.Log; + +import com.huawei.android.app.admin.DeviceApplicationManager; +import com.huawei.android.app.admin.DeviceControlManager; +import com.huawei.android.app.admin.DevicePackageManager; +import com.huawei.android.app.admin.DevicePasswordManager; +import com.huawei.android.app.admin.DeviceRestrictionManager; +import com.huawei.android.app.admin.DeviceSettingsManager; +import com.ttstd.sn.receiver.AoleDeviceAdminReceiver; + +import java.util.ArrayList; +import java.util.List; + +/** + * 华为 EMUI MDM 实现。 + * + *

依赖 hw_emui_11.0.1_20210408.jar(com.huawei.android.app.admin.*),仅存在于 emui flavor。

+ */ +public class AdminManager implements IMdmManager { + private static final String TAG = "AdminManager[emui]"; + + @SuppressLint("StaticFieldLeak") + private static AdminManager sInstance; + + private Context mContext; + private ComponentName mAdminName; + private DevicePolicyManager mDevicePolicyManager; + /*设备应用程序管理类*/ + private DeviceApplicationManager mDeviceApplicationManager; + /*设备控制相关的类*/ + private DeviceControlManager mDeviceControlManager; + /*设备包管理类*/ + private DevicePackageManager mDevicePackageManager; + /*密码相关类*/ + private DevicePasswordManager mDevicePasswordManager; + /*禁用/启用管理类*/ + private DeviceRestrictionManager mDeviceRestrictionManager; + /*设置相关类*/ + private DeviceSettingsManager mDeviceSettingsManager; + + private AdminManager(Context context) { + if (context == null) { + throw new RuntimeException("Context is NULL"); + } + this.mContext = context; + this.mAdminName = new ComponentName(context, AoleDeviceAdminReceiver.class); + this.mDevicePolicyManager = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); + this.mDeviceApplicationManager = new DeviceApplicationManager(); + this.mDeviceControlManager = new DeviceControlManager(); + this.mDevicePackageManager = new DevicePackageManager(); + this.mDevicePasswordManager = new DevicePasswordManager(); + this.mDeviceRestrictionManager = new DeviceRestrictionManager(); + this.mDeviceSettingsManager = new DeviceSettingsManager(); + removeTrustList(); + } + + public static void init(Context context) { + if (sInstance == null) { + Log.e(TAG, "init: "); + sInstance = new AdminManager(context); + } + } + + public static AdminManager getInstance() { + if (sInstance == null) { + throw new IllegalStateException("You must be init AdminManager first"); + } + return sInstance; + } + + /*============================== 基础能力 ==============================*/ + + @Override + public ComponentName getAdminName() { + return mAdminName; + } + + @Override + public boolean isActiveMe() { + if (mDevicePolicyManager == null) { + return false; + } else { + return mDevicePolicyManager.isAdminActive(mAdminName); + } + } + + @Override + public String getSerial() { + String sn = ""; + DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + try { + dpm.setPermissionPolicy(mAdminName, DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED); + } catch (Exception e) { + Log.e(TAG, "getSerial: " + e.getMessage()); + } + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + try { + sn = Build.getSerial(); + } catch (Exception e) { + Log.e(TAG, "getSerial: " + e.getMessage()); + } + } + // 未获取到 MDM 权限时,Build.getSerial() 可能返回 "unknown", + // 此时传 "" 给接口,避免获取到不属于本设备的配置 + if ("unknown".equalsIgnoreCase(sn)) { + sn = ""; + } + return sn; + } + + /*============================== 应用管理 ==============================*/ + + /** + * 添加阻止某应用启动运行名单(DeviceApplicationManager) + */ + @Override + public void addDisallowedRunningApp(String pkg) { + if (TextUtils.isEmpty(pkg)) return; + List packageList = new ArrayList<>(); + packageList.add(pkg); + try { + mDeviceApplicationManager.addDisallowedRunningApp(mAdminName, packageList); + } catch (Exception e) { + Log.e(TAG, "addDisallowedRunningApp: " + e.getMessage()); + } + } + + /** + * 删除阻止某应用启动运行名单(DeviceApplicationManager) + */ + @Override + public void removeDisallowedRunningApp(String pkg) { + if (TextUtils.isEmpty(pkg)) return; + List stringList = new ArrayList<>(); + stringList.add(pkg); + try { + mDeviceApplicationManager.removeDisallowedRunningApp(mAdminName, stringList); + } catch (Exception e) { + Log.e(TAG, "removeDisallowedRunningApp: " + e.getMessage()); + } + } + + /*============================== 系统限制 ==============================*/ + + @Override + public void setMultiWindowDisabled(boolean disabled) { + try { + mDeviceRestrictionManager.setMultiWindowDisabled(mAdminName, disabled); + } catch (Exception e) { + Log.e(TAG, "setMultiWindowDisabled: " + e.getMessage()); + } + } + + @Override + public boolean isMultiWindowDisabled() { + try { + return mDeviceRestrictionManager.isMultiWindowDisabled(mAdminName); + } catch (Exception e) { + Log.e(TAG, "isMultiWindowDisabled: " + e.getMessage()); + } + return false; + } + + @Override + public void setVoiceAssistantButtonDisabled(boolean disabled) { + try { + mDeviceRestrictionManager.setVoiceAssistantButtonDisabled(mAdminName, disabled); + } catch (Exception e) { + Log.e(TAG, "setVoiceAssistantButtonDisabled: " + e.getMessage()); + } + } + + @Override + public boolean isVoiceAssistantButtonDisabled() { + try { + return mDeviceRestrictionManager.isVoiceAssistantButtonDisabled(mAdminName); + } catch (Exception e) { + Log.e(TAG, "isVoiceAssistantButtonDisabled: " + e.getMessage()); + } + return false; + } + + @Override + public void setUSBDataDisabled(boolean disabled) { + try { + mDeviceRestrictionManager.setUSBDataDisabled(mAdminName, disabled); + } catch (Exception e) { + Log.e(TAG, "setUSBDataDisabled: " + e.getMessage()); + } + } + + @Override + public boolean isUSBDataDisabled() { + try { + return mDeviceRestrictionManager.isUSBDataDisabled(mAdminName); + } catch (Exception e) { + Log.e(TAG, "isUSBDataDisabled: " + e.getMessage()); + return false; + } + } + + /*============================== 设备设置 ==============================*/ + + @Override + public boolean setRestoreFactoryDisabled(boolean disabled) { + try { + return mDeviceSettingsManager.setRestoreFactoryDisabled(mAdminName, disabled); + } catch (Exception e) { + Log.e(TAG, "setRestoreFactoryDisabled: " + e.getMessage()); + } + return false; + } + + @Override + public boolean isRestoreFactoryDisabled() { + try { + return mDeviceSettingsManager.isRestoreFactoryDisabled(mAdminName); + } catch (Exception e) { + Log.e(TAG, "isRestoreFactoryDisabled: " + e.getMessage()); + } + return false; + } + + /*============================== 快捷工具 ==============================*/ + + @Override + public void setQuickToolsDisabled(boolean disabled) { + try { + mDevicePasswordManager.setQuickToolsDisabled(mAdminName, disabled); + } catch (Exception e) { + Log.e(TAG, "setQuickToolsDisabled: " + e.getMessage()); + } + } + + @Override + public boolean isQuickToolsDisabled() { + try { + return mDevicePasswordManager.isQuickToolsDisabled(mAdminName); + } catch (Exception e) { + Log.e(TAG, "isQuickToolsDisabled: " + e.getMessage()); + } + return false; + } + + /*============================== 设备控制 ==============================*/ + + @Override + public void turnOnUsbDebugMode(boolean on) { + try { + mDeviceControlManager.turnOnUsbDebugMode(mAdminName, on); + } catch (Exception e) { + Log.e(TAG, "turnOnUsbDebugMode: " + e.getMessage()); + } + } + + @Override + public void setForcedActiveDeviceAdmin(Context activity) { + try { + mDeviceControlManager.setForcedActiveDeviceAdmin(mAdminName, activity); + } catch (Exception e) { + Log.e(TAG, "setForcedActiveDeviceAdmin: " + e.getMessage()); + } + } + + @Override + public void removeActiveDeviceAdmin() { + try { + mDeviceControlManager.removeActiveDeviceAdmin(mAdminName); + } catch (Exception e) { + Log.e(TAG, "removeActiveDeviceAdmin: " + e.getMessage()); + } + } + + @Override + public void clearDeviceOwnerApp() { + try { + mDeviceControlManager.clearDeviceOwnerApp(); + } catch (Exception e) { + Log.e(TAG, "clearDeviceOwnerApp: " + e.getMessage()); + } + } + + @Override + public boolean isForcedActiveDeviceAdmin() { + try { + return mDeviceControlManager.isForcedActiveDeviceAdmin(mAdminName); + } catch (Exception e) { + Log.e(TAG, "isForcedActiveDeviceAdmin: " + e.getMessage()); + } + return false; + } + + /*============================== 平台差异 ==============================*/ + + /** + * 禁用/启用 YOYO 助手(EMUI 平台映射为 HiVoice 语音助手) + */ + @Override + public void setYoyoDisabled(boolean disable) { + Log.e(TAG, "setYoyoDisabled: " + disable + " (emui use voice assistant)"); + setVoiceAssistantButtonDisabled(disable); + } + + /*============================== EMUI 特有能力 ==============================*/ + + /** + * 静默激活设备管理员(DeviceControlManager) + */ + public void setSilentActiveAdmin() { + try { + mDeviceControlManager.setSilentActiveAdmin(mAdminName); + } catch (Exception e) { + Log.e(TAG, "setSilentActiveAdmin: " + e.getMessage()); + } + } + + /** + * 设置管控模式(DeviceControlManager) + * + * @param mode {@link DeviceControlManager#CONTROL_MODE} 或 {@link DeviceControlManager#RELEASE_MODE} + */ + public boolean setControlMode(int mode) { + try { + return mDeviceControlManager.setControlMode(mAdminName, mode); + } catch (Exception e) { + Log.e(TAG, "setControlMode: " + e.getMessage()); + } + return false; + } + + /** + * 获取当前管控模式(DeviceControlManager) + */ + public int getControlMode() { + try { + return mDeviceControlManager.getControlMode(mAdminName); + } catch (Exception e) { + Log.e(TAG, "getControlMode: " + e.getMessage()); + } + return DeviceControlManager.NORMAL_MODE; + } + + /** + * 开启/关闭护眼模式(DeviceControlManager) + */ + public boolean turnOnEyeComfort(boolean on) { + try { + return mDeviceControlManager.turnOnEyeComfort(mAdminName, on); + } catch (Exception e) { + Log.e(TAG, "turnOnEyeComfort: " + e.getMessage()); + } + return false; + } + + /** + * 查询护眼模式是否开启(DeviceControlManager) + */ + public boolean isEyeComfortTurnedOn() { + try { + return mDeviceControlManager.isEyeComfortTurnedOn(mAdminName); + } catch (Exception e) { + Log.e(TAG, "isEyeComfortTurnedOn: " + e.getMessage()); + } + return false; + } + + /*============================== 初始化辅助 ==============================*/ + + /** + * 移除安装白名单(构造时调用,清理历史白名单配置) + */ + public void removeTrustList() { + try { + List trustList = mDevicePackageManager.getInstallPackageWhiteList(mAdminName); + Log.e(TAG, "removeTrustList: " + trustList); + if (trustList != null && trustList.size() != 0) { + mDevicePackageManager.removeInstallPackageWhiteList(mAdminName, trustList); + } + } catch (Exception e) { + Log.e(TAG, "removeTrustList: " + e.getMessage()); + } + } + + /** + * 判断应用是否已安装 + */ + private boolean isAvailable(Context context, String pkg) { + if (TextUtils.isEmpty(pkg)) return false; + try { + PackageManager pm = context.getPackageManager(); + pm.getPackageInfo(pkg, 0); + return true; + } catch (PackageManager.NameNotFoundException e) { + return false; + } catch (Exception e) { + return false; + } + } +} diff --git a/app/src/honor/AndroidManifest.xml b/app/src/honor/AndroidManifest.xml new file mode 100644 index 0000000..1e775a6 --- /dev/null +++ b/app/src/honor/AndroidManifest.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/honor/java/com/ttstd/sn/mdm/AdminManager.java b/app/src/honor/java/com/ttstd/sn/mdm/AdminManager.java new file mode 100644 index 0000000..a7c4665 --- /dev/null +++ b/app/src/honor/java/com/ttstd/sn/mdm/AdminManager.java @@ -0,0 +1,339 @@ +package com.ttstd.sn.mdm; + +import android.annotation.SuppressLint; +import android.app.admin.DevicePolicyManager; +import android.content.ComponentName; +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.Build; +import android.text.TextUtils; +import android.util.Log; + +import com.hihonor.android.app.admin.DeviceApplicationManager; +import com.hihonor.android.app.admin.DeviceControlManager; +import com.hihonor.android.app.admin.DevicePasswordManager; +import com.hihonor.android.app.admin.DeviceRestrictionManager; +import com.hihonor.android.app.admin.DeviceSettingsManager; +import com.ttstd.sn.receiver.AoleDeviceAdminReceiver; + +import java.util.ArrayList; +import java.util.List; + +/** + * 荣耀 MagicOS MDM 实现。 + * + *

依赖 magic-android SDK(com.hihonor.android.app.admin.*),仅存在于 honor flavor。

+ */ +public class AdminManager implements IMdmManager { + private static final String TAG = "AdminManager[honor]"; + + @SuppressLint("StaticFieldLeak") + private static AdminManager sInstance; + + private Context mContext; + private ComponentName mAdminName; + private DevicePolicyManager mDevicePolicyManager; + /*设备应用程序管理类*/ + private DeviceApplicationManager mDeviceApplicationManager; + /*设备控制相关的类*/ + private DeviceControlManager mDeviceControlManager; + /*密码相关类*/ + private DevicePasswordManager mDevicePasswordManager; + /*禁用/启用管理类*/ + private DeviceRestrictionManager mDeviceRestrictionManager; + /*设置相关类*/ + private DeviceSettingsManager mDeviceSettingsManager; + + private AdminManager(Context context) { + if (context == null) { + throw new RuntimeException("Context is NULL"); + } + this.mContext = context; + this.mAdminName = new ComponentName(context, AoleDeviceAdminReceiver.class); + this.mDevicePolicyManager = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); + this.mDeviceApplicationManager = new DeviceApplicationManager(); + this.mDeviceControlManager = new DeviceControlManager(); + this.mDevicePasswordManager = new DevicePasswordManager(); + this.mDeviceRestrictionManager = new DeviceRestrictionManager(); + this.mDeviceSettingsManager = new DeviceSettingsManager(); + + Log.e(TAG, "AdminManager: isActiveMe = " + isActiveMe()); + if (isActiveMe()) { + setYoyoDisabled(true); + } + } + + public static void init(Context context) { + if (sInstance == null) { + Log.e(TAG, "init: "); + sInstance = new AdminManager(context); + } + } + + public static AdminManager getInstance() { + if (sInstance == null) { + throw new IllegalStateException("You must be init AdminManager first"); + } + return sInstance; + } + + /*============================== 基础能力 ==============================*/ + + @Override + public ComponentName getAdminName() { + return mAdminName; + } + + @Override + public boolean isActiveMe() { + if (mDevicePolicyManager == null) { + return false; + } else { + return mDevicePolicyManager.isAdminActive(mAdminName); + } + } + + @Override + public String getSerial() { + String sn = ""; + DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + try { + dpm.setPermissionPolicy(mAdminName, DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED); + } catch (Exception e) { + Log.e(TAG, "getSerial: " + e.getMessage()); + } + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + try { + sn = Build.getSerial(); + } catch (Exception e) { + Log.e(TAG, "getSerial: " + e.getMessage()); + } + } + // 未获取到 MDM 权限时,Build.getSerial() 可能返回 "unknown", + // 此时传 "" 给接口,避免获取到不属于本设备的配置 + if ("unknown".equalsIgnoreCase(sn)) { + sn = ""; + } + return sn; + } + + /*============================== 应用管理 ==============================*/ + + /** + * 添加阻止某应用启动运行名单(DeviceApplicationManager) + */ + @Override + public void addDisallowedRunningApp(String pkg) { + Log.e(TAG, "addDisallowedRunningApp: pkg = " + pkg); + if (TextUtils.isEmpty(pkg)) return; + if (!isAvailable(mContext, pkg)) return; + List packageList = new ArrayList<>(); + packageList.add(pkg); + try { + mDeviceApplicationManager.addDisallowedRunningApp(mAdminName, packageList); + } catch (Exception e) { + Log.e(TAG, "addDisallowedRunningApp: " + e.getMessage()); + } + Log.e(TAG, "addDisallowedRunningApp: getDisallowedRunningApp = " + mDeviceApplicationManager.getDisallowedRunningApp(mAdminName)); + } + + /** + * 删除阻止某应用启动运行名单(DeviceApplicationManager) + */ + @Override + public void removeDisallowedRunningApp(String pkg) { + Log.e(TAG, "removeDisallowedRunningApp: pkg = " + pkg); + if (TextUtils.isEmpty(pkg)) return; + List stringList = new ArrayList<>(); + stringList.add(pkg); + mDeviceApplicationManager.removeDisallowedRunningApp(mAdminName, stringList); + Log.e(TAG, "removeDisallowedRunningApp: getDisallowedRunningApp = " + mDeviceApplicationManager.getDisallowedRunningApp(mAdminName)); + } + + /*============================== 系统限制 ==============================*/ + + @Override + public void setMultiWindowDisabled(boolean disabled) { + try { + mDeviceRestrictionManager.setMultiWindowDisabled(mAdminName, disabled); + } catch (Exception e) { + Log.e(TAG, "setMultiWindowDisabled: " + e.getMessage()); + } + } + + @Override + public boolean isMultiWindowDisabled() { + try { + return mDeviceRestrictionManager.isMultiWindowDisabled(mAdminName); + } catch (Exception e) { + Log.e(TAG, "isMultiWindowDisabled: " + e.getMessage()); + } + return false; + } + + @Override + public void setVoiceAssistantButtonDisabled(boolean disabled) { + try { + mDeviceRestrictionManager.setVoiceAssistantButtonDisabled(mAdminName, disabled); + } catch (Exception e) { + Log.e(TAG, "setVoiceAssistantButtonDisabled: " + e.getMessage()); + } + } + + @Override + public boolean isVoiceAssistantButtonDisabled() { + try { + return mDeviceRestrictionManager.isVoiceAssistantButtonDisabled(mAdminName); + } catch (Exception e) { + Log.e(TAG, "isVoiceAssistantButtonDisabled: " + e.getMessage()); + } + return false; + } + + @Override + public void setUSBDataDisabled(boolean disabled) { + try { + mDeviceRestrictionManager.setUSBDataDisabled(mAdminName, disabled); + } catch (Exception e) { + Log.e(TAG, "setUSBDataDisabled: " + e.getMessage()); + } + } + + @Override + public boolean isUSBDataDisabled() { + try { + return mDeviceRestrictionManager.isUSBDataDisabled(mAdminName); + } catch (Exception e) { + Log.e(TAG, "isUSBDataDisabled: " + e.getMessage()); + } + return false; + } + + /*============================== 设备设置 ==============================*/ + + @Override + public boolean setRestoreFactoryDisabled(boolean disabled) { + try { + return mDeviceSettingsManager.setRestoreFactoryDisabled(mAdminName, disabled); + } catch (Exception e) { + Log.e(TAG, "setRestoreFactoryDisabled: " + e.getMessage()); + } + return false; + } + + @Override + public boolean isRestoreFactoryDisabled() { + try { + return mDeviceSettingsManager.isRestoreFactoryDisabled(mAdminName); + } catch (Exception e) { + Log.e(TAG, "isRestoreFactoryDisabled: " + e.getMessage()); + } + return false; + } + + /*============================== 快捷工具 ==============================*/ + + @Override + public void setQuickToolsDisabled(boolean disabled) { + try { + mDevicePasswordManager.setQuickToolsDisabled(mAdminName, disabled); + } catch (Exception e) { + Log.e(TAG, "setQuickToolsDisabled: " + e.getMessage()); + } + } + + @Override + public boolean isQuickToolsDisabled() { + try { + return mDevicePasswordManager.isQuickToolsDisabled(mAdminName); + } catch (Exception e) { + Log.e(TAG, "isQuickToolsDisabled: " + e.getMessage()); + } + return false; + } + + /*============================== 设备控制 ==============================*/ + + @Override + public void turnOnUsbDebugMode(boolean on) { + try { + mDeviceControlManager.turnOnUsbDebugMode(mAdminName, on); + } catch (Exception e) { + Log.e(TAG, "turnOnUsbDebugMode: " + e.getMessage()); + } + } + + @Override + public void setForcedActiveDeviceAdmin(Context activity) { + try { + mDeviceControlManager.setForcedActiveDeviceAdmin(mAdminName, activity); + } catch (Exception e) { + Log.e(TAG, "setForcedActiveDeviceAdmin: " + e.getMessage()); + } + } + + @Override + public void removeActiveDeviceAdmin() { + try { + mDeviceControlManager.removeActiveDeviceAdmin(mAdminName); + } catch (Exception e) { + Log.e(TAG, "removeActiveDeviceAdmin: " + e.getMessage()); + } + } + + @Override + public void clearDeviceOwnerApp() { + try { + mDeviceControlManager.clearDeviceOwnerApp(); + } catch (Exception e) { + Log.e(TAG, "clearDeviceOwnerApp: " + e.getMessage()); + } + } + + @Override + public boolean isForcedActiveDeviceAdmin() { + try { + return mDeviceControlManager.isForcedActiveDeviceAdmin(mAdminName); + } catch (Exception e) { + Log.e(TAG, "isForcedActiveDeviceAdmin: " + e.getMessage()); + } + return false; + } + + /*============================== 平台差异 ==============================*/ + + /** + * 禁用/启用 YOYO 助手(通过黑名单禁用 com.hihonor.servicecenter) + */ + @Override + public void setYoyoDisabled(boolean disable) { + Log.e(TAG, "setYoyoDisabled: " + disable); + try { + if (disable) { + addDisallowedRunningApp("com.hihonor.servicecenter"); + } else { + removeDisallowedRunningApp("com.hihonor.servicecenter"); + } + } catch (Exception e) { + Log.e(TAG, "setYoyoDisabled: " + e.getMessage()); + } + } + + /** + * 判断应用是否已安装 + */ + private boolean isAvailable(Context context, String pkg) { + if (TextUtils.isEmpty(pkg)) return false; + try { + PackageManager pm = context.getPackageManager(); + pm.getPackageInfo(pkg, 0); + return true; + } catch (PackageManager.NameNotFoundException e) { + return false; + } catch (Exception e) { + return false; + } + } +} diff --git a/app/src/huawei/AndroidManifest.xml b/app/src/huawei/AndroidManifest.xml new file mode 100644 index 0000000..b675c94 --- /dev/null +++ b/app/src/huawei/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/huawei/java/com/ttstd/sn/mdm/AdminManager.java b/app/src/huawei/java/com/ttstd/sn/mdm/AdminManager.java new file mode 100644 index 0000000..1c7cf64 --- /dev/null +++ b/app/src/huawei/java/com/ttstd/sn/mdm/AdminManager.java @@ -0,0 +1,339 @@ +package com.ttstd.sn.mdm; + +import android.annotation.SuppressLint; +import android.app.admin.DevicePolicyManager; +import android.content.ComponentName; +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.Build; +import android.text.TextUtils; +import android.util.Log; + +import com.huawei.android.app.admin.DeviceApplicationManager; +import com.huawei.android.app.admin.DeviceControlManager; +import com.huawei.android.app.admin.DevicePackageManager; +import com.huawei.android.app.admin.DevicePasswordManager; +import com.huawei.android.app.admin.DeviceRestrictionManager; +import com.huawei.android.app.admin.DeviceSettingsManager; +import com.ttstd.sn.receiver.AoleDeviceAdminReceiver; + +import java.util.ArrayList; +import java.util.List; + +/** + * 华为 MDM Kit 实现。 + * + *

依赖 com.huawei.mdm:mdmkit(com.huawei.android.app.admin.*),仅存在于 huawei flavor。

+ */ +public class AdminManager implements IMdmManager { + private static final String TAG = "AdminManager[huawei]"; + + @SuppressLint("StaticFieldLeak") + private static AdminManager sInstance; + + private Context mContext; + private ComponentName mAdminName; + private DevicePolicyManager mDevicePolicyManager; + /*设备应用程序管理类*/ + private DeviceApplicationManager mDeviceApplicationManager; + /*设备控制相关的类*/ + private DeviceControlManager mDeviceControlManager; + /*设备包管理类*/ + private DevicePackageManager mDevicePackageManager; + /*密码相关类*/ + private DevicePasswordManager mDevicePasswordManager; + /*禁用/启用管理类*/ + private DeviceRestrictionManager mDeviceRestrictionManager; + /*设置相关类*/ + private DeviceSettingsManager mDeviceSettingsManager; + + private AdminManager(Context context) { + if (context == null) { + throw new RuntimeException("Context is NULL"); + } + this.mContext = context; + this.mAdminName = new ComponentName(context, AoleDeviceAdminReceiver.class); + this.mDevicePolicyManager = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); + this.mDeviceApplicationManager = new DeviceApplicationManager(); + this.mDeviceControlManager = new DeviceControlManager(); + this.mDevicePackageManager = new DevicePackageManager(); + this.mDevicePasswordManager = new DevicePasswordManager(); + this.mDeviceRestrictionManager = new DeviceRestrictionManager(); + this.mDeviceSettingsManager = new DeviceSettingsManager(); + removeTrustList(); + } + + public static void init(Context context) { + if (sInstance == null) { + Log.e(TAG, "init: "); + sInstance = new AdminManager(context); + } + } + + public static AdminManager getInstance() { + if (sInstance == null) { + throw new IllegalStateException("You must be init AdminManager first"); + } + return sInstance; + } + + /*============================== 基础能力 ==============================*/ + + @Override + public ComponentName getAdminName() { + return mAdminName; + } + + @Override + public boolean isActiveMe() { + if (mDevicePolicyManager == null) { + return false; + } else { + return mDevicePolicyManager.isAdminActive(mAdminName); + } + } + + @Override + public String getSerial() { + String sn = ""; + DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + try { + dpm.setPermissionPolicy(mAdminName, DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED); + } catch (Exception e) { + Log.e(TAG, "getSerial: " + e.getMessage()); + } + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + try { + sn = Build.getSerial(); + } catch (Exception e) { + Log.e(TAG, "getSerial: " + e.getMessage()); + } + } + // 未获取到 MDM 权限时,Build.getSerial() 可能返回 "unknown", + // 此时传 "" 给接口,避免获取到不属于本设备的配置 + if ("unknown".equalsIgnoreCase(sn)) { + sn = ""; + } + return sn; + } + + /*============================== 应用管理 ==============================*/ + + /** + * 添加阻止某应用启动运行名单(DeviceApplicationManager) + */ + @Override + public void addDisallowedRunningApp(String pkg) { + if (TextUtils.isEmpty(pkg)) return; + List packageList = new ArrayList<>(); + packageList.add(pkg); + try { + mDeviceApplicationManager.addDisallowedRunningApp(mAdminName, packageList); + } catch (Exception e) { + Log.e(TAG, "addDisallowedRunningApp: " + e.getMessage()); + } + } + + /** + * 删除阻止某应用启动运行名单(DeviceApplicationManager) + */ + @Override + public void removeDisallowedRunningApp(String pkg) { + if (TextUtils.isEmpty(pkg)) return; + List stringList = new ArrayList<>(); + stringList.add(pkg); + try { + mDeviceApplicationManager.removeDisallowedRunningApp(mAdminName, stringList); + } catch (Exception e) { + Log.e(TAG, "removeDisallowedRunningApp: " + e.getMessage()); + } + } + + /*============================== 系统限制 ==============================*/ + + @Override + public void setMultiWindowDisabled(boolean disabled) { + try { + mDeviceRestrictionManager.setMultiWindowDisabled(mAdminName, disabled); + } catch (Exception e) { + Log.e(TAG, "setMultiWindowDisabled: " + e.getMessage()); + } + } + + @Override + public boolean isMultiWindowDisabled() { + try { + return mDeviceRestrictionManager.isMultiWindowDisabled(mAdminName); + } catch (Exception e) { + Log.e(TAG, "isMultiWindowDisabled: " + e.getMessage()); + } + return false; + } + + @Override + public void setVoiceAssistantButtonDisabled(boolean disabled) { + try { + mDeviceRestrictionManager.setVoiceAssistantButtonDisabled(mAdminName, disabled); + } catch (Exception e) { + Log.e(TAG, "setVoiceAssistantButtonDisabled: " + e.getMessage()); + } + } + + @Override + public boolean isVoiceAssistantButtonDisabled() { + try { + return mDeviceRestrictionManager.isVoiceAssistantButtonDisabled(mAdminName); + } catch (Exception e) { + Log.e(TAG, "isVoiceAssistantButtonDisabled: " + e.getMessage()); + } + return false; + } + + @Override + public void setUSBDataDisabled(boolean disabled) { + try { + mDeviceRestrictionManager.setUSBDataDisabled(mAdminName, disabled); + } catch (Exception e) { + Log.e(TAG, "setUSBDataDisabled: " + e.getMessage()); + } + } + + @Override + public boolean isUSBDataDisabled() { + try { + return mDeviceRestrictionManager.isUSBDataDisabled(mAdminName); + } catch (Exception e) { + Log.e(TAG, "isUSBDataDisabled: " + e.getMessage()); + return false; + } + } + + /*============================== 设备设置 ==============================*/ + + @Override + public boolean setRestoreFactoryDisabled(boolean disabled) { + try { + return mDeviceSettingsManager.setRestoreFactoryDisabled(mAdminName, disabled); + } catch (Exception e) { + Log.e(TAG, "setRestoreFactoryDisabled: " + e.getMessage()); + } + return false; + } + + @Override + public boolean isRestoreFactoryDisabled() { + try { + return mDeviceSettingsManager.isRestoreFactoryDisabled(mAdminName); + } catch (Exception e) { + Log.e(TAG, "isRestoreFactoryDisabled: " + e.getMessage()); + } + return false; + } + + /*============================== 快捷工具 ==============================*/ + + @Override + public void setQuickToolsDisabled(boolean disabled) { + Log.w(TAG, "setQuickToolsDisabled is not supported on huawei platform: " + disabled); + } + + @Override + public boolean isQuickToolsDisabled() { + Log.w(TAG, "isQuickToolsDisabled is not supported on huawei platform"); + return false; + } + + /*============================== 设备控制 ==============================*/ + + @Override + public void turnOnUsbDebugMode(boolean on) { + try { + mDeviceControlManager.turnOnUsbDebugMode(mAdminName, on); + } catch (Exception e) { + Log.e(TAG, "turnOnUsbDebugMode: " + e.getMessage()); + } + } + + @Override + public void setForcedActiveDeviceAdmin(Context activity) { + try { + mDeviceControlManager.setForcedActiveDeviceAdmin(mAdminName, activity); + } catch (Exception e) { + Log.e(TAG, "setForcedActiveDeviceAdmin: " + e.getMessage()); + } + } + + @Override + public void removeActiveDeviceAdmin() { + try { + mDeviceControlManager.removeActiveDeviceAdmin(mAdminName); + } catch (Exception e) { + Log.e(TAG, "removeActiveDeviceAdmin: " + e.getMessage()); + } + } + + @Override + public void clearDeviceOwnerApp() { + try { + mDevicePolicyManager.clearDeviceOwnerApp(mContext.getPackageName()); + } catch (Exception e) { + Log.e(TAG, "clearDeviceOwnerApp: " + e.getMessage()); + } + } + + @Override + public boolean isForcedActiveDeviceAdmin() { + try { + return mDeviceControlManager.isForcedActiveDeviceAdmin(mAdminName); + } catch (Exception e) { + Log.e(TAG, "isForcedActiveDeviceAdmin: " + e.getMessage()); + } + return false; + } + + /*============================== 平台差异 ==============================*/ + + /** + * 禁用/启用 YOYO 助手(华为平台映射为 HiVoice 语音助手) + */ + @Override + public void setYoyoDisabled(boolean disable) { + Log.e(TAG, "setYoyoDisabled: " + disable + " (huawei use voice assistant)"); + setVoiceAssistantButtonDisabled(disable); + } + + /*============================== 初始化辅助 ==============================*/ + + /** + * 移除安装白名单(构造时调用,清理历史白名单配置) + */ + public void removeTrustList() { + try { + List trustList = mDevicePackageManager.getInstallPackageWhiteList(mAdminName); + Log.e(TAG, "removeTrustList: " + trustList); + if (trustList != null && trustList.size() != 0) { + mDevicePackageManager.removeInstallPackageWhiteList(mAdminName, trustList); + } + } catch (Exception e) { + Log.e(TAG, "removeTrustList: " + e.getMessage()); + } + } + + /** + * 判断应用是否已安装 + */ + private boolean isAvailable(Context context, String pkg) { + if (TextUtils.isEmpty(pkg)) return false; + try { + PackageManager pm = context.getPackageManager(); + pm.getPackageInfo(pkg, 0); + return true; + } catch (PackageManager.NameNotFoundException e) { + return false; + } catch (Exception e) { + return false; + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0012da1..0bca3de 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,29 +2,6 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/java/com/ttstd/sn/mdm/AdminManager.java b/app/src/main/java/com/ttstd/sn/mdm/AdminManager.java deleted file mode 100644 index 89757f1..0000000 --- a/app/src/main/java/com/ttstd/sn/mdm/AdminManager.java +++ /dev/null @@ -1,473 +0,0 @@ -package com.ttstd.sn.mdm; - -import android.annotation.SuppressLint; -import android.app.admin.DevicePolicyManager; -import android.content.ComponentName; -import android.content.Context; -import android.content.pm.PackageManager; -import android.os.Build; -import android.text.TextUtils; -import android.util.Log; - -import com.ttstd.sn.receiver.AoleDeviceAdminReceiver; -import com.hihonor.android.app.admin.DeviceApplicationManager; -import com.hihonor.android.app.admin.DeviceBluetoothManager; -import com.hihonor.android.app.admin.DeviceCameraManager; -import com.hihonor.android.app.admin.DeviceControlManager; -import com.hihonor.android.app.admin.DeviceEmailManager; -import com.hihonor.android.app.admin.DeviceFirewallManager; -import com.hihonor.android.app.admin.DeviceHwSystemManager; -import com.hihonor.android.app.admin.DeviceInfraredManager; -import com.hihonor.android.app.admin.DeviceLocationManager; -import com.hihonor.android.app.admin.DeviceNetworkManager; -import com.hihonor.android.app.admin.DeviceP2PManager; -import com.hihonor.android.app.admin.DevicePackageManager; -import com.hihonor.android.app.admin.DevicePasswordManager; -import com.hihonor.android.app.admin.DevicePhoneManager; -import com.hihonor.android.app.admin.DeviceRestrictionManager; -import com.hihonor.android.app.admin.DeviceSettingsManager; -import com.hihonor.android.app.admin.DeviceStorageManagerEx; -import com.hihonor.android.app.admin.DeviceTelephonyManager; -import com.hihonor.android.app.admin.DeviceVpnManager; -import com.hihonor.android.app.admin.DeviceWifiPolicyManager; - -import java.util.ArrayList; -import java.util.List; - -public class AdminManager { - private static final String TAG = "AdminManager"; - - public static final List mDeleteMenus = new ArrayList() {{ - this.add("honor_id"); - this.add("super_device"); - this.add("vpn_settings"); - this.add("apps_clone"); - this.add("apps_startup_management"); - this.add("apps_management"); - this.add("apps_honor_tips"); - this.add("pengine_settings"); - this.add("screen_wallpaper"); - }}; - - private static final int STATUS_DISABLE = 0; - private static final int STATUS_ENABLE = 1; - - @SuppressLint("StaticFieldLeak") - private static AdminManager sInstance; - - private Context mContext; - private ComponentName mAdminName; - private DevicePolicyManager mDevicePolicyManager; - - /*设备应用程序管理类*/ - private DeviceApplicationManager mDeviceApplicationManager; - /*蓝牙相关的管理类*/ - private DeviceBluetoothManager mDeviceBluetoothManager; - /*相机相关的类*/ - private DeviceCameraManager mDeviceCameraManager; - /*设备控制相关的类*/ - private DeviceControlManager mDeviceControlManager; - /*邮箱相关的管理类*/ - private DeviceEmailManager mDeviceEmailManager; - /*防火墙相关管理类*/ - private DeviceFirewallManager mDeviceFirewallManager; - /*系统相关类*/ - private DeviceHwSystemManager mDeviceHwSystemManager; - /*设备红外管理类*/ - private DeviceInfraredManager mDeviceInfraredManager; - /*地理位置相关的类*/ - private DeviceLocationManager mDeviceLocationManager; - /*网络管理相关的类*/ - private DeviceNetworkManager mDeviceNetworkManager; - /*Wifi 直连权限管理授权*/ - private DeviceP2PManager mDeviceP2PManager; - /*设备包管理类*/ - private DevicePackageManager mDevicePackageManager; - /*密码相关类*/ - private DevicePasswordManager mDevicePasswordManager; - /*设备通话管理类*/ - private DevicePhoneManager mDevicePhoneManager; - /*禁用/启用管理类*/ - private DeviceRestrictionManager mDeviceRestrictionManager; - /*设置相关类*/ - private DeviceSettingsManager mDeviceSettingsManager; - /*设备存储管理类*/ - private DeviceStorageManagerEx mDeviceStorageManagerEx; - /*通讯服务管理类*/ - private DeviceTelephonyManager mDeviceTelephonyManager; - /*VPN 相关管理类*/ - private DeviceVpnManager mDeviceVpnManager; - /*WIFI 管理相关类*/ - private DeviceWifiPolicyManager mDeviceWifiPolicyManager; - - - private AdminManager(Context context) { - if (context == null) { - throw new RuntimeException("Context is NULL"); - } - this.mContext = context; - this.mAdminName = new ComponentName(context, AoleDeviceAdminReceiver.class); - this.mDevicePolicyManager = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); - this.mDeviceApplicationManager = new DeviceApplicationManager(); - this.mDeviceBluetoothManager = new DeviceBluetoothManager(); - this.mDeviceCameraManager = new DeviceCameraManager(); - this.mDeviceControlManager = new DeviceControlManager(); - this.mDeviceEmailManager = new DeviceEmailManager(); - this.mDeviceFirewallManager = new DeviceFirewallManager(); - this.mDeviceHwSystemManager = new DeviceHwSystemManager(); - this.mDeviceInfraredManager = new DeviceInfraredManager(); - this.mDeviceLocationManager = new DeviceLocationManager(); - this.mDeviceNetworkManager = new DeviceNetworkManager(); - this.mDeviceP2PManager = new DeviceP2PManager(); - this.mDevicePackageManager = new DevicePackageManager(); - this.mDevicePasswordManager = new DevicePasswordManager(); - this.mDevicePhoneManager = new DevicePhoneManager(); - this.mDeviceRestrictionManager = new DeviceRestrictionManager(); - this.mDeviceSettingsManager = new DeviceSettingsManager(); - this.mDeviceStorageManagerEx = new DeviceStorageManagerEx(); - this.mDeviceTelephonyManager = new DeviceTelephonyManager(); - this.mDeviceVpnManager = new DeviceVpnManager(); - this.mDeviceWifiPolicyManager = new DeviceWifiPolicyManager(); - - Log.e(TAG, "AdminManager: isActiveMe = " + isActiveMe()); - if (isActiveMe()) { - setYoyoDisabled(true); - } - } - - public static void init(Context context) { - if (sInstance == null) { - Log.e(TAG, "init: "); - sInstance = new AdminManager(context); - } - } - - public static AdminManager getInstance() { - if (sInstance == null) { - throw new IllegalStateException("You must be init AdminManager first"); - } - return sInstance; - } - - public ComponentName getAdminName() { - return mAdminName; - } - - public DeviceApplicationManager getDeviceApplicationManager() { - return mDeviceApplicationManager; - } - - public DeviceBluetoothManager getDeviceBluetoothManager() { - return mDeviceBluetoothManager; - } - - public DeviceCameraManager getDeviceCameraManager() { - return mDeviceCameraManager; - } - - public DeviceControlManager getDeviceControlManager() { - return mDeviceControlManager; - } - - public DeviceEmailManager getDeviceEmailManager() { - return mDeviceEmailManager; - } - - public DeviceFirewallManager getDeviceFirewallManager() { - return mDeviceFirewallManager; - } - - public DeviceHwSystemManager getDeviceHwSystemManager() { - return mDeviceHwSystemManager; - } - - public DeviceInfraredManager getDeviceInfraredManager() { - return mDeviceInfraredManager; - } - - public DeviceLocationManager getDeviceLocationManager() { - return mDeviceLocationManager; - } - - public DeviceNetworkManager getDeviceNetworkManager() { - return mDeviceNetworkManager; - } - - public DeviceP2PManager getDeviceP2PManager() { - return mDeviceP2PManager; - } - - public DevicePackageManager getDevicePackageManager() { - return mDevicePackageManager; - } - - public DevicePasswordManager getDevicePasswordManager() { - return mDevicePasswordManager; - } - - public DevicePhoneManager getDevicePhoneManager() { - return mDevicePhoneManager; - } - - public DeviceRestrictionManager getDeviceRestrictionManager() { - return mDeviceRestrictionManager; - } - - public DeviceSettingsManager getDeviceSettingsManager() { - return mDeviceSettingsManager; - } - - public DeviceStorageManagerEx getDeviceStorageManagerEx() { - return mDeviceStorageManagerEx; - } - - public DeviceTelephonyManager getDeviceTelephonyManager() { - return mDeviceTelephonyManager; - } - - public DeviceVpnManager getDeviceVpnManager() { - return mDeviceVpnManager; - } - - public DeviceWifiPolicyManager getDeviceWifiPolicyManager() { - return mDeviceWifiPolicyManager; - } - - public String getSerial() { - String sn = ""; - DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - try { - dpm.setPermissionPolicy(mAdminName, DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED); - } catch (Exception e) { - Log.e(TAG, "getSerial: " + e.getMessage()); - } - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - try { - sn = Build.getSerial(); - } catch (Exception e) { - Log.e(TAG, "getSerial: " + e.getMessage()); - } - } - // 未获取到 MDM 权限时,Build.getSerial() 可能返回 "unknown", - // 此时传 "" 给接口,避免获取到不属于本设备的配置 - if ("unknown".equalsIgnoreCase(sn)) { - sn = ""; - } - return sn; - } - - public boolean isActiveMe() { - if (mDevicePolicyManager == null) { - return false; - } else { - return mDevicePolicyManager.isAdminActive(mAdminName); - } - } - - /** - * 移除白名单 - */ - public void removeTrustList() { - try { - List trustList = mDevicePackageManager.getInstallPackageTrustList(mAdminName); - Log.e(TAG, "removeTrustList: " + trustList); - if (trustList != null && trustList.size() != 0) { - mDevicePackageManager.removeInstallPackageTrustList(mAdminName, trustList); - } - } catch (Exception e) { - Log.e(TAG, "removeTrustList: " + e.getMessage()); - } - } - - /** - * 添加保持某应用始终运行名单 - * - * @param pkg - */ - public void addPersistentApp(String pkg) { - Log.e(TAG, "addPersistentApp: " + pkg); - List forceAppList = new ArrayList<>(); - forceAppList.add(pkg); - try { - // 添加保持某应用始终运行名单 - mDeviceApplicationManager.addPersistentApp(mAdminName, forceAppList); - } catch (Exception e) { - Log.e(TAG, "addPersistentApp: " + e.getMessage()); - } - } - - /** - * 添加保持某应用始终运行名单 - * - * @param packageNames - */ - public void addPersistentApp(List packageNames) { - Log.e(TAG, "addPersistentApp: " + packageNames); - try { - // 添加保持某应用始终运行名单 - mDeviceApplicationManager.addPersistentApp(mAdminName, packageNames); - } catch (Exception e) { - Log.e(TAG, "addPersistentApp: Exception " + e.getMessage()); - } - Log.e(TAG, "setDisallowUninstall: getPersistentApp: " + mDeviceApplicationManager.getPersistentApp(mAdminName)); - } - - /** - * @param pkg 添加保持某应用始终运行名单 - */ - public void removePersistentApp(String pkg) { - Log.e(TAG, "removePersistentApp: " + pkg); - List packageNames = new ArrayList<>(); - packageNames.add(pkg); - try { - // 添加保持某应用始终运行名单 - mDeviceApplicationManager.removePersistentApp(mAdminName, packageNames); - } catch (Exception e) { - Log.e(TAG, "removePersistentApp: " + e.getMessage()); - } - } - - public void removePersistentApp(List packageNames) { - Log.e(TAG, "removePersistentApp: " + packageNames); - try { - // 添加保持某应用始终运行名单 - mDeviceApplicationManager.removePersistentApp(mAdminName, packageNames); - } catch (Exception e) { - Log.e(TAG, "removePersistentApp: " + e.getMessage()); - } - } - - /** - * 添加阻止某应用启动运行名单 - * - * @param packageNames - */ - public void addDisallowedRunningApp(List packageNames) { - if (packageNames == null || packageNames.size() == 0) return; - Log.e(TAG, "addDisallowedRunningApp: packageNames = " + packageNames); - List packageList = mDeviceApplicationManager.getDisallowedRunningApp(mAdminName); - Log.e(TAG, "addDisallowedRunningApp: getDisallowedRunningApp = " + packageList); - try { - mDeviceApplicationManager.addDisallowedRunningApp(mAdminName, packageNames); - } catch (Exception e) { - Log.e(TAG, "addDisallowedRunningApp: " + e.getMessage()); - } - Log.e(TAG, "addDisallowedRunningApp: getDisallowedRunningApp = " + mDeviceApplicationManager.getDisallowedRunningApp(mAdminName)); - } - - /** - * 添加阻止某应用启动运行名单 - * - * @param pkg 添加后,黑名单中的应用不能打开,正在使用的应用也会被停止运行。 - */ - public void addDisallowedRunningApp(String pkg) { - Log.e(TAG, "addDisallowedRunningApp: pkg = " + pkg); - if (TextUtils.isEmpty(pkg)) return; - if (!isAvailable(mContext, pkg)) return; - List packageList = new ArrayList<>(); - packageList.add(pkg); - try { - mDeviceApplicationManager.addDisallowedRunningApp(mAdminName, packageList); - } catch (Exception e) { - Log.e(TAG, "addDisallowedRunningApp: " + e.getMessage()); - } - Log.e(TAG, "addDisallowedRunningApp: getDisallowedRunningApp = " + mDeviceApplicationManager.getDisallowedRunningApp(mAdminName)); - } - - - /** - * 删除阻止某应用启动运行名单 - * - * @param packageNames - */ - public void removeDisallowedRunningApp(List packageNames) { - if (packageNames == null || packageNames.size() == 0) return; - mDeviceApplicationManager.removeDisallowedRunningApp(mAdminName, packageNames); - Log.e(TAG, "removeDisallowedRunningApp: getDisallowedRunningApp = " + mDeviceApplicationManager.getDisallowedRunningApp(mAdminName)); - } - - - /** - * 删除阻止某应用启动运行名单 - * - * @param pkg 待删除的应用包名列表 - */ - public void removeDisallowedRunningApp(String pkg) { - Log.e(TAG, "removeDisallowedRunningApp: pkg = " + pkg); - if (TextUtils.isEmpty(pkg)) return; - List stringList = new ArrayList<>(); - stringList.add(pkg); - mDeviceApplicationManager.removeDisallowedRunningApp(mAdminName, stringList); - Log.e(TAG, "removeDisallowedRunningApp: getDisallowedRunningApp = " + mDeviceApplicationManager.getDisallowedRunningApp(mAdminName)); - } - - /** - * @param pkg - * @return 是否阻止某应用启动 - */ - public boolean isDisallowedRunningApp(String pkg) { - List packageList = mDeviceApplicationManager.getDisallowedRunningApp(mAdminName); - Log.e(TAG, "isDisallowedRunningApp: packageList = " + packageList); - return packageList.contains(pkg); - } - - /** - * 设置 yoyo 助手 - * - * @param disable true: 禁用 yoyo 助手 - */ - public void setYoyoDisable(boolean disable) { - if (disable) { - setYoyoDisabled(true); - } else { - setYoyoDisabled(false); - } - } - - public void setYoyoDisabled(boolean disable) { - Log.e(TAG, "setYoyoDisabled: " + disable); - try { - if (disable) { - addDisallowedRunningApp("com.hihonor.servicecenter"); - } else { - removeDisallowedRunningApp("com.hihonor.servicecenter"); - } - } catch (Exception e) { - Log.e(TAG, "setYoyoDisabled: " + e.getMessage()); - } - } - - /** - * 添加忽略频繁重新启动的应用 - * - * @param packageNames - */ - public void addIgnoreFrequentRelaunchAppList(ArrayList packageNames) { - Log.e(TAG, "addIgnoreFrequentRelaunchAppList: " + packageNames); - try { - if (packageNames != null && packageNames.size() > 0) { - mDeviceApplicationManager.addIgnoreFrequentRelaunchAppList(mAdminName, packageNames); - } - } catch (Exception e) { - Log.e(TAG, "addIgnoreFrequentRelaunchAppList: " + e.getMessage()); - } - } - - /** - * 判断应用是否已安装 - */ - private boolean isAvailable(Context context, String pkg) { - if (TextUtils.isEmpty(pkg)) return false; - try { - PackageManager pm = context.getPackageManager(); - pm.getPackageInfo(pkg, 0); - return true; - } catch (PackageManager.NameNotFoundException e) { - return false; - } catch (Exception e) { - return false; - } - } -} diff --git a/app/src/main/java/com/ttstd/sn/mdm/IMdmManager.java b/app/src/main/java/com/ttstd/sn/mdm/IMdmManager.java new file mode 100644 index 0000000..92b7ec0 --- /dev/null +++ b/app/src/main/java/com/ttstd/sn/mdm/IMdmManager.java @@ -0,0 +1,124 @@ +package com.ttstd.sn.mdm; + +import android.content.ComponentName; +import android.content.Context; + +/** + * MDM 能力抽象接口。 + * + *

荣耀(com.hihonor.android.app.admin.*)、华为(com.huawei.android.app.admin.*) + * 与 EMUI(com.huawei.android.app.admin.*)三套平台 SDK 的 MDM 能力在此统一抽象, + * 业务层(App / Activity)只依赖本接口,平台差异由各 flavor 中的 {@code AdminManager} 实现。

+ * + *

方法按底层使用的 SDK Manager 分组排列,并在注释中标注对应 Manager;

+ */ +public interface IMdmManager { + + /*============================== 基础能力(DevicePolicyManager / Build) ==============================*/ + + /** + * 设备管理员组件(DevicePolicyManager) + */ + ComponentName getAdminName(); + + /** + * 设备管理员是否已激活(DevicePolicyManager) + */ + boolean isActiveMe(); + + /** + * 获取设备序列号(Build.getSerial,依赖 MDM 权限) + */ + String getSerial(); + + /*============================== 应用管理(DeviceApplicationManager) ==============================*/ + + /** + * 添加阻止某应用启动运行名单(黑名单) + */ + void addDisallowedRunningApp(String pkg); + + /** + * 删除阻止某应用启动运行名单 + */ + void removeDisallowedRunningApp(String pkg); + + /*============================== 系统限制(DeviceRestrictionManager) ==============================*/ + + /** + * 禁用/启用多窗口(DeviceRestrictionManager) + */ + void setMultiWindowDisabled(boolean disabled); + + boolean isMultiWindowDisabled(); + + /** + * 禁用/启用语音助手按键(DeviceRestrictionManager) + */ + void setVoiceAssistantButtonDisabled(boolean disabled); + + boolean isVoiceAssistantButtonDisabled(); + + /** + * 禁用/启用 USB 数据传输(DeviceRestrictionManager) + */ + void setUSBDataDisabled(boolean disabled); + + boolean isUSBDataDisabled(); + + /*============================== 设备设置(DeviceSettingsManager) ==============================*/ + + /** + * 禁用/启用恢复出厂设置(DeviceSettingsManager) + * + * @return true:配置成功;false:配置失败 + */ + boolean setRestoreFactoryDisabled(boolean disabled); + + boolean isRestoreFactoryDisabled(); + + /*============================== 快捷工具(DevicePasswordManager) ==============================*/ + + /** + * 禁用/启用快捷工具(DevicePasswordManager) + */ + void setQuickToolsDisabled(boolean disabled); + + boolean isQuickToolsDisabled(); + + /*============================== 设备控制(DeviceControlManager) ==============================*/ + + /** + * 开启/关闭 USB 调试模式(DeviceControlManager) + */ + void turnOnUsbDebugMode(boolean on); + + /** + * 强制激活设备管理员,静默激活,需系统签名(DeviceControlManager) + */ + void setForcedActiveDeviceAdmin(Context activity); + + /** + * 移除设备管理员(DeviceControlManager) + */ + void removeActiveDeviceAdmin(); + + /** + * 清除 Device Owner(DeviceControlManager) + */ + void clearDeviceOwnerApp(); + + /** + * 是否已强制激活设备管理员(DeviceControlManager) + */ + boolean isForcedActiveDeviceAdmin(); + + /*============================== 平台差异(无统一 Manager) ==============================*/ + + /** + * 禁用/启用 YOYO 助手。 + * 荣耀平台通过 {@link #addDisallowedRunningApp(String)} 禁用 com.hihonor.servicecenter; + * 华为 / EMUI 平台映射为 {@link #setVoiceAssistantButtonDisabled(boolean)}(HiVoice)。 + */ + void setYoyoDisabled(boolean disable); +} diff --git a/app/src/main/java/com/ttstd/sn/ui/main/MainActivity.java b/app/src/main/java/com/ttstd/sn/ui/main/MainActivity.java index 5cd8901..7eb95e7 100644 --- a/app/src/main/java/com/ttstd/sn/ui/main/MainActivity.java +++ b/app/src/main/java/com/ttstd/sn/ui/main/MainActivity.java @@ -1,41 +1,20 @@ package com.ttstd.sn.ui.main; -import android.app.admin.DevicePolicyManager; -import android.content.ComponentName; -import android.content.Context; +import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.CompoundButton; import com.ttstd.sn.R; import com.ttstd.sn.mdm.AdminManager; +import com.ttstd.sn.mdm.IMdmManager; import com.ttstd.sn.databinding.ActivityMainBinding; -import com.ttstd.sn.receiver.AoleDeviceAdminReceiver; import com.ttstd.sn.ui.base.mvvm.BaseMvvmActivity; -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; - public class MainActivity extends BaseMvvmActivity { - private static final String TAG = "DebugActivity"; + private static final String TAG = "MainActivity"; - 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; + private IMdmManager mMdmManager; @Override protected int getLayoutId() { @@ -59,22 +38,13 @@ public class MainActivity extends BaseMvvmActivity