Commit 5b7b2fb1 by Baoxy

build: 去掉中间件,直接调用华为api

parent 616ba36e
......@@ -37,19 +37,6 @@
android:label="@string/permlab_install_shortcut"
android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
android:protectionLevel="dangerous" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.SET_WALLPAPER" />
<uses-permission android:name="android.permission.SET_WALLPAPER_HINTS" />
<uses-permission android:name="android.permission.BIND_APPWIDGET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="middleware.permission.MDM" />
<application
android:persistent="true"
android:backupAgent="com.android.launcher3.LauncherBackupAgent"
......
......@@ -29,12 +29,10 @@
android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
android:protectionLevel="signatureOrSystem" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.android.launcher3.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher3.permission.WRITE_SETTINGS" />
<uses-permission android:name="middleware.permission.MDM" />
<application
android:name=".App"
......
......@@ -35,7 +35,7 @@ android {
keyAlias "skr.keystore"
keyPassword "123456" //签名密码
v1SigningEnabled true
v2SigningEnabled false
v2SigningEnabled true
println("====== signingConfigs.debug ======")
}
release {
......@@ -44,7 +44,7 @@ android {
keyAlias "skr.keystore"
keyPassword "123456"
v1SigningEnabled true
v2SigningEnabled false
v2SigningEnabled true
println("====== signingConfigs.release ======")
}
}
......@@ -78,6 +78,7 @@ android {
productFlavors {
aosp {
// applicationId 'com.android.workassistant'
applicationId 'com.eduspace.mobilemanager'
testApplicationId 'com.android.launcher3.tests'
}
......@@ -131,7 +132,7 @@ dependencies {
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
androidTestImplementation "com.android.support:support-annotations:${SUPPORT_LIBS_VERSION}"
implementation 'com.secspace:provider_mdm_engine:1.1.0.60'
// implementation 'com.secspace:provider_mdm_engine:1.1.0.60'
implementation 'io.reactivex.rxjava2:rxjava:2.0.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'
......
......@@ -4,10 +4,8 @@ import android.app.Application;
import android.content.Context;
import com.secspace.lib.common.dialog.other.DialogUIUtils;
import com.secspace.lib.common.function.ActivationHelper;
import com.secspace.lib.common.dpm.DpmManager;
import com.secspace.lib.common.function.database.DatabaseManager;
import com.secspace.lib.common.update.CheckUpdateCore;
import com.secspace.lib.common.utils.DpmHelper;
public class App extends Application {
private Context mApp;
......@@ -16,11 +14,8 @@ public class App extends Application {
public void onCreate() {
super.onCreate();
mApp = getApplicationContext();
DpmHelper dpmHelper = DpmHelper.getInstance(mApp);
if (dpmHelper.isMiddlewareLatest()) {
dpmHelper.initMiddleWare();
}
DpmManager.getInstance().init(mApp);
DialogUIUtils.init(mApp);
DatabaseManager.Companion.getInstance(mApp).init();
DatabaseManager.getInstance(mApp).init();
}
}
......@@ -72,7 +72,6 @@ import android.view.HapticFeedbackConstants;
import android.view.KeyEvent;
import android.view.KeyboardShortcutGroup;
import android.view.KeyboardShortcutInfo;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
......@@ -86,7 +85,6 @@ import android.view.accessibility.AccessibilityManager;
import android.view.animation.OvershootInterpolator;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
......@@ -118,7 +116,6 @@ import com.android.launcher3.keyboard.CustomActionsPopup;
import com.android.launcher3.keyboard.ViewGroupFocusHelper;
import com.android.launcher3.logging.FileLog;
import com.android.launcher3.logging.UserEventDispatcher;
import com.android.launcher3.mdm.DpmOwnerHelper;
import com.android.launcher3.model.ModelWriter;
import com.android.launcher3.model.PackageItemInfo;
import com.android.launcher3.model.WidgetItem;
......@@ -155,17 +152,14 @@ import com.android.launcher3.widget.WidgetsContainerView;
import com.google.gson.Gson;
import com.secspace.lib.common.dialog.other.DialogUIUtils;
import com.secspace.lib.common.event.ChangeWallPaperEvent;
import com.secspace.lib.common.event.InitEvent;
import com.secspace.lib.common.event.RefreshWorkSpaceEvent;
import com.secspace.lib.common.function.ActivationHelper;
import com.secspace.lib.common.function.DialogManager;
import com.secspace.lib.common.function.WorkManager;
import com.secspace.lib.common.function.model.Encrypted;
import com.secspace.lib.common.update.CheckUpdateCore;
import com.secspace.lib.common.update.CheckUpdateCore;
import com.secspace.lib.common.utils.ActivityHelper;
import com.secspace.lib.common.utils.DeviceUtil;
import com.secspace.lib.common.utils.DpmHelper;
import com.secspace.lib.common.utils.FileUtil;
import com.secspace.lib.common.utils.ImeiCheckUtils;
import com.secspace.lib.common.utils.InputUtil;
......@@ -174,7 +168,6 @@ import com.secspace.lib.common.utils.JsonUtil;
import com.secspace.lib.common.utils.Prefs;
import com.secspace.lib.common.utils.ToastUtil;
import com.secspace.lib.common.utils.UtilsKt;
import com.secspace.mdmengine.api.manager.MdmFactoryManager;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
......@@ -1205,7 +1198,7 @@ public class Launcher extends BaseActivity
if (mLauncherCallbacks != null) {
mLauncherCallbacks.onResume();
}
WorkManager.INSTANCE.enter(Launcher.this);
WorkManager.getInstance(Launcher.this).enter(Launcher.this);
}
public static void forceReload() {
......@@ -1267,101 +1260,6 @@ public class Launcher extends BaseActivity
return false;
}
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
private void isFirstInit(InitEvent initEvent) {
Log.e("TAG", "post: isFirstInit");
if (Prefs.isFirstInit(this)) {
showPwdDialog(getString(R.string.launcher_setting_tip), getString(R.string.ok), null, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mTipDialog = null;
if (!isWifiOpened()) {
setWifiState(true);
}
dialog.dismiss();
}
}, null);
Prefs.setIsFirstInit(Launcher.this, false);
}
}
private boolean isWifiOpened() {
return mWifiManager.isWifiEnabled();
}
private void setWifiState(boolean state) {
if (mWifiManager.isWifiEnabled() != state) {
boolean b = mWifiManager.setWifiEnabled(state);
Log.i(TAG, "setWifiState: " + b);
}
}
private boolean checkDeviceOwner() {
boolean middlewareDeviceOwner = DpmHelper.getInstance(this).isMiddlewareDeviceOwner();
if (!middlewareDeviceOwner) {
DpmOwnerHelper.disableAccountsAndRemoveProfileUsers(this);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
checkDeviceOwner();
}
}, 6000);
} else {
MdmFactoryManager.getInstance().getGooglePolicyManager().setOrganizationName("个人");
}
return middlewareDeviceOwner;
}
AlertDialog mTipDialog;
/**
* dialog
*
* @param title
* @param positiveText
* @param negativeText
* @param positiveClickListener
* @param negativeClickListener
*/
private void showPwdDialog(String title, String positiveText, String negativeText, DialogInterface.OnClickListener positiveClickListener, DialogInterface.OnClickListener negativeClickListener) {
if (mTipDialog != null && mTipDialog.isShowing()) {
mTipDialog.dismiss();
}
View view = LayoutInflater.from(this).inflate(R.layout.item_ll, null);
LinearLayout ll = view.findViewById(R.id.item_ll);
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle(title)
.setCancelable(false)
.setView(view);
if (positiveClickListener != null) {
builder.setPositiveButton(positiveText, positiveClickListener);
}
if (negativeClickListener != null) {
builder.setNegativeButton(negativeText, negativeClickListener);
}
if (mTipDialog == null) {
mTipDialog = builder.create();
}
if (!mTipDialog.isShowing()) {
mTipDialog.show();
}
}
/**
* 跳转到设置账户页面
*/
private void startAccountAct() {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.android.settings", "com.android.settings.Settings$AccountSettingsActivity"));
startActivity(intent);
}
private void startWifiScanService() {
// startService(new Intent(this, WifiScanService.class));
}
//重新loading一下应用 为了过滤应用
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
......@@ -2190,9 +2088,6 @@ public class Launcher extends BaseActivity
@Override
public void onDestroy() {
super.onDestroy();
if (mTipDialog != null && mTipDialog.isShowing()) {
mTipDialog.dismiss();
}
EventBus.getDefault().unregister(this);
mWorkspace.removeCallbacks(mBuildLayersRunnable);
mWorkspace.removeFolderListeners();
......
......@@ -118,7 +118,7 @@ class ChangePwdActivity : BaseActivity() {
return
}
var answer = editable.toString()
answer = encrypt(answer)
answer = answer.encrypt()
if (TextUtils.equals(answer1, answer)) {
val intent = Intent(mAppContext, PwdPinSetPwdActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
......
......@@ -3,24 +3,20 @@ package com.android.launcher3.function.pwd
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.text.TextUtils
import android.view.View
import android.widget.EditText
import android.widget.GridLayout
import com.android.launcher3.BaseActivity
import com.android.launcher3.R
import com.android.launcher3.mdm.DisableCompat
import com.qmuiteam.qmui.widget.grouplist.QMUICommonListItemView
import com.qmuiteam.qmui.widget.grouplist.QMUIGroupListView
import com.secspace.lib.common.dialog.other.DialogUIUtils
import com.secspace.lib.common.function.DialogManager.PwdListener
import com.secspace.lib.common.function.DialogManager.showEncryptedVerDialog
import com.secspace.lib.common.function.model.Encrypted
import com.secspace.lib.common.utils.*
import com.secspace.lib.common.dpm.DpmManager
import com.secspace.lib.common.utils.PkgManager
import com.secspace.lib.common.utils.Prefs
import com.secspace.lib.common.utils.dp2px
import kotlinx.android.synthetic.main.activity_setting.*
class SettingPwdActivity : BaseActivity(){
private var mContext: Context? = null
private lateinit var mContext: Context
private var pwd: QMUICommonListItemView? = null
private var pwdCar: QMUICommonListItemView? = null
......@@ -62,12 +58,12 @@ class SettingPwdActivity : BaseActivity(){
private fun reinforce() {
val packages: MutableList<String> = PkgManager.getInstance(mContext).queryLauncherPackages()
packages.remove(mContext?.packageName)
packages.remove(mContext.packageName)
if(packages.isNotEmpty()){
Prefs.setHideLauncherPackages(mContext, packages)
}
for (packageName in packages) {
DisableCompat.disableApplication(mContext, packageName)
DpmManager.instance.applicationManager.disableApplication(mContext, packageName)
}
}
}
\ No newline at end of file
......@@ -82,8 +82,8 @@ class EncryptedSetFragment : Fragment() {
DialogUIUtils.showToastCenter(R.string.edu_item_input_encryted_set_success)
answer1 = encrypt(answer1)
answer2 = encrypt(answer2)
answer1 = answer1.encrypt()
answer2 = answer2.encrypt()
val encrypted = Encrypted(question1, answer1, question2, answer2)
Prefs.setEncrypted(activity, Gson().toJson(encrypted))
......
......@@ -81,8 +81,8 @@ class EncryptedVerifyFragment : Fragment() {
return
}
answer1 = encrypt(answer1)
answer2 = encrypt(answer2)
answer1 = answer1.encrypt()
answer2 = answer2.encrypt()
if (answer1 != encrypted.answer1) {
DialogUIUtils.showToastCenter(R.string.edu_item_input_answer1_error)
......
......@@ -23,9 +23,9 @@ import kotlinx.android.synthetic.main.activity_app_manager.*
import kotlinx.coroutines.*
class AppChooseActivity : BaseActivity() {
var mAppInfoAdapterSystemApp: AppChooseListAdapter? = null
var mAppInfoAdapterUserApp: AppChooseListAdapter? = null
var job: Job? = null
private lateinit var mAppInfoAdapterSystemApp: AppChooseListAdapter
private lateinit var mAppInfoAdapterUserApp: AppChooseListAdapter
private var job: Job? = null
private val mSystemApps: MutableList<AppModel> = ArrayList()
private val mUserApps: MutableList<AppModel> = ArrayList()
private lateinit var mContext: Context
......@@ -42,20 +42,23 @@ class AppChooseActivity : BaseActivity() {
fun initView() {
tv_setting_title.setText(R.string.edu_item_icon)
mAppInfoAdapterSystemApp = AppChooseListAdapter(SYSTEM_APP_FLAG)
mAppInfoAdapterSystemApp?.setItemViewId(R.layout.item_app_choose_list)
val linearLayoutManager = LinearLayoutManager(this, VERTICAL, false)
recyclerview_system.layoutManager = linearLayoutManager
recyclerview_system.addItemDecoration(DividerItemDecoration(this, DividerItemDecoration.VERTICAL))
recyclerview_system.adapter = mAppInfoAdapterSystemApp
mAppInfoAdapterUserApp = AppChooseListAdapter(USER_APP_FLAG)
mAppInfoAdapterUserApp?.setItemViewId(R.layout.item_app_choose_list)
val linearLayoutManagerUser = LinearLayoutManager(this, VERTICAL, false)
recyclerview_user.layoutManager = linearLayoutManagerUser
recyclerview_user.addItemDecoration(DividerItemDecoration(this, DividerItemDecoration.VERTICAL))
recyclerview_user.adapter = mAppInfoAdapterUserApp
mAppInfoAdapterSystemApp?.list = mSystemApps
mAppInfoAdapterUserApp?.list = mUserApps
mAppInfoAdapterSystemApp = AppChooseListAdapter(SYSTEM_APP_FLAG).apply {
setItemViewId(R.layout.item_app_choose_list)
val linearLayoutManager = LinearLayoutManager(mContext, VERTICAL, false)
recyclerview_system.layoutManager = linearLayoutManager
recyclerview_system.addItemDecoration(DividerItemDecoration(mContext, DividerItemDecoration.VERTICAL))
recyclerview_system.adapter = this
list = mSystemApps
}
mAppInfoAdapterUserApp = AppChooseListAdapter(USER_APP_FLAG).apply {
setItemViewId(R.layout.item_app_choose_list)
val linearLayoutManagerUser = LinearLayoutManager(mContext, VERTICAL, false)
recyclerview_user.layoutManager = linearLayoutManagerUser
recyclerview_user.addItemDecoration(DividerItemDecoration(mContext, DividerItemDecoration.VERTICAL))
recyclerview_user.adapter = this
list = mUserApps
}
}
private fun loadData() {
......@@ -91,10 +94,10 @@ class AppChooseActivity : BaseActivity() {
btn_sure.isEnabled = true
btn_cancel.isEnabled = true
LoadingDialog.getInstance(mContext).dismiss()
mAppInfoAdapterUserApp?.readResult(mAppContext)
mAppInfoAdapterSystemApp?.readResult(mAppContext)
mAppInfoAdapterSystemApp?.notifyDataSetChanged()
mAppInfoAdapterUserApp?.notifyDataSetChanged()
mAppInfoAdapterUserApp.readResult(mAppContext)
mAppInfoAdapterSystemApp.readResult(mAppContext)
mAppInfoAdapterSystemApp.notifyDataSetChanged()
mAppInfoAdapterUserApp.notifyDataSetChanged()
}
}
......@@ -106,11 +109,11 @@ class AppChooseActivity : BaseActivity() {
fun btnClick(view: View?) {
when (view?.id) {
R.id.btn_sure -> {
GlobalScope.launch (Dispatchers.Main){
GlobalScope.launch(Dispatchers.Main) {
LoadingDialog.getInstance(mAppContext).show("请稍后")
mAppInfoAdapterSystemApp?.saveResult(mAppContext)
mAppInfoAdapterUserApp?.saveResult(mAppContext)
SwitchInMdm.addDisallowedRunningApp(mContext)
mAppInfoAdapterSystemApp.saveResult(mAppContext)
mAppInfoAdapterUserApp.saveResult(mAppContext)
SwitchInMdm.getInstance(mContext).addDisallowedRunningApp()
Launcher.forceReload()
IntentUtil.startEduLauncher(mContext)
LoadingDialog.getInstance(mAppContext).dismiss()
......
......@@ -121,14 +121,14 @@ class AppUseActivity : BaseActivity() {
}
private fun initChart() {
tv_app_use_time.text = String.format(getString(R.string.edu_item_app_use_last_day), formatDateTime(defaultTotalTime))
tv_app_use_time.text = String.format(getString(R.string.edu_item_app_use_last_day), defaultTotalTime.formatDateTime())
time_progress.setData(defaultUseAppEntitys, defaultTotalTime)
time_progress.initAnimation()
}
private fun initRecyclerView() {
val treeAdapter = TreeAdapter(this, selectEntity, selectTotalTime)
val layoutManager = object:LinearLayoutManager(this){
val layoutManager = object : LinearLayoutManager(this) {
override fun canScrollVertically(): Boolean {
return false
}
......@@ -224,7 +224,7 @@ class AppUseActivity : BaseActivity() {
// 根据使用时间降序排列
selectUseAppEntitys.sortByDescending { it.useTime }
withContext(Dispatchers.Main) {
tv_app_use_total_time.text = String.format(getString(R.string.edu_item_app_use_total), formatDateTime(selectTotalTime))
tv_app_use_total_time.text = String.format(getString(R.string.edu_item_app_use_total), selectTotalTime.formatDateTime())
val allTime: Float = ((selectEndTime - selectStartTime) / 1000 / 60).toFloat()
val showTime = selectTotalTime / allTime * 100
Log.e(TAG, "showTime = $showTime , allTime = $allTime")
......@@ -268,8 +268,8 @@ class AppUseActivity : BaseActivity() {
val useAppsChild = LinkedList<UseAppListEntity>()
map.value.forEach {
val tempAppList = UseAppListEntity(1)
tempAppList.startTime = formatDate2MdHm(it.useStartTime)
tempAppList.endTime = formatDate2MdHm(it.useEndTime)
tempAppList.startTime = it.useStartTime.formatDate2MdHm()
tempAppList.endTime = it.useEndTime.formatDate2MdHm()
useAppsChild.add(tempAppList)
appList.useTime += ((it.useEndTime - it.useStartTime) / 1000 / 60)
}
......
......@@ -9,10 +9,10 @@ import android.widget.GridLayout
import com.android.launcher3.BaseActivity
import com.android.launcher3.R
import com.android.launcher3.function.pwd.SettingPwdActivity
import com.android.launcher3.mdm.DisableCompat
import com.qmuiteam.qmui.widget.grouplist.QMUICommonListItemView
import com.qmuiteam.qmui.widget.grouplist.QMUIGroupListView
import com.secspace.lib.common.dialog.LoadingDialog
import com.secspace.lib.common.dpm.DpmManager
import com.secspace.lib.common.event.ChangeWallPaperEvent
import com.secspace.lib.common.function.DialogManager
import com.secspace.lib.common.utils.PkgManager
......@@ -29,7 +29,7 @@ import kotlinx.coroutines.launch
import org.greenrobot.eventbus.EventBus
class SettingAdminActivity : BaseActivity() {
private var mContext: Context? = null
private lateinit var mContext: Context
private var icon: QMUICommonListItemView? = null
private var reinforce: QMUICommonListItemView? = null
private var pwdManager: QMUICommonListItemView? = null
......@@ -101,12 +101,12 @@ class SettingAdminActivity : BaseActivity() {
private fun reinforce() {
val packages: MutableList<String> = PkgManager.getInstance(mContext).queryLauncherPackages()
packages.remove(mContext?.packageName)
packages.remove(mContext.packageName)
if (packages.isNotEmpty()) {
Prefs.setHideLauncherPackages(mContext, packages)
}
for (packageName in packages) {
DisableCompat.disableApplication(mContext, packageName)
DpmManager.instance.applicationManager.disableApplication(mContext, packageName)
}
}
......
package com.android.launcher3.mdm;
import android.content.ComponentName;
/**
* Created by bxy on 2019/1/9.
*/
public class Component {
/**
* 手机管家-应用启动管理
*/
public static ComponentName startupAppControlActivity = new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.appcontrol.activity.StartupAppControlActivity");
public static ComponentName motionScenesSettings = new ComponentName("com.huawei.motionservice", "com.huawei.motionsettings.tutorial.MotionScenesSettings");
public static ComponentName mainScreenActivity = new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.mainscreen.MainScreenActivity");
//更多电池设置管理
public static ComponentName morePowerSettingActivity = new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.power.ui.PowerSettingActivity");
//华为桌面
public static ComponentName huaweiLuancher = new ComponentName("com.huawei.android.launcher", "com.huawei.android.launcher.unihome.UniHomeLauncher");
}
package com.android.launcher3.mdm;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
import android.text.TextUtils;
import android.util.Log;
import com.secspace.lib.common.env.SSettingConfig;
import com.secspace.lib.common.utils.DpmHelper;
import com.secspace.mdmengine.api.annotation.WhichFactory;
import com.secspace.mdmengine.api.manager.MdmFactoryManager;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
public class DisableCompat {
private static final String TAG = "DisableCompat";
public static boolean isApplicationEnable(Context context, String packageName) {
try {
PackageManager pm = context.getPackageManager();
int mode = pm.getApplicationEnabledSetting(packageName);
return mode == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT || mode == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
} catch (Exception e) {
Log.e(TAG, "isApplicationEnable Exception: " + e.toString());
e.printStackTrace();
}
return true;
}
public static void enableApplication(Context context, String packageName) {
if (TextUtils.isEmpty(packageName)) {
return;
}
boolean result;
if (SSettingConfig.isUseDeviceOwnerToDisableApp()) {
result = DpmHelper.getInstance(context).hideApplication(packageName, false);
} else {
result = enableApplicationAOSP(context, packageName);
}
Log.i(TAG, "enable: " + packageName + " , result= " + result);
}
public static void disableApplication(Context context, String packageName) {
if (TextUtils.isEmpty(packageName)) {
return;
}
boolean result;
if (SSettingConfig.isUseDeviceOwnerToDisableApp()) {
result = DpmHelper.getInstance(context).hideApplication(packageName, true);
} else {
result = disableApplicationAOSP(context, packageName);
}
Log.d(TAG, "disable: " + packageName + " , result=" + result);
}
private static boolean disableApplicationAOSP(Context context, String packageName) {
if (TextUtils.isEmpty(packageName)) {
return false;
}
MdmFactoryManager.getInstance().switchFactory(WhichFactory.AOSP_SYSTEM);
MdmFactoryManager.getInstance().getDeviceApplicationManager()
.setApplicationEnabledSetting(packageName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
MdmFactoryManager.getInstance().switchFactory(WhichFactory.HUAWEI);
return true;
}
private static boolean enableApplicationAOSP(Context context, String packageName) {
if (TextUtils.isEmpty(packageName)) {
return false;
}
MdmFactoryManager.getInstance().switchFactory(WhichFactory.AOSP_SYSTEM);
MdmFactoryManager.getInstance().getDeviceApplicationManager()
.setApplicationEnabledSetting(packageName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
MdmFactoryManager.getInstance().switchFactory(WhichFactory.HUAWEI);
return true;
}
public static void disableComponent(Context context, ComponentName componentName) {
try {
PackageManager packageManager = context.getPackageManager();
packageManager.setComponentEnabledSetting(componentName, COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
} catch (Exception e) {
}
}
public static void enableComponent(Context context, ComponentName componentName) {
try {
Log.i(TAG, "DisableCompat-enableComponent: " + componentName.toShortString());
PackageManager packageManager = context.getPackageManager();
packageManager.setComponentEnabledSetting(componentName, COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
} catch (Exception e) {
}
}
public static boolean isComponentEnable(Context context, ComponentName componentName) {
try {
PackageManager packageManager = context.getPackageManager();
switch (packageManager.getComponentEnabledSetting(componentName)) {
case COMPONENT_ENABLED_STATE_DEFAULT:
packageManager.setComponentEnabledSetting(componentName, COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
return true;
case COMPONENT_ENABLED_STATE_ENABLED:
return true;
case COMPONENT_ENABLED_STATE_DISABLED:
return false;
case COMPONENT_ENABLED_STATE_DISABLED_USER:
return false;
case COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED:
return true;
default:
packageManager.setComponentEnabledSetting(componentName, COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
return true;
}
} catch (Exception e) {
Log.e(TAG, "enableComponent Error: " + e.toString());
}
return false;
}
}
package com.android.launcher3.mdm;
import android.accounts.AccountManager;
import android.accounts.AuthenticatorDescription;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.support.annotation.StringDef;
import android.text.TextUtils;
import android.util.Log;
import com.secspace.lib.common.env.Packages;
import com.secspace.lib.common.utils.DpmHelper;
import com.secspace.mdmengine.api.manager.MdmFactoryManager;
import java.util.ArrayList;
import java.util.List;
import io.reactivex.Observable;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
/**
* Created by lichuanzhi@tiankuan.net on 2019/3/29
*/
public class DpmOwnerHelper {
private static final String TAG = "DpmOwnerHelper";
private static boolean isSettingDeviceOwner = false;
private static List<String> disabledApps = new ArrayList<>();
/**
* 禁用账户并且移除掉所有其他用户(华为账号,隐私空间,工作空间等)
*/
public static void disableAccountsAndRemoveProfileUsers(final Context context) {
Log.i(TAG, "disableAccountsAndRemoveProfileUsers: 移除用户是否正在设置=" + isSettingDeviceOwner);
if (isSettingDeviceOwner) {
return;
}
isSettingDeviceOwner = true;
try {
AccountManager accountManager = (AccountManager) context.getSystemService(Context.ACCOUNT_SERVICE);
disabledApps.clear();
//此方法必须在主线程中调用
AuthenticatorDescription[] authenticatorTypes = accountManager.getAuthenticatorTypes();
if (authenticatorTypes != null && authenticatorTypes.length > 0) {
for (AuthenticatorDescription authenticatorDescription : authenticatorTypes) {
try {
PackageInfo pi = context.getPackageManager().getPackageInfo(authenticatorDescription.packageName, 0);
// 如果安装,则禁用
DisableCompat.disableApplication(context, authenticatorDescription.packageName);
disabledApps.add(pi.packageName);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
}
MdmFactoryManager.getInstance().getDeviceUserManager().setAddUserDisabled(true);
List<UserInfo> users = MdmFactoryManager.getInstance().getDeviceUserManager().getSystemUserList();
if (users != null && users.size() > 0) {
for (UserInfo userInfo : users) {
if (!userInfo.isPrimary()) {
// 移除所有其他用户
MdmFactoryManager.getInstance().getDeviceUserManager().removeUser(userInfo.id);
}
}
}
Disposable subscribe = Observable.just(context).observeOn(Schedulers.newThread())
.subscribe(new Consumer<Context>() {
@Override
public void accept(Context context) throws Exception {
setDeviceowner(context);
}
});
} catch (Exception e) {
Log.i(TAG, "disableAccountsAndRemoveProfileUsers: " + e.getMessage());
e.printStackTrace();
isSettingDeviceOwner = false;
}
}
private static int COUNT = 0;
private static void setDeviceowner(Context context) throws InterruptedException {
COUNT++;
if (COUNT < 4) {
MdmFactoryManager.getInstance().getDeviceRestrictionManager().setDeviceOwnerApp(Packages.PkgSecSpace.PACKAGENAME_MIDDLEWARE);
if (!DpmHelper.getInstance(context).isMiddlewareDeviceOwner()) {
Log.i(TAG, "disableAccountsAndRemoveProfileUsers: 设置失败!");
Thread.sleep(3000);
setDeviceowner(context);
} else {
recoverAccounts(context);
isSettingDeviceOwner = false;
COUNT = 0;
Log.i(TAG, "disableAccountsAndRemoveProfileUsers: 设置成功!");
}
} else {
Log.i(TAG, "disableAccountsAndRemoveProfileUsers: 到达尝试次数!");
recoverAccounts(context);
isSettingDeviceOwner = false;
COUNT = 0;
}
}
/**
* 恢复禁用的账户
*/
private static void recoverAccounts(Context context) {
MdmFactoryManager.getInstance().getDeviceUserManager().setAddUserDisabled(false);
if (disabledApps != null && disabledApps.size() > 0) {
for (String disableApp : disabledApps) {
if (!TextUtils.isEmpty(disableApp)) {
DisableCompat.enableApplication(context, disableApp.trim());
}
}
//清空文件
disabledApps.clear();
}
}
}
......@@ -6,7 +6,7 @@ import android.content.Intent
import android.text.TextUtils
import com.android.launcher3.Launcher
import com.secspace.lib.common.event.RefreshWorkSpaceEvent
import com.secspace.lib.common.function.SwitchInMdm.addDisallowedRunningApp
import com.secspace.lib.common.function.SwitchInMdm
import com.secspace.lib.common.utils.Prefs
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
......@@ -24,7 +24,7 @@ class AppInstallReceiver : BroadcastReceiver() {
pkgs.add(packageName)
Prefs.setUserShowAppPkgs(context, pkgs)
GlobalScope.launch(Dispatchers.IO) {
addDisallowedRunningApp(context)
SwitchInMdm.getInstance(context).addDisallowedRunningApp()
}
Launcher.forceReload()
EventBus.getDefault().post(RefreshWorkSpaceEvent())
......
......@@ -12,7 +12,7 @@ public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("BootReceiver", "onReceive: "+intent.getAction());
if(Prefs.isAutoStartSelf(context)){
if(Prefs.isInSpace(context)){
Intent intent1=new Intent();
intent1.setClass(context, BlankActivity.class);
intent1.setPackage(context.getPackageName());
......
......@@ -73,7 +73,7 @@ public class WifiScanService extends Service {
}
WifiManagerUtils.getInstance(mContext).isIllegalWifi();
}
if (!Prefs.isAutoStartSelf(mContext)){
if (!Prefs.isInSpace(mContext)){
// writeLog(timeStamp2Date(System.currentTimeMillis())+"\r\n");
// mContext.startService(new Intent(mContext,WifiScanService.class));
}
......
......@@ -62,5 +62,5 @@ dependencies {
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
api project(path: ':lib_common')
implementation 'com.secspace:provider_mdm_engine:1.0.0.40'
// implementation 'com.secspace:provider_mdm_engine:1.0.0.40'
}
package com.sec.tool;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
import android.text.TextUtils;
import android.util.Log;
import com.secspace.lib.common.env.SSettingConfig;
import com.secspace.lib.common.utils.DpmHelper;
import com.secspace.mdmengine.api.annotation.WhichFactory;
import com.secspace.mdmengine.api.manager.MdmFactoryManager;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
public class DisableCompat {
private static final String TAG = "DisableCompat";
public static boolean isApplicationEnable(Context context, String packageName) {
try {
PackageManager pm = context.getPackageManager();
int mode = pm.getApplicationEnabledSetting(packageName);
return mode == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT || mode == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
} catch (Exception e) {
Log.e(TAG, "isApplicationEnable Exception: " + e.toString());
e.printStackTrace();
}
return true;
}
public static void enableApplication(Context context, String packageName) {
if (TextUtils.isEmpty(packageName)) {
return;
}
boolean result;
if (SSettingConfig.isUseDeviceOwnerToDisableApp()) {
result = DpmHelper.getInstance(context).hideApplication(packageName, false);
} else {
result = enableApplicationAOSP(context, packageName);
}
Log.i(TAG, "enable: " + packageName + " , result= " + result);
}
public static void disableApplication(Context context, String packageName) {
if (TextUtils.isEmpty(packageName)) {
return;
}
boolean result;
if (SSettingConfig.isUseDeviceOwnerToDisableApp()) {
result = DpmHelper.getInstance(context).hideApplication(packageName, true);
} else {
result = disableApplicationAOSP(context, packageName);
}
Log.d(TAG, "disable: " + packageName + " , result=" + result);
}
private static boolean disableApplicationAOSP(Context context, String packageName) {
if (TextUtils.isEmpty(packageName)) {
return false;
}
MdmFactoryManager.getInstance().switchFactory(WhichFactory.AOSP_SYSTEM);
MdmFactoryManager.getInstance().getDeviceApplicationManager()
.setApplicationEnabledSetting(packageName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
MdmFactoryManager.getInstance().switchFactory(WhichFactory.HUAWEI);
return true;
}
private static boolean enableApplicationAOSP(Context context, String packageName) {
if (TextUtils.isEmpty(packageName)) {
return false;
}
MdmFactoryManager.getInstance().switchFactory(WhichFactory.AOSP_SYSTEM);
MdmFactoryManager.getInstance().getDeviceApplicationManager()
.setApplicationEnabledSetting(packageName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
MdmFactoryManager.getInstance().switchFactory(WhichFactory.HUAWEI);
return true;
}
public static void disableComponent(Context context, ComponentName componentName) {
try {
PackageManager packageManager = context.getPackageManager();
packageManager.setComponentEnabledSetting(componentName, COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
} catch (Exception e) {
}
}
public static void enableComponent(Context context, ComponentName componentName) {
try {
Log.i(TAG, "DisableCompat-enableComponent: " + componentName.toShortString());
PackageManager packageManager = context.getPackageManager();
packageManager.setComponentEnabledSetting(componentName, COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
} catch (Exception e) {
}
}
public static boolean isComponentEnable(Context context, ComponentName componentName) {
try {
PackageManager packageManager = context.getPackageManager();
switch (packageManager.getComponentEnabledSetting(componentName)) {
case COMPONENT_ENABLED_STATE_DEFAULT:
packageManager.setComponentEnabledSetting(componentName, COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
return true;
case COMPONENT_ENABLED_STATE_ENABLED:
return true;
case COMPONENT_ENABLED_STATE_DISABLED:
return false;
case COMPONENT_ENABLED_STATE_DISABLED_USER:
return false;
case COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED:
return true;
default:
packageManager.setComponentEnabledSetting(componentName, COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
return true;
}
} catch (Exception e) {
Log.e(TAG, "enableComponent Error: " + e.toString());
}
return false;
}
}
......@@ -6,18 +6,16 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import com.secspace.lib.common.dpm.DpmManager;
import com.secspace.lib.common.utils.DeviceUtil;
import com.secspace.lib.common.utils.DpmHelper;
import com.secspace.lib.common.utils.ImeiCheckUtils;
import com.secspace.lib.common.utils.PkgManager;
import com.secspace.lib.common.utils.Prefs;
import com.secspace.mdmengine.api.manager.MdmFactoryManager;
import java.util.List;
......@@ -34,13 +32,13 @@ public class MainActivity extends AppCompatActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImeiCheckUtils.getInstance(this).initImeiList();
startService(new Intent(this,MyService.class));
startService(new Intent(this, MyService.class));
}
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume: "+checkImei());
Log.i(TAG, "onResume: " + checkImei());
if (!checkImei()) {
showPwdDialog(getString(R.string.not__prmission), getString(R.string.work_sure), null, new DialogInterface.OnClickListener() {
@Override
......@@ -53,9 +51,9 @@ public class MainActivity extends AppCompatActivity {
return;
}
try {
DpmHelper.getInstance(this).initMiddleWare();
if (!DpmHelper.getInstance(this).isMiddlewareDPMActived()) {
DpmHelper.getInstance(this).toActivateMiddlewareDpm();
DpmManager.getInstance().init(this);
if (!DpmManager.getInstance().isActive()) {
DpmManager.getInstance().active(DpmManager.getInstance().mAdminName);
}
} catch (Exception e) {
e.printStackTrace();
......@@ -106,23 +104,18 @@ public class MainActivity extends AppCompatActivity {
}
public void remove_forbidden(View view) {
DisableCompat.enableComponent(this, componentName8);
MdmFactoryManager.getInstance().getDeviceSettingsManager().setRestoreFactoryDisabled(false);
MdmFactoryManager.getInstance().getDeviceSettingsManager().clearDefaultLauncher(this.getPackageName());
DisableCompat.enableComponent(this, huaweiLuancher);
DpmManager.getInstance().applicationManager.enableComponent(this, componentName8);
DpmManager.getInstance().settingsManager.setRestoreFactoryDisabled(false);
DpmManager.getInstance().restrictionManager.clearDefaultLauncher();
DpmManager.getInstance().applicationManager.enableComponent(this, huaweiLuancher);
}
public void uninstall_mobile_steward(View view) {
MdmFactoryManager.getInstance().getDeviceRestrictionManager().clearDeviceOwnerApp();
List<String> disabledDeactivateMdmPackageList = MdmFactoryManager.getInstance().getDeviceApplicationManager().getDisabledDeactivateMdmPackageList();
if (disabledDeactivateMdmPackageList != null && disabledDeactivateMdmPackageList.size() > 0) {
MdmFactoryManager.getInstance().getDeviceApplicationManager().removeDisabledDeactivateMdmPackages(disabledDeactivateMdmPackageList);
}
List<String> disallowedUninstallPackageList = MdmFactoryManager.getInstance().getDeviceApplicationManager().getDisallowedUninstallPackageList();
if (disallowedUninstallPackageList != null && disallowedUninstallPackageList.size() > 0) {
MdmFactoryManager.getInstance().getDeviceApplicationManager().removeDisallowedUninstallPackages(disallowedUninstallPackageList);
}
MdmFactoryManager.getInstance().getDeviceSettingsManager().removeActiveAdmin(new ComponentName(PACKAGENAME_MIDDLEWARE, "com.sec.middleware.receiver.DpmReceiver"));
List<String> disabledDeactivateMdmPackageList = DpmManager.getInstance().applicationManager.getDisabledDeactivateMdmPackageList();
DpmManager.getInstance().applicationManager.removeDisabledDeactivateMdmPackages(disabledDeactivateMdmPackageList);
List<String> disallowedUninstallPackageList = DpmManager.getInstance().applicationManager.getDisallowedUninstallPackageList();
DpmManager.getInstance().applicationManager.removeDisallowedUninstallPackages(disallowedUninstallPackageList);
DpmManager.getInstance().removeActive(DpmManager.getInstance().mAdminName);
PkgManager.getInstance(this).uninstallByInstaller("com.secspace.mobilemanager");
PkgManager.getInstance(this).uninstallByInstaller(PACKAGENAME_MIDDLEWARE);
}
......
......@@ -26,7 +26,7 @@ MAVEN_URL=http://192.168.0.170:13000/nexus/content/repositories/releases/
MAVEN_URL_SNAPSHOT=http://192.168.0.170:13000/nexus/content/repositories/releases/
#32位有符号数2147483647(10)
versionIntCode=2020040801
versionIntCode=2020041101
versionNameMajor=1
versionNameMinor=0
......
......@@ -114,11 +114,12 @@ dependencies {
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
annotationProcessor "android.arch.persistence.room:compiler:1.1.1"
api 'com.tk.lib:log:1.0.3'
implementation 'com.secspace:provider_mdm_engine:1.1.0.60'
// implementation 'com.secspace:provider_mdm_engine:1.1.0.60'
implementation files('libs/jxl.jar')
implementation files('libs/activation.aar')
implementation files('libs/update.aar')
implementation files('libs/downloader.aar')
implementation files('libs/mdmkit-10.0.1.300.jar')
// Room
implementation 'com.tk.lib:room:1.0.2'
// Downloader
......
......@@ -6,16 +6,85 @@
android:label="@string/common_sec_permission_default"
android:protectionLevel="signature"></permission>
<!-- 华为权限 -->
<uses-permission android:name="com.huawei.permission.sec.MDM" />
<uses-permission android:name="com.huawei.permission.sec.MDM_SETTINGS_RESTRICTION" />
<uses-permission android:name="com.huawei.permission.sec.MDM_PHONE" />
<uses-permission android:name="com.huawei.permission.sec.MDM_MMS" />
<uses-permission android:name="com.huawei.permission.sec.MDM_APP_MANAGEMENT" />
<uses-permission android:name="com.huawei.permission.sec.MDM_PHONE_MANAGER" />
<uses-permission android:name="com.huawei.permission.sec.MDM_WIFI" />
<uses-permission android:name="com.huawei.permission.sec.MDM_EMAIL" />
<uses-permission android:name="com.huawei.permission.sec.MDM_SDCARD" />
<uses-permission android:name="com.huawei.permission.sec.MDM_USB" />
<uses-permission android:name="com.huawei.permission.sec.MDM_DEVICE_MANAGER" />
<uses-permission android:name="com.huawei.permission.sec.MDM_NFC" />
<uses-permission android:name="com.huawei.permission.sec.MDM_CONNECTIVITY" />
<uses-permission android:name="com.huawei.permission.sec.SDK_LAUNCHER" />
<uses-permission android:name="com.huawei.permission.sec.MDM_APN" />
<uses-permission android:name="com.huawei.permission.sec.MDM_LOCATION" />
<uses-permission android:name="com.huawei.permission.sec.MDM_CAPTURE_SCREEN" />
<uses-permission android:name="com.huawei.permission.sec.MDM_NETWORK_MANAGER" />
<uses-permission android:name="com.huawei.permission.sec.MDM_BLUETOOTH" />
<uses-permission android:name="com.huawei.permission.sec.MDM_VPN" />
<uses-permission android:name="com.huawei.permission.sec.MDM_FIREWALL" />
<uses-permission android:name="com.huawei.permission.sec.MDM_UPDATESTATE_MANAGER" />
<uses-permission android:name="com.huawei.permission.sec.MDM_CLIPBOARD" />
<uses-permission android:name="com.huawei.permission.sec.MDM_GOOGLE_ACCOUNT" />
<uses-permission android:name="com.huawei.permission.sec.MDM_CAMERA" />
<uses-permission android:name="com.huawei.permission.sec.MDM_FINGERPRINT" />
<uses-permission android:name="com.huawei.permission.sec.MDM_TELEPHONY" />
<uses-permission android:name="com.huawei.permission.sec.MDM_KEYGUARD" />
<uses-permission android:name="com.huawei.systemmanager.permission.ACCESS_INTERFACE" />
<!-- 正常权限 -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.SET_WALLPAPER" />
<uses-permission android:name="android.permission.SET_WALLPAPER_HINTS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission
android:name="android.permission.GET_ACCOUNTS"
android:maxSdkVersion="22" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="secspace.permission.sec.Default"></uses-permission>
<uses-permission android:name="middleware.permission.MDM" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="secspace.permission.sec.Default" />
<!-- 系统危险权限 -->
<uses-permission android:name="android.permission.REAL_GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
<uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" />
<uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" />
<uses-permission android:name="android.permission.FORCE_STOP_PACKAGES" />
<uses-permission android:name="android.permission.MANAGE_USERS" />
<uses-permission android:name="android.permission.GET_APP_OPS_STATS" />
<uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" />
<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
<uses-permission android:name="android.permission.REMOVE_TASKS" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.DEVICE_POWER" />
<uses-permission android:name="android.permission.BATTERY_STATS" />
<uses-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY" />
<uses-permission android:name="android.permission.INJECT_EVENTS" />
<uses-permission android:name="android.permission.STATUS_BAR" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<uses-permission android:name="android.permission.CREATE_USERS" />
<uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.DELETE_PACKAGES" />
<uses-permission android:name="android.permission.READ_FRAME_BUFFER" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
<application>
<activity
android:name=".tips.PermissionTipActivity"
......@@ -28,9 +97,11 @@
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity android:name=".AddDeviceAdminActivity"
android:excludeFromRecents="true"/>
<service android:name=".function.ExitService"/>
<activity
android:name=".AddDeviceAdminActivity"
android:excludeFromRecents="true" />
<service android:name=".function.ExitService" />
<service
android:name=".function.service.EduAccessibilityService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
......@@ -41,5 +112,20 @@
android:name="android.accessibilityservice"
android:resource="@xml/work_accessibility" />
</service>
<receiver
android:name=".function.receiver.DpmReceiver"
android:exported="false"
android:label="@string/app_name"
android:permission="android.permission.BIND_DEVICE_ADMIN">
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/my_admin" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>
</application>
</manifest>
......@@ -6,6 +6,8 @@ import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import com.secspace.lib.common.dpm.DpmManager;
/**
* Created by lichuanzhi@tiankuan.net
*/
......
......@@ -45,7 +45,6 @@ public abstract class BaseActivity extends AppCompatActivity implements EasyPerm
public static final String INTENT_FROM_MANUAL = "isFromManual";
private static final String[] RUNTIME_PERMISSIONS = new String[]{
"android.permission.READ_PHONE_STATE",
"android.permission.CALL_PHONE",
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE",
};
......
package com.secspace.lib.common.dialog;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.secspace.lib.common.R;
import com.secspace.lib.common.dialog.other.DialogUIUtils;
import com.secspace.log.Log;
/**
* Created by SKR-CYW on 2017/11/22.
*/
public class LoadingDialog {
private static final String TAG = "SwitcherDialog";
@SuppressLint("StaticFieldLeak")
private static LoadingDialog INST;
public static LoadingDialog getInstance(Context context) {
if (INST == null) {
synchronized (LoadingDialog.class) {
if (INST == null) {
INST = new LoadingDialog(context.getApplicationContext());
}
}
}
return INST;
}
private Context mContext;
private Dialog mDialog;
private Handler mHandler;
private static final int TIMEOUT = 1;
private LoadingDialog(Context context) {
mContext = context.getApplicationContext();
mHandler = new Handler(Looper.getMainLooper(), new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case TIMEOUT:
Log.d(TAG, "switch dialog timeout");
dismiss();
return true;
default:
return false;
}
}
});
}
public void show(String text) {
if (mDialog == null) {
View root;
root = LayoutInflater.from(mContext).inflate(R.layout.dialogui_loading_vertical, null);
View llBg = root.findViewById(R.id.dialogui_ll_bg);
ProgressBar pbBg = root.findViewById(R.id.pb_bg);
TextView tvMsg = root.findViewById(R.id.dialogui_tv_msg);
tvMsg.setText(text);
llBg.setBackgroundResource(R.drawable.dialogui_shape_wihte_round_corner);
pbBg.setIndeterminateDrawable(mContext.getResources().getDrawable(R.drawable.dialogui_rotate_mum));
tvMsg.setTextColor(mContext.getResources().getColor(R.color.text_black));
mDialog = new android.app.AlertDialog.Builder(mContext)
.setView(root)
.setCancelable(false)
.create();
setDialogStyle(mContext, mDialog);
Window window = mDialog.getWindow();
if (window != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
window.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
} else {
window.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
}
}
}
if (!mDialog.isShowing()) {
try {
mDialog.show();
} catch (Exception e) {
e.printStackTrace();
}
}
mHandler.removeMessages(TIMEOUT);
mHandler.sendEmptyMessageDelayed(TIMEOUT, 10000);
}
public void dismiss() {
mHandler.removeMessages(TIMEOUT);
if (mDialog != null && mDialog.isShowing()) {
try {
DialogUIUtils.dismiss(mDialog);
} catch (Exception e) {
e.printStackTrace();
}
}
if (mDialog != null) {
mDialog = null;
}
}
public void setDialogStyle(Context context, Dialog dialog) {
if (dialog == null) {
return;
}
Window window = dialog.getWindow();
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
window.setGravity(Gravity.CENTER);
WindowManager.LayoutParams wl = window.getAttributes();
// 以下这两句是为了保证按钮可以水平满屏
int width = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth();
int height = (int) (((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getHeight() * 0.9);
wl.width = (int) (width * 0.94); // todo keycode to keep gap
wl.height = ViewGroup.LayoutParams.WRAP_CONTENT; //TODO 一般情况下为wrapcontent,最大值为height*0.9
// if (measuredHeight > height) {
// wl.height = height;
// }
if (context instanceof Activity) {
Activity activity1 = (Activity) context;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
if (activity1.isDestroyed()) {
context = DialogUIUtils.appContext;
}
}
} else {
wl.type = WindowManager.LayoutParams.TYPE_TOAST;
//todo keycode to improve window level,同时要让它的后面半透明背景也拦截事件,不要传递到下面去
//todo 单例化,不然连续弹出两次,只能关掉第二次的
}
dialog.onWindowAttributesChanged(wl);
}
}
\ No newline at end of file
package com.secspace.lib.common.dialog
import android.annotation.SuppressLint
import android.app.Activity
import android.app.AlertDialog
import android.app.Dialog
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Build
import android.os.Handler
import android.os.Looper
import android.view.*
import android.widget.ProgressBar
import android.widget.TextView
import com.secspace.lib.common.R
import com.secspace.lib.common.dialog.other.DialogUIUtils
import com.secspace.log.Log
/**
* Created by SKR-CYW on 2017/11/22.
*/
class LoadingDialog private constructor(context: Context) {
private val mContext: Context = context.applicationContext
private var mDialog: Dialog? = null
private val mHandler: Handler
fun show(text: String?) {
if (mDialog == null) {
LayoutInflater.from(mContext).inflate(R.layout.dialogui_loading_vertical, null).apply {
val llBg = findViewById<View>(R.id.dialogui_ll_bg)
val pbBg = findViewById<ProgressBar>(R.id.pb_bg)
val tvMsg = findViewById<TextView>(R.id.dialogui_tv_msg)
tvMsg.text = text
llBg.setBackgroundResource(R.drawable.dialogui_shape_wihte_round_corner)
pbBg.indeterminateDrawable = mContext.resources.getDrawable(R.drawable.dialogui_rotate_mum)
tvMsg.setTextColor(mContext.resources.getColor(R.color.text_black))
mDialog = AlertDialog.Builder(mContext)
.setView(this)
.setCancelable(false)
.create()
setDialogStyle(mDialog)
mDialog?.window?.let {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
it.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY)
} else {
it.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)
}
}
}
}
mDialog?.let {
if (!it.isShowing) it.show()
}
mHandler.removeMessages(TIMEOUT)
mHandler.sendEmptyMessageDelayed(TIMEOUT, 10000)
}
fun dismiss() {
mHandler.removeMessages(TIMEOUT)
mDialog?.dismiss()
mDialog = null
}
private fun setDialogStyle(dialog: Dialog?) {
dialog?.window?.let {
it.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
it.setGravity(Gravity.CENTER)
val width = (mContext.getSystemService(Context.WINDOW_SERVICE) as WindowManager).defaultDisplay.width
it.attributes.width = (width * 0.94).toInt()
it.attributes.height = ViewGroup.LayoutParams.WRAP_CONTENT
dialog.onWindowAttributesChanged(it.attributes)
}
}
companion object {
private const val TAG = "SwitcherDialog"
@SuppressLint("StaticFieldLeak")
private var INST: LoadingDialog? = null
@JvmStatic
fun getInstance(context: Context): LoadingDialog {
if (INST == null) {
synchronized(LoadingDialog::class.java) {
if (INST == null) {
INST = LoadingDialog(context.applicationContext)
}
}
}
return INST!!
}
private const val TIMEOUT = 1
}
init {
mHandler = Handler(Looper.getMainLooper(), Handler.Callback { msg ->
when (msg.what) {
TIMEOUT -> {
Log.d(TAG, "switch dialog timeout")
dismiss()
true
}
else -> false
}
})
}
}
\ No newline at end of file
package com.secspace.lib.common.dpm
import android.content.ComponentName
import android.content.Context
import android.content.pm.PackageManager
import android.text.TextUtils
import com.huawei.android.app.admin.DeviceApplicationManager
import com.huawei.android.app.admin.DevicePackageManager
class ApplicationManager private constructor() : BaseDeviceManager() {
private val mDeviceApplicationManager: DeviceApplicationManager = DeviceApplicationManager()
private val mDevicePackageManager: DevicePackageManager = DevicePackageManager()
companion object {
@JvmStatic
val instance: ApplicationManager by lazy {
ApplicationManager()
}
}
fun addPersistentApp(list: MutableList<String>) = mDeviceApplicationManager.addPersistentApp(mComponent, list)
fun removePersistentApp(list: MutableList<String>) = mDeviceApplicationManager.removePersistentApp(mComponent, list)
fun getPersistentApp(): MutableList<String> = mDeviceApplicationManager.getPersistentApp(mComponent)
fun addDisallowedRunningApp(list: MutableList<String>) = mDeviceApplicationManager.addDisallowedRunningApp(mComponent, list)
fun removeDisallowedRunningApp(list: MutableList<String>) = mDeviceApplicationManager.removeDisallowedRunningApp(mComponent, list)
fun getDisallowedRunningApp(): MutableList<String> = mDeviceApplicationManager.getDisallowedRunningApp(mComponent)
fun killApplicationProcess(pkg: String) = mDeviceApplicationManager.killApplicationProcess(mComponent, pkg)
fun addDisallowedUninstallPackages(pkgs: MutableList<String>) = mDevicePackageManager.addDisallowedUninstallPackages(mComponent, pkgs)
fun removeDisallowedUninstallPackages(pkgs: MutableList<String>) = mDevicePackageManager.removeDisallowedUninstallPackages(mComponent, pkgs)
fun getDisallowedUninstallPackageList(): MutableList<String> = mDevicePackageManager.getDisallowedUninstallPackageList(mComponent)
fun addDisabledDeactivateMdmPackages(pkgs: MutableList<String>) = mDevicePackageManager.addDisabledDeactivateMdmPackages(mComponent, pkgs)
fun removeDisabledDeactivateMdmPackages(pkgs: MutableList<String>) = mDevicePackageManager.removeDisabledDeactivateMdmPackages(mComponent, pkgs)
fun getDisabledDeactivateMdmPackageList(): MutableList<String> = mDevicePackageManager.getDisabledDeactivateMdmPackageList(mComponent)
fun addSingleApp(pkg: String) = mDeviceApplicationManager.addSingleApp(mComponent, pkg)
fun clearSingleApp(pkg: String) = mDeviceApplicationManager.clearSingleApp(mComponent, pkg)
fun getSingleApp() = mDeviceApplicationManager.getSingleApp(mComponent)
fun disableComponent(context: Context, componentName: ComponentName) = context.packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP)
fun enableComponent(context: Context, componentName: ComponentName) = context.packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP)
fun disableApplication(context: Context, packageName: String) = context.packageManager.setApplicationEnabledSetting(packageName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0)
fun enableApplication(context: Context, packageName: String) = context.packageManager.setApplicationEnabledSetting(packageName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0)
}
\ No newline at end of file
package com.secspace.lib.common.dpm
import android.content.ComponentName
open class BaseDeviceManager{
lateinit var mComponent: ComponentName
open fun init(component: ComponentName){
mComponent = component
}
}
\ No newline at end of file
package com.secspace.lib.common.dpm
import android.app.admin.DevicePolicyManager
import android.content.ComponentName
import android.content.Context
import com.secspace.lib.common.function.receiver.DpmReceiver
class DpmManager private constructor() {
private lateinit var mContext: Context
private lateinit var mDevicePolicyManager: DevicePolicyManager
lateinit var mAdminName: ComponentName
lateinit var applicationManager: ApplicationManager
lateinit var hwSystemManager: HwSystemManager
lateinit var restrictionManager: RestrictionManager
lateinit var settingsManager: SettingsManager
fun init(context: Context) {
this.mContext = context.applicationContext
mDevicePolicyManager = mContext.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
mAdminName = ComponentName(mContext, DpmReceiver::class.java)
applicationManager = ApplicationManager.instance.apply {
init(mAdminName)
}
hwSystemManager = HwSystemManager.instance.apply {
init(mAdminName)
}
restrictionManager = RestrictionManager.instance.apply {
init(mAdminName)
}
settingsManager = SettingsManager.instance.apply {
init(mAdminName)
}
}
fun isActive(): Boolean = mDevicePolicyManager.isAdminActive(mAdminName)
fun removeActive(component: ComponentName = mAdminName) = mDevicePolicyManager.removeActiveAdmin(component)
fun active(component: ComponentName = mAdminName) = restrictionManager.setSilentActiveAdmin(component)
companion object {
@JvmStatic
val instance: DpmManager by lazy {
DpmManager()
}
}
}
\ No newline at end of file
package com.secspace.lib.common.dpm
import com.huawei.android.app.admin.DeviceHwSystemManager
class HwSystemManager private constructor() : BaseDeviceManager() {
private val mDeviceHwSystemManager: DeviceHwSystemManager = DeviceHwSystemManager()
companion object {
@JvmStatic
val instance: HwSystemManager by lazy {
HwSystemManager()
}
}
fun setSuperWhiteListForHwSystemManger(list: ArrayList<String>): Boolean = mDeviceHwSystemManager.setSuperWhiteListForHwSystemManger(mComponent, list)
fun removeSuperWhiteListForHwSystemManger(list: ArrayList<String>): Boolean = mDeviceHwSystemManager.removeSuperWhiteListForHwSystemManger(mComponent, list)
}
\ No newline at end of file
package com.secspace.lib.common.dpm
import android.app.admin.DevicePolicyManager
import android.content.ComponentName
import android.content.Context
import com.huawei.android.app.admin.DeviceSettingsManager
class PolicyManager private constructor() : BaseDeviceManager() {
private val mDeviceSettingsManager: DeviceSettingsManager = DeviceSettingsManager()
private lateinit var mDevicePolicyManager: DevicePolicyManager
private lateinit var mContext: Context
companion object {
@JvmStatic
val instance: PolicyManager by lazy {
PolicyManager()
}
}
fun init(component: ComponentName, devicePolicyManager: DevicePolicyManager, context: Context) {
super.init(component)
this.mDevicePolicyManager = devicePolicyManager
this.mContext = context
}
fun addDisallowedUninstallPackages(pkgs: MutableList<String>) = pkgs.forEach {
mDevicePolicyManager.setUninstallBlocked(mComponent, it, true)
}
fun removeDisallowedUninstallPackages(pkgs: MutableList<String>) = pkgs.forEach {
mDevicePolicyManager.setUninstallBlocked(mComponent, it, false)
}
}
\ No newline at end of file
package com.secspace.lib.common.dpm
import android.content.ComponentName
import com.huawei.android.app.admin.DeviceControlManager
import com.huawei.android.app.admin.DeviceRestrictionManager
class RestrictionManager private constructor() : BaseDeviceManager() {
private val mDeviceRestrictionManager: DeviceRestrictionManager = DeviceRestrictionManager()
private val mDeviceControlManager: DeviceControlManager = DeviceControlManager()
companion object {
@JvmStatic
val instance: RestrictionManager by lazy {
RestrictionManager()
}
}
fun setStatusBarExpandPanelDisabled(disabled: Boolean) = mDeviceRestrictionManager.setStatusBarExpandPanelDisabled(mComponent, disabled)
fun isStatusBarExpandPanelDisabled() = mDeviceRestrictionManager.isStatusBarExpandPanelDisabled(mComponent)
fun setBluetoothDisabled(disabled: Boolean) = mDeviceRestrictionManager.setBluetoothDisabled(mComponent, disabled)
fun isBluetoothDisabled() = mDeviceRestrictionManager.isBluetoothDisabled(mComponent)
fun setGPSDisabled(disabled: Boolean) = mDeviceRestrictionManager.setGPSDisabled(mComponent, disabled)
fun isGPSDisabled() = mDeviceRestrictionManager.isGPSDisabled(mComponent)
fun setAdbDisabled(disabled: Boolean) = mDeviceRestrictionManager.setAdbDisabled(mComponent, disabled)
fun isAdbDisabled() = mDeviceRestrictionManager.isAdbDisabled(mComponent)
fun setUSBOtgDisabled(disabled: Boolean) = mDeviceRestrictionManager.setUSBOtgDisabled(mComponent, disabled)
fun isUSBOtgDisabled() = mDeviceRestrictionManager.isUSBOtgDisabled(mComponent)
fun setSystemUpdateDisabled(disabled: Boolean) = mDeviceRestrictionManager.setSystemUpdateDisabled(mComponent, disabled)
fun isSystemUpdateDisabled() = mDeviceRestrictionManager.isSystemUpdateDisabled(mComponent)
fun setTaskButtonDisabled(disabled: Boolean) = mDeviceRestrictionManager.setTaskButtonDisabled(mComponent, disabled)
fun isTaskButtonDisabled() = mDeviceRestrictionManager.isTaskButtonDisabled(mComponent)
fun setHomeButtonDisabled(disabled: Boolean) = mDeviceRestrictionManager.setHomeButtonDisabled(mComponent, disabled)
fun isHomeButtonDisabled() = mDeviceRestrictionManager.isHomeButtonDisabled(mComponent)
fun setBackButtonDisabled(disabled: Boolean) = mDeviceRestrictionManager.setBackButtonDisabled(mComponent, disabled)
fun isBackButtonDisabled() = mDeviceRestrictionManager.isBackButtonDisabled(mComponent)
fun setSysTime(millis: Long) = mDeviceControlManager.setSysTime(mComponent, millis)
fun setDefaultLauncher(packageName: String, className: String) = mDeviceControlManager.setDefaultLauncher(mComponent, packageName, className)
fun clearDefaultLauncher() = mDeviceControlManager.clearDefaultLauncher(mComponent)
fun captureScreen() = mDeviceControlManager.captureScreen(mComponent)
fun setSilentActiveAdmin(component: ComponentName = mComponent) = mDeviceControlManager.setSilentActiveAdmin(component)
fun setUSBDataDisabled(disabled: Boolean) = mDeviceRestrictionManager.setUSBDataDisabled(mComponent, disabled)
fun isUSBDataDisabled() = mDeviceRestrictionManager.isUSBDataDisabled(mComponent)
fun setExternalStorageDisabled(disabled: Boolean) = mDeviceRestrictionManager.setExternalStorageDisabled(mComponent, disabled)
fun isExternalStorageDisabled() = mDeviceRestrictionManager.isExternalStorageDisabled(mComponent)
}
\ No newline at end of file
package com.secspace.lib.common.dpm
import com.huawei.android.app.admin.DeviceSettingsManager
class SettingsManager private constructor() : BaseDeviceManager() {
private val mDeviceSettingsManager: DeviceSettingsManager = DeviceSettingsManager()
companion object {
@JvmStatic
val instance: SettingsManager by lazy {
SettingsManager()
}
}
fun setFontSize(size: Int) = mDeviceSettingsManager.setFontSize(mComponent, size)
fun setRestoreFactoryDisabled(disable: Boolean) = mDeviceSettingsManager.setRestoreFactoryDisabled(mComponent, disable)
fun isRestoreFactoryDisabled() = mDeviceSettingsManager.isRestoreFactoryDisabled(mComponent)
}
\ No newline at end of file
......@@ -66,7 +66,7 @@ class BuyCodeDialog private constructor(val mContext: Context) : DialogInterface
when (v.id) {
R.id.btn_accept -> {
dismiss()
WorkManager.removeForbidden(mContext)
WorkManager.getInstance(mContext).removeForbidden()
active(mContext, object : ActivationListener {
override fun activationFailed() {}
override fun activated() {
......@@ -76,7 +76,7 @@ class BuyCodeDialog private constructor(val mContext: Context) : DialogInterface
}
R.id.btn_exit -> {
dismiss()
WorkManager.removeForbidden(mContext)
WorkManager.getInstance(mContext).removeForbidden()
}
}
}
......@@ -84,7 +84,7 @@ class BuyCodeDialog private constructor(val mContext: Context) : DialogInterface
companion object {
@Volatile
private var instance: BuyCodeDialog? = null
@JvmStatic
fun getInstance(context: Context): BuyCodeDialog {
if (instance == null) {
synchronized(BuyCodeDialog::class) {
......
......@@ -3,50 +3,15 @@ package com.secspace.lib.common.function
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.content.DialogInterface
import android.view.View
import com.secspace.lib.common.R
import com.secspace.lib.common.dialog.SimpleDialog
import com.secspace.lib.common.dialog.SwitcherDialog
import com.secspace.lib.common.dialog.other.DialogUIListener
import com.secspace.lib.common.dialog.other.DialogUIUtils
import com.secspace.lib.common.event.ExitEvent
import com.secspace.lib.common.function.DpmOwnerHelper.disableAccountsAndRemoveProfileUsers
import com.secspace.lib.common.function.DpmOwnerHelper.isSettingDeviceOwner
import com.secspace.lib.common.function.DpmOwnerHelper.removeOtherUsers
import com.secspace.lib.common.function.WorkManager.installMiddleWare
import org.greenrobot.eventbus.EventBus
/**
* Created by cyw_m on 2018/4/6.
*/
@SuppressLint("StaticFieldLeak")
object DialogManager {
private var mSimpleDialog: SimpleDialog? = null
/**
* 安装中间件弹窗
*/
fun showInstallMiddleWare(activity: Activity) {
val context: Context = activity.application
mSimpleDialog = SimpleDialog(activity).show(context.resources.getString(R.string.common_remind)
, context.resources.getString(R.string.common_need_install_middleware)
, false
, DialogInterface.OnClickListener { dialog, which ->
installMiddleWare(context)
dialog.dismiss()
}
, null
)
}
/**
* 关闭普通dialog
*/
fun dismissSimpleDialog() {
if (mSimpleDialog != null) {
mSimpleDialog!!.dismiss()
}
}
fun showPrivacyPolicyDialog(activity: Activity?) {
PrivacyPolicyDialog(activity).show()
......
package com.secspace.lib.common.function
import android.accounts.AccountManager
import android.content.Context
import android.content.pm.PackageManager
import android.os.Environment
import android.os.Handler
import com.secspace.lib.common.utils.DisableCompat
import com.secspace.lib.common.utils.IntentUtil
import com.secspace.log.Log
import com.secspace.mdmengine.api.manager.MdmFactoryManager
import java.io.File
import java.io.FileReader
import java.io.FileWriter
/**
* Created by lichuanzhi@tiankuan.net on 2019/3/29
*/
object DpmOwnerHelper {
private const val TAG = "DpmOwnerHelper"
private const val DISABLED_ACCOUNT_APP_FILE = "disableAccountApps.txt"
var isSettingDeviceOwner = false;
private val mHandler = Handler()
/**
* 禁用账户并且移除掉所有其他用户(华为账号,隐私空间,工作空间等)
*/
fun disableAccountsAndRemoveProfileUsers(context: Context) {
if (isSettingDeviceOwner) {
return
}
isSettingDeviceOwner = true
try {
val accountManager = context.getSystemService(Context.ACCOUNT_SERVICE) as AccountManager
val disabledApps = ArrayList<String>()
val map = HashMap<String, String>()
accountManager.authenticatorTypes.forEach {
map[it.type] = it.packageName
Log.d(TAG, "authenticatorTypes:${it.type}, ${it.packageName}")
}
accountManager.accounts.forEach {
try {
Log.d(TAG, "accounts:${map.keys}, ${it.type}")
if (map.keys.contains(it.type)){
map[it.type]?.let {
pkg -> disabledApps.add(pkg)
DisableCompat.disableApplication(context, pkg)
}
}
} catch (e: PackageManager.NameNotFoundException) {
e.printStackTrace()
}
}
if (disabledApps.size > 0) {
writeDisabledApps(context, disabledApps)
}
//MdmFactoryManager.getInstance().deviceUserManager.isAddUserDisabled = true
val users = MdmFactoryManager.getInstance().deviceUserManager.systemUserList
users?.forEach {
if (!it.isPrimary) {
// 移除所有其他用户
MdmFactoryManager.getInstance().deviceUserManager.removeUser(it.id)
}
}
mHandler.postDelayed({
IntentUtil.activateMdmServiceDeviceOwner(context)
isSettingDeviceOwner = false
}, 8 * 1000)
mHandler.postDelayed({
recoverAccounts(context)
}, 10 * 1000)
} catch (e: Exception) {
Log.e(TAG, Log.getStackTraceString(e))
isSettingDeviceOwner = false
}
}
/**
* 恢复禁用的账户
*/
fun recoverAccounts(context: Context) {
try {
val disabledApps = readDisabledApps(context)
disabledApps?.map {
if (it.trim().isNotEmpty()) {
DisableCompat.enableApplication(context, it.trim())
}
}
} catch (e: java.lang.Exception) {
e.printStackTrace()
}
}
private fun writeDisabledApps(context: Context, disabledApps: List<String>) {
val dir = File(Environment.getExternalStorageDirectory().absolutePath + File.separator + "." + context.packageName)
if (!dir.exists()) {
dir.mkdirs()
}
val writer = FileWriter(File(dir, DISABLED_ACCOUNT_APP_FILE), false)
writer.write(disabledApps.joinToString())
writer.close()
}
private fun readDisabledApps(context: Context): List<String>? {
val dir = File(Environment.getExternalStorageDirectory().absolutePath + File.separator + "." + context.packageName)
if (!dir.exists()) {
return null
}
val file = File(dir, DISABLED_ACCOUNT_APP_FILE)
if (!file.exists()) {
return null
}
return FileReader(file).readText().split(",")
}
fun removeOtherUsers(){
val users = MdmFactoryManager.getInstance().deviceUserManager.systemUserList
users?.forEach {
if (!it.isPrimary) {
// 移除所有其他用户
MdmFactoryManager.getInstance().deviceUserManager.removeUser(it.id)
}
}
}
}
\ No newline at end of file
......@@ -6,7 +6,6 @@ import android.content.Intent
import android.os.IBinder
import android.util.Log
import com.secspace.lib.common.dialog.LoadingDialog
import com.secspace.lib.common.dialog.SwitcherDialog
import com.secspace.lib.common.utils.IntentUtil
import com.secspace.lib.common.utils.Prefs
import com.secspace.lib.common.utils.closeAccessibility
......@@ -14,7 +13,7 @@ import kotlinx.coroutines.*
class ExitService : Service() {
private val TAG = "ExitService"
private var mAppContext: Context? = null
private lateinit var mAppContext: Context
private var outing = false
override fun onBind(intent: Intent?): IBinder? {
......@@ -31,9 +30,9 @@ class ExitService : Service() {
LoadingDialog.getInstance(mAppContext).show("切换中")
GlobalScope.launch(Dispatchers.IO) {
closeAccessibility(mAppContext as ExitService)
(mAppContext as ExitService).closeAccessibility()
Prefs.setMdmInitializedWhenEnter(mAppContext, false)
WorkManager.exit(mAppContext)
WorkManager.getInstance(mAppContext).exit()
delay(1500)
withContext(Dispatchers.Main) {
IntentUtil.startSystemLauncher(mAppContext)
......
package com.secspace.lib.common.function
import android.content.Context
import com.secspace.lib.common.dialog.LoadingDialog
import com.secspace.lib.common.env.Packages
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.util.ArrayList
import java.util.*
abstract class ISwitch {
private suspend fun initStart(context: Context) = withContext(Dispatchers.Main) {
LoadingDialog.getInstance(context).show("切换中")
}
private suspend fun initEnd(context: Context) = withContext(Dispatchers.Main) {
LoadingDialog.getInstance(context).dismiss()
}
suspend fun onInit(context: Context) {
initStart(context)
init(context)
initEnd(context)
}
suspend fun onExit(context: Context){
init(context)
}
protected abstract suspend fun init(context: Context)
protected abstract suspend fun init()
protected fun getPersistentList(context: Context): List<String?>? {
var list: MutableList<String?>? = null
if (list == null) {
list = ArrayList()
}
if (list.size > 0) {
list.clear()
}
protected fun getPersistentList(context: Context): MutableList<String>{
val list: MutableList<String> = ArrayList()
list.add(context.packageName)
list.add(Packages.PkgSecSpace.PACKAGENAME_MIDDLEWARE)
return list
}
}
\ No newline at end of file
......@@ -2,132 +2,103 @@ package com.secspace.lib.common.function
import android.content.Context
import android.content.Intent
import android.content.pm.ApplicationInfo
import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import android.content.pm.ResolveInfo
import android.util.Log
import com.secspace.lib.common.arouter.libwork.IWorkApi
import com.secspace.lib.common.env.Packages.PkgSecSpace
import com.secspace.lib.common.utils.DisableCompat
import com.secspace.lib.common.utils.DpmHelper
import com.secspace.lib.common.utils.MdmUtils
import com.secspace.lib.common.utils.Package.ComponentNames.COMPONENT_UPDATE_SYSTEM
import com.secspace.lib.common.utils.Package.ComponentNames.EnterprisePrivacySettingsActivity
import com.secspace.lib.common.dpm.DpmManager
import com.secspace.lib.common.env.Packages.PkgHuaWei.PACKAGENAME_HW_LAUNCHER
import com.secspace.lib.common.utils.Package.ComponentNames.*
import com.secspace.lib.common.utils.PkgManager
import com.secspace.lib.common.utils.Prefs
import com.secspace.mdmengine.api.manager.MdmFactoryManager
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import java.util.*
object SwitchOutMdm: ISwitch() {
private var context: Context? = null
private val TAG = "SwitchOutMdm"
class SwitchOutMdm constructor(var context: Context) : ISwitch() {
private fun removeDisallowedRunningApp(){
val mdmFactoryManager = MdmFactoryManager.getInstance()
mdmFactoryManager.deviceApplicationManager?.let {
val list = it.disallowedRunningApp
it.removeDisallowedRunningApp(list)
Log.e(TAG, "remove:${list}")
}
public override suspend fun init() {
Prefs.setInSpace(context, false)
recover()
clearDefaultLauncher()
removeDisallowedRunningApp()
clearProcesses()
killBackgroundApplication()
}
private fun recover(context: Context) {
val mdmFactoryManager = MdmFactoryManager.getInstance()
Prefs.setAutoStartSelf(context, false)
mdmFactoryManager.deviceApplicationManager?.let {
private fun removeDisallowedRunningApp() = DpmManager.instance.applicationManager.let {
it.removeDisallowedRunningApp(it.getDisallowedRunningApp())
}
private fun recover() {
DpmManager.instance.applicationManager.let {
it.removePersistentApp(getPersistentList(context))
it.setApplicationEnabledSetting("com.huawei.powergenie", PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 1)
it.enableComponent(context, COMPONENT_UPDATE_SYSTEM)
it.enableComponent(context, COMPONENT_ENTERPRISE_PRIVACY_SETTING)
}
mdmFactoryManager.deviceRestrictionManager?.let {
it.isAdbDisabled = false
it.isUSBOtgDisabled = false
it.isUSBDataDisabled = false
it.isExternalStorageDisabled = false
it.isStatusBarExpandPanelDisabled = false
}
mdmFactoryManager.deviceSettingsManager?.let {
it.isRestoreFactoryDisabled = false
it.isSystemUpdateDisabled = false
DpmManager.instance.restrictionManager.let {
it.setAdbDisabled(false)
it.setUSBOtgDisabled(false)
it.setUSBDataDisabled(false)
it.setExternalStorageDisabled(false)
it.setStatusBarExpandPanelDisabled(false)
it.setSystemUpdateDisabled(false)
}
DpmManager.instance.settingsManager.setRestoreFactoryDisabled(false)
DisableCompat.enableComponent(context, COMPONENT_UPDATE_SYSTEM)
DisableCompat.enableComponent(context, EnterprisePrivacySettingsActivity)
}
private fun clearProcesses() {
val dam = MdmFactoryManager.getInstance().deviceApplicationManager
dam?.let {
//clear task
val runningTasks = it.getRunningTasks(1000)
if (runningTasks != null) {
for (task in runningTasks) {
val pkg = task.baseActivity.packageName
if (pkg == context?.packageName || pkg == PkgSecSpace.PACKAGENAME_MIDDLEWARE || pkg == "com.android.systemui") {
continue
}
it.removeTask(task.id)
Log.d(TAG, "remove task " + task.baseActivity.packageName)
}
}
//clear processes
val runningAppProcesses = it.runningAppProcesses
val packages = getAllPackages(PackageManager.MATCH_UNINSTALLED_PACKAGES)
if (runningAppProcesses != null) {
for (processInfo in runningAppProcesses) {
val processName = processInfo.processName
if (!packages.contains(processName)) {
continue
}
if (processName == PkgSecSpace.PACKAGENAME_MIDDLEWARE || context?.packageName == processName || processName == "com.huawei.powergenie") {
continue
}
it.killApplicationProcess(processName)
it.forceStopPackage(processName)
Log.d(TAG, "kill $processName")
}
val mainIntent = Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER)
val resolveInfos: List<ResolveInfo> = context.packageManager.queryIntentActivities(mainIntent, 0)
for (resolveInfo in resolveInfos) {
val packageName = resolveInfo.activityInfo.packageName
if (getPersistentList(context).contains(packageName)) {
continue
}
Log.e(TAG, "clearProcesses:$packageName")
DpmManager.instance.applicationManager.killApplicationProcess(packageName)
}
}
private fun getAllPackages(flags: Int): List<String> {
val packageInfos = getAllPackageInfo(flags)
val list: MutableList<String> = ArrayList()
for (i in packageInfos.indices) {
list.add(packageInfos[i].packageName)
}
return list
}
private fun getAllPackageInfo(flags: Int): List<PackageInfo> {
return context!!.packageManager.getInstalledPackages(flags)
}
private fun killBackgroundApplication() {
val packageManager: PackageManager? = context?.packageManager
val mainIntent = Intent(Intent.ACTION_MAIN, null)
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER)
val apps = packageManager?.queryIntentActivities(mainIntent, 0)
val apps = context.packageManager.queryIntentActivities(mainIntent, 0)
for (i in apps?.indices!!) {
val name = apps[i].activityInfo.packageName
Log.i(TAG, "killBackgroundApplication: $name")
if (context?.packageName?.let { name.contains(it) }!! || name == PkgSecSpace.PACKAGENAME_MIDDLEWARE) {
if (getPersistentList(context).contains(name)) {
continue
}
MdmFactoryManager.getInstance().deviceApplicationManager?.forceStopPackage(name)
PkgManager.getInstance(context).foceStopApp(name)
}
}
override suspend fun init(context: Context) {
this.context = context
Prefs.setInSpace(context, false)
recover(context)
MdmUtils.clearDefaultLauncher(context)
removeDisallowedRunningApp()
clearProcesses()
killBackgroundApplication()
private fun clearDefaultLauncher() {
DpmManager.instance.applicationManager.enableComponent(context, COMPONENT_HUAWEI_LUANCHER)
DpmManager.instance.restrictionManager.clearDefaultLauncher()
val launchers = Prefs.getHideLauncherPackages(context)
if (!launchers.contains(PACKAGENAME_HW_LAUNCHER)) {
launchers.add(PACKAGENAME_HW_LAUNCHER)
}
launchers.forEach {
DpmManager.instance.applicationManager.enableApplication(context, it)
}
}
companion object {
private const val TAG = "SwitchOutMdm"
@Volatile
private var instance: SwitchOutMdm? = null
@JvmStatic
fun getInstance(context: Context): SwitchOutMdm {
if (instance == null) {
synchronized(SwitchOutMdm::class) {
if (instance == null) {
instance = SwitchOutMdm(context.applicationContext)
}
}
}
return instance!!
}
}
}
\ No newline at end of file
......@@ -8,7 +8,7 @@ import android.os.Handler
import android.os.Looper
import android.os.SystemClock
import com.secspace.lib.common.R
import com.secspace.lib.common.env.Packages.PkgSecSpace
import com.secspace.lib.common.dpm.DpmManager
import com.secspace.lib.common.env.SEnvironment
import com.secspace.lib.common.function.ActivationHelper.ActivationListener
import com.secspace.lib.common.function.ActivationHelper.active
......@@ -16,77 +16,47 @@ import com.secspace.lib.common.function.DialogManager.MessageListener
import com.secspace.lib.common.function.DialogManager.showActivateLoseDialog
import com.secspace.lib.common.utils.*
import com.secspace.log.Log
import com.secspace.mdmengine.api.manager.MdmFactoryManager
import com.skr.activation.network.linstener.CheckActiveStatusListener
import kotlinx.coroutines.*
import java.io.File
object WorkManager {
private val TAG = "SecSpaceWorkManager"
private lateinit var mContext: Context
class WorkManager private constructor(var context: Context) {
private val mHandler: Handler = Handler(Looper.getMainLooper(), Handler.Callback { true })
private var mEnterTime: Long = 0
private var isChecksCompleted = false
private val SYSTEM_AGENT_RUNTIME_PERMISSIONS = arrayOf(
"android.permission.READ_PHONE_STATE",
"android.permission.WRITE_EXTERNAL_STORAGE",
"android.permission.READ_EXTERNAL_STORAGE"
)
fun enter(launcher: Activity?) {
mContext = launcher!!.applicationContext
val isMdmInitialized = Prefs.isMdmInitializedWhenEnter(mContext)
fun enter(launcher: Activity) {
val isMdmInitialized = Prefs.isMdmInitializedWhenEnter(context)
if (isChecksCompleted && isMdmInitialized) {
Log.i(TAG, "isMdmInitialized: $isMdmInitialized, isChecksCompleted:$isChecksCompleted")
return
}
mEnterTime = SystemClock.uptimeMillis()
//检查中间件是否是最新的
if (!DpmHelper.getInstance(mContext).isMiddlewareLatest) {
DialogManager.showInstallMiddleWare(launcher)
return
}
DpmManager.instance.init(context)
DpmHelper.getInstance(mContext).initMiddleWare()
//检查中间件是否激活
if (!DpmHelper.getInstance(mContext).isMiddlewareDPMActived) {
MdmFactoryManager.getInstance().deviceSettingsManager.setSilentActiveAdmin(DpmHelper.getInstance(mContext).middleWareAdmin)
Log.i(TAG, "silent active middleware")
}
//安装耗时,检查是否都是最新的
if (!DpmHelper.getInstance(mContext).isMiddlewareLatest) {
Log.i(TAG, "will install delay")
mHandler.postDelayed({ enter(launcher) }, 2000)
return
}
//检查系统代理件动态权限
if (!hasPermissions(SYSTEM_AGENT_RUNTIME_PERMISSIONS, PkgSecSpace.PACKAGENAME_MIDDLEWARE)) {
IntentUtil.startRuntimePermissionActivity(mContext, PkgSecSpace.PACKAGENAME_MIDDLEWARE)
Log.i(TAG, "system agent request runtime permission")
return
if (!DpmManager.instance.isActive()) {
DpmManager.instance.active()
}
// LoadingDialog.getInstance(launcher).show("切换中")
GlobalScope.launch(Dispatchers.IO) {
// TODO 暂时屏蔽
// openAccessibility(launcher)
SwitchInMdm.onInit(launcher)
launcher.openAccessibility()
SwitchInMdm.getInstance(context).init()
activate(launcher)
withContext(Dispatchers.Main){
if(Prefs.isTips(launcher)){
withContext(Dispatchers.Main) {
if (Prefs.isTips(launcher)) {
DialogManager.showMessageDialogOnlySure(launcher, launcher.getString(R.string.common_remind), launcher.getString(R.string.edu_item_first_install_tips), null)
Prefs.setTips(launcher, false)
}
}
// checkLocalUpdateFile() //检查本地更新文件
checkLocalUpdateFile() //检查本地更新文件
delay(5000)
ActivationHelper.checkActivate(launcher, EduCheckActiveStatusListener(launcher))
}
isChecksCompleted = true
Prefs.setMdmInitializedWhenEnter(mContext, true)
Prefs.setMdmInitializedWhenEnter(context, true)
}
fun activate(activity: Activity) {
private fun activate(activity: Activity) {
active(activity, object : ActivationListener {
override fun activationFailed() {
showActivateLoseDialog(activity, activity.getString(R.string.common_remind)
......@@ -103,10 +73,8 @@ object WorkManager {
}, false)
}
fun exit(context: Context?) {
GlobalScope.launch(Dispatchers.IO) {
context?.let { SwitchOutMdm.onExit(it) }
}
fun exit() = GlobalScope.launch(Dispatchers.IO) {
SwitchOutMdm.getInstance(context).init()
}
private fun hasPermissions(permissions: Array<String>, packageName: String): Boolean {
......@@ -116,7 +84,7 @@ object WorkManager {
val length = permissions.size
for (i in 0 until length) {
val permission = permissions[i]
if (mContext.packageManager.checkPermission(permission, packageName) != PackageManager.PERMISSION_GRANTED) {
if (context.packageManager.checkPermission(permission, packageName) != PackageManager.PERMISSION_GRANTED) {
return false
}
}
......@@ -129,7 +97,7 @@ object WorkManager {
*/
private fun checkLocalUpdateFile() {
Log.d(TAG, "check local update file")
val dir = File(mContext.getExternalFilesDir(""), "Download")
val dir = File(context.getExternalFilesDir(""), "Download")
if (!dir.exists()) {
Log.i(TAG, "Download dir is not exist.")
return
......@@ -140,10 +108,10 @@ object WorkManager {
return
}
var updateFile: File? = null
val currentVCode = PkgManager.getInstance(mContext).getVersionCodeFromPackage(mContext.packageName)
val currentVCode = PkgManager.getInstance(context).getVersionCodeFromPackage(context.packageName)
var newVCode = -1
for (file: File in files) {
val fileCode = PkgManager.getInstance(mContext).getStorageApkVersionCode(file.absolutePath)
val fileCode = PkgManager.getInstance(context).getStorageApkVersionCode(file.absolutePath)
if (newVCode < fileCode) {
newVCode = fileCode
updateFile = file
......@@ -159,16 +127,16 @@ object WorkManager {
return
}
Log.i(TAG, "Will install update File: " + updateFile.absolutePath)
ToastUtil.showShort(mContext, "更新中...")
ToastUtil.showShort(context, "更新中...")
install(updateFile.absolutePath)
}
private fun pathFromAssets(name: String): String {
return mContext.externalCacheDir.absolutePath + File.separator + name
return context.externalCacheDir.absolutePath + File.separator + name
}
private fun install(path: String) {
PkgManager.getInstance(mContext).installByInstaller(path)
PkgManager.getInstance(context).installByInstaller(path)
}
/**
......@@ -180,10 +148,10 @@ object WorkManager {
install(path)
}
fun removeForbidden(context: Context) {
fun removeForbidden() {
Prefs.setMdmInitializedWhenEnter(context, false)
GlobalScope.launch(Dispatchers.IO) {
SwitchOutMdm.onExit(context)
SwitchOutMdm.getInstance(context).init()
UninstallUtil.removeForbidden(context)
}
}
......@@ -236,4 +204,23 @@ object WorkManager {
}
}
companion object {
private const val TAG = "EduSpaceWorkManager"
@Volatile
private var instance: WorkManager? = null
@JvmStatic
fun getInstance(context: Context): WorkManager {
if (instance == null) {
synchronized(WorkManager::class) {
if (instance == null) {
instance = WorkManager(context.applicationContext)
}
}
}
return instance!!
}
}
}
\ No newline at end of file
......@@ -60,7 +60,7 @@ class DatabaseManager private constructor(val context: Context) {
companion object {
@Volatile
private var instance: DatabaseManager? = null
@JvmStatic
fun getInstance(context: Context): DatabaseManager {
if (instance == null) {
synchronized(DatabaseManager::class) {
......
package com.secspace.lib.common.function.receiver;
import android.app.admin.DeviceAdminReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.PersistableBundle;
import android.util.Log;
import static com.skr.activation.constant.Constant.GLOBAL_TAG;
public class DpmReceiver extends DeviceAdminReceiver {
@Override
public void onEnabled(Context context, Intent intent) {
Log.i(GLOBAL_TAG, "onEnabled");
context.sendBroadcast(new Intent("com.edu.DPM_ENABLE").addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES));
}
@Override
public void onDisabled(Context context, Intent intent) {
Log.i(GLOBAL_TAG, "onDisabled");
context.sendBroadcast(new Intent("com.edu.DPM_DISABLED").addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES));
}
@Override
public CharSequence onDisableRequested(Context context, Intent intent) {
Log.i(GLOBAL_TAG, "onDisableRequested");
context.sendBroadcast(new Intent("com.edu.DPM_DISABLE_REQUESTED").addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES));
return "onDisableRequested";
}
@Override
public void onTransferOwnershipComplete(Context context, PersistableBundle bundle) {
super.onTransferOwnershipComplete(context, bundle);
Log.i(GLOBAL_TAG, "onTransferOwnershipComplete");
context.sendBroadcast(new Intent("com.edu.DPM_TRANSFER_OWNERSHIP_COMPLETE").addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES));
}
}
\ No newline at end of file
......@@ -5,6 +5,8 @@ import android.util.Log
import com.secspace.lib.common.function.database.DatabaseManager
import com.secspace.lib.common.function.model.UseApp
import com.secspace.lib.common.function.model.UseTime
import com.secspace.lib.common.utils.drawableToString
import com.secspace.lib.common.utils.getApplicationIcon
import com.secspace.lib.common.utils.getApplicationName
class UseAppManager private constructor(val context: Context) {
......@@ -80,9 +82,9 @@ class UseAppManager private constructor(val context: Context) {
useApp.appPackage = packageName
useApp.uploadTime = 0
DatabaseManager.getInstance(context).getUseAppDao()?.insertUseApp(useApp)
// val icon = getApplicationIcon(context, packageName)
val icon = getApplicationIcon(context, packageName)
// 将图片转为字符串
// val iconString = drawableToString(icon)
val iconString = icon?.drawableToString()
// 将字符串写入文件,因为日志无法打印全
// Log.e(TAG, "文件写入完毕")
// write2File(iconString,Environment.getExternalStorageDirectory().toString() + "/temp1.txt")
......
package com.secspace.lib.common.utils;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
import android.text.TextUtils;
import android.util.Log;
import com.secspace.lib.common.env.SSettingConfig;
import com.secspace.mdmengine.api.annotation.WhichFactory;
import com.secspace.mdmengine.api.manager.MdmFactoryManager;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
public class DisableCompat {
private static final String TAG = "DisableCompat";
public static final String PACKAGENAME_WORKSPACE = "com.safe.workspace";
public static final String CCOMPONENT_WORKSPACE_ADMIN_CLASS = "ch.deletescape.lawnchair.DeviceAdminReceiver";
public static void disableComponent(Context context, ComponentName componentName) {
try {
PackageManager packageManager = context.getPackageManager();
packageManager.setComponentEnabledSetting(componentName, COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
} catch (Exception e) {
Log.e(TAG, "disableComponent Error: " + e.toString());
}
}
public static void enableComponent(Context context, ComponentName componentName) {
try {
Log.i(TAG, "DisableCompat-enableComponent: " + componentName.toShortString());
PackageManager packageManager = context.getPackageManager();
packageManager.setComponentEnabledSetting(componentName, COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
} catch (Exception e) {
Log.e(TAG, "enableComponent Error: " + e.toString());
}
}
/**
* 启用应用
*/
public static boolean enablePackage(Context context, String packageName, boolean enable) {
Log.d(TAG, "enable package " + packageName + ", enable " + enable);
try {
DevicePolicyManager manager = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
if (manager != null) {
ComponentName componentName = new ComponentName(PACKAGENAME_WORKSPACE, CCOMPONENT_WORKSPACE_ADMIN_CLASS);
boolean isHidden = manager.isApplicationHidden(componentName, packageName);
if (enable && !isHidden || !enable && isHidden) {
Log.d(TAG, "enable = " + enable + ",isHidden ? " + isHidden);
return false;
}
return manager.setApplicationHidden(componentName, packageName, !enable);
}
} catch (Exception e) {
Log.e(TAG, "enable package " + packageName + " failed, e = " + Log.getStackTraceString(e));
}
return false;
}
public static void enableApplication(Context context, String packageName) {
if (TextUtils.isEmpty(packageName)) {
return;
}
boolean result;
if (SSettingConfig.isUseDeviceOwnerToDisableApp()) {
result = DpmHelper.getInstance(context).hideApplication(packageName, false);
} else {
result = enableApplicationAOSP(context, packageName);
}
Log.i(TAG, "enable: " + packageName + " , result= " + result);
}
public static void disableApplication(Context context, String packageName) {
if (TextUtils.isEmpty(packageName)) {
return;
}
boolean result;
if (SSettingConfig.isUseDeviceOwnerToDisableApp()) {
result = DpmHelper.getInstance(context).hideApplication(packageName, true);
} else {
result = disableApplicationAOSP(context, packageName);
}
Log.d(TAG, "disable: " + packageName + " , result=" + result);
}
private static boolean disableApplicationAOSP(Context context, String packageName) {
if (TextUtils.isEmpty(packageName)) {
return false;
}
MdmFactoryManager.getInstance().switchFactory(WhichFactory.AOSP_SYSTEM);
MdmFactoryManager.getInstance().getDeviceApplicationManager()
.setApplicationEnabledSetting(packageName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
MdmFactoryManager.getInstance().switchFactory(WhichFactory.HUAWEI);
return true;
}
private static boolean enableApplicationAOSP(Context context, String packageName) {
if (TextUtils.isEmpty(packageName)) {
return false;
}
MdmFactoryManager.getInstance().switchFactory(WhichFactory.AOSP_SYSTEM);
MdmFactoryManager.getInstance().getDeviceApplicationManager()
.setApplicationEnabledSetting(packageName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
MdmFactoryManager.getInstance().switchFactory(WhichFactory.HUAWEI);
return true;
}
}
......@@ -5,7 +5,6 @@ import android.content.Context
import android.os.Environment
import android.telephony.TelephonyManager
import android.util.Log
import com.skr.activation.utils.DesUtil
import java.io.File
import java.io.FileWriter
import java.util.*
......@@ -51,14 +50,14 @@ object ImeiUtil {
if (file.createNewFile()) {
val fileWriter = FileWriter(file, false)
fileWriter.use {
fileWriter.write(DesUtil.encrypt(imei))
fileWriter.write(imei.encrypt())
}
} else {
Log.e(TAG, "createNewFile failed")
}
}
} else {
imei = DesUtil.decrypt(file.readText())
imei = file.readText().decrypt()
Log.i(TAG, "imei $imei")
}
return imei
......@@ -78,13 +77,13 @@ object ImeiUtil {
if (file.createNewFile()) {
val fileWriter = FileWriter(file, false)
fileWriter.use {
fileWriter.write(DesUtil.encrypt(uuid))
fileWriter.write(uuid.encrypt())
}
} else {
Log.e(TAG, "createNewFile failed")
}
} else {
uuid = DesUtil.decrypt(file.readText())
uuid = file.readText().decrypt()
Log.i(TAG, "uuid $uuid")
}
return uuid
......
package com.secspace.lib.common.utils;
import android.content.Context;
import com.secspace.mdmengine.api.manager.MdmFactoryManager;
import java.util.ArrayList;
import java.util.List;
import static com.secspace.lib.common.env.Packages.PkgHuaWei.PACKAGENAME_HW_LAUNCHER;
import static com.secspace.lib.common.utils.Package.ComponentNames.huaweiLuancher;
public class MdmUtils {
/**
* 设置默认桌面,设置默认桌面相当于开机自启
* @param context
*/
public static void setDefaultLauncher(Context context){
DisableCompat.disableComponent(context,huaweiLuancher);
DpmHelper.getInstance(context).initMiddleWare();
MdmFactoryManager.getInstance().getDeviceSettingsManager().setDefaultLauncher(context.getPackageName(), "com.android.launcher3.settings.BlankAcitvity");
MdmFactoryManager.getInstance().getDeviceRestrictionManager().setStatusBarExpandPanelDisabled(true);
// MdmFactoryManager.getInstance().getDeviceRestrictionManager().setTaskButtonDisabled(true);
//搜索wifi列表时需要将gps打开 否则无法找到列表
// MdmFactoryManager.getInstance().getDeviceRestrictionManager().turnOnGPS(true);
Prefs.setAutoStartSelf(context,true);
//设置默认桌面需要将华为桌面禁用,在用过华为桌面后否则会在最近任务栏显示华为桌面
if(!Prefs.isReinforce(context)){
return;
}
List<String> packages = PkgManager.getInstance(context).queryLauncherPackages();
packages.remove(context.getPackageName());
if (packages.size() != 0) {
Prefs.setHideLauncherPackages(context, packages);
}
for (String aPackage : packages) {
DisableCompat.disableApplication(context, aPackage);
}
}
/**
* 清除默认桌面和一系列的状态
* @param context
*/
public static void clearDefaultLauncher(Context context){
DpmHelper.getInstance(context).initMiddleWare();
MdmFactoryManager.getInstance().getDeviceSettingsManager().clearDefaultLauncher(context.getPackageName());
Prefs.setAutoStartSelf(context,false);
DisableCompat.enableComponent(context,huaweiLuancher);
List<String> launchers = Prefs.getHideLauncherPackages(context);
if (launchers == null) {
launchers = new ArrayList<>();
}
if (!launchers.contains(PACKAGENAME_HW_LAUNCHER)) {
launchers.add(PACKAGENAME_HW_LAUNCHER);
}
for (String launcher : launchers) {
DisableCompat.enableApplication(context, launcher);
}
}
}
......@@ -45,8 +45,8 @@ public class Package {
public static ComponentName COMPONENT_UPDATE_SYSTEM = new ComponentName("com.huawei.android.hwouc", "com.huawei.android.hwouc.ui.activities.MainEntranceActivity");
public static ComponentName COMPONENT_STARTUP_SETTINGS = new ComponentName("com.android.settings", "com.android.settings.HWSettings");
public static ComponentName COMPONENT_NAME_HW_HWOUC = new ComponentName("com.huawei.android.hwouc", "com.huawei.android.hwouc.ui.activities.MainEntranceActivity");//软件更新
public static ComponentName huaweiLuancher = new ComponentName("com.huawei.android.launcher", "com.huawei.android.launcher.unihome.UniHomeLauncher");
public static ComponentName EnterprisePrivacySettingsActivity = new ComponentName("com.android.settings", "com.android.settings.Settings$EnterprisePrivacySettingsActivity");
public static ComponentName COMPONENT_HUAWEI_LUANCHER = new ComponentName("com.huawei.android.launcher", "com.huawei.android.launcher.unihome.UniHomeLauncher");
public static ComponentName COMPONENT_ENTERPRISE_PRIVACY_SETTING = new ComponentName("com.android.settings", "com.android.settings.Settings$COMPONENT_ENTERPRISE_PRIVACY_SETTING");
}
}
......@@ -274,26 +274,6 @@ public class Prefs {
}
/**
* 获取是否允许本身是否自启
*
* @param context
* @return
*/
public static boolean isAutoStartSelf(Context context) {
return getBoolean(context, AUTO_START_SELF, true);
}
/**
* 设置是否允许本身是否自启
*
* @param context
* @param isAutoStartSelf
*/
public static void setAutoStartSelf(Context context, boolean isAutoStartSelf) {
putBoolean(context, AUTO_START_SELF, isAutoStartSelf);
}
/**
* 是否允许添加新应用 默认不允许
*
* @param context
......
package com.secspace.lib.common.utils
import android.content.Context
import android.provider.Settings
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
object Settings {
fun hiddenPkgIcon(ctx: Context?) {
GlobalScope.launch(Dispatchers.IO) {
Settings.Global.putInt(ctx?.contentResolver, "show_hidden_icon_apps_enabled", 0)
}
}
}
\ No newline at end of file
......@@ -216,14 +216,4 @@ public class SettingsUtil {
}
return granted;
}
public static void screenOn(Context context) {
PowerManager mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
if (mPowerManager != null) {
@SuppressLint("InvalidWakeLockTag") PowerManager.WakeLock mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK
| PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");
mWakeLock.acquire(10 * 60 * 1000L /*10 minutes*/);
mWakeLock.release();
}
}
}
package com.secspace.lib.common.utils
import android.content.ComponentName
import android.content.Context
import com.secspace.lib.common.env.Packages.PkgSecSpace.PACKAGENAME_MDMENHANCE
import com.secspace.lib.common.env.Packages.PkgSecSpace.PACKAGENAME_MIDDLEWARE
import com.secspace.lib.common.utils.Package.COMPONENT_ADMIN_CLASS
import com.secspace.lib.common.dpm.DpmManager
import com.secspace.lib.common.utils.Package.ComponentNames.COMPONENT_HUAWEI_LUANCHER
import com.secspace.lib.common.utils.Package.ComponentNames.COMPONENT_NAME_HW_HWOUC
import com.secspace.lib.common.utils.Package.ComponentNames.huaweiLuancher
import com.secspace.lib.common.utils.Package.PACKAGENAME_HW_HWOUC
import com.secspace.mdmengine.api.annotation.WhichFactory
import com.secspace.mdmengine.api.manager.MdmFactoryManager
object UninstallUtil{
object UninstallUtil {
fun removeForbidden(context: Context?) {
DisableCompat.enableComponent(context, huaweiLuancher)
MdmFactoryManager.getInstance().switchFactory(WhichFactory.HUAWEI)
DisableCompat.enableComponent(context, COMPONENT_NAME_HW_HWOUC)
MdmFactoryManager.getInstance().deviceSettingsManager.isSystemUpdateDisabled = false
MdmFactoryManager.getInstance().deviceSettingsManager.isRestoreFactoryDisabled = false
MdmFactoryManager.getInstance().deviceRestrictionManager.isStatusBarExpandPanelDisabled = false
MdmFactoryManager.getInstance().googlePolicyManager?.setStatusBarDisabled(false)
MdmFactoryManager.getInstance().googlePolicyManager?.screenCaptureDisabled = false
MdmFactoryManager.getInstance().deviceSettingsManager.clearDefaultLauncher(context?.packageName)
MdmFactoryManager.getInstance().deviceRestrictionManager.clearDeviceOwnerApp()
val disabledDeactivateMdmPackageList = MdmFactoryManager.getInstance().deviceApplicationManager.disabledDeactivateMdmPackageList
if (disabledDeactivateMdmPackageList != null && disabledDeactivateMdmPackageList.size > 0) {
MdmFactoryManager.getInstance().deviceApplicationManager.removeDisabledDeactivateMdmPackages(disabledDeactivateMdmPackageList)
fun removeForbidden(context: Context) {
DpmManager.instance.restrictionManager.let {
it.clearDefaultLauncher()
it.setStatusBarExpandPanelDisabled(false)
it.setSystemUpdateDisabled(false)
}
val disallowedUninstallPackageList = MdmFactoryManager.getInstance().deviceApplicationManager.disallowedUninstallPackageList
if (disallowedUninstallPackageList != null && disallowedUninstallPackageList.size > 0) {
MdmFactoryManager.getInstance().deviceApplicationManager.removeDisallowedUninstallPackages(disallowedUninstallPackageList)
DpmManager.instance.applicationManager.let {
it.enableComponent(context, COMPONENT_HUAWEI_LUANCHER)
it.removeDisabledDeactivateMdmPackages(it.getDisabledDeactivateMdmPackageList())
it.removeDisallowedUninstallPackages(it.getDisallowedUninstallPackageList())
it.enableComponent(context, COMPONENT_NAME_HW_HWOUC)
it.enableComponent(context, COMPONENT_HUAWEI_LUANCHER)
}
// 取消激活
MdmFactoryManager.getInstance().deviceSettingsManager.removeActiveAdmin(ComponentName(PACKAGENAME_MIDDLEWARE, COMPONENT_ADMIN_CLASS))
MdmFactoryManager.getInstance().deviceSettingsManager.removeActiveAdmin(ComponentName(PACKAGENAME_MDMENHANCE, COMPONENT_ADMIN_CLASS))
MdmFactoryManager.getInstance().deviceRestrictionManager.clearDeviceOwnerApp()
DisableCompat.enableComponent(context, huaweiLuancher)
DpmManager.instance.settingsManager.let {
it.setRestoreFactoryDisabled(false)
}
DpmManager.instance.removeActive()
}
fun uninstallService(context: Context?) {
if (PkgManagerHelper.getInstance(context).isAppInstalled(context?.packageName)) {
PkgManagerHelper.getInstance(context).uninstallByInstaller(context?.packageName)
}
if (PkgManagerHelper.getInstance(context).isAppInstalled(PACKAGENAME_MIDDLEWARE)) {
PkgManagerHelper.getInstance(context).uninstallByInstaller(PACKAGENAME_MIDDLEWARE)
}
}
}
\ No newline at end of file
......@@ -10,6 +10,9 @@ import android.provider.Settings
import android.util.Base64
import com.secspace.lib.common.function.service.EduAccessibilityService
import com.skr.activation.utils.DesUtil
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import java.io.ByteArrayOutputStream
import java.io.File
import java.io.FileWriter
......@@ -17,28 +20,24 @@ import java.text.SimpleDateFormat
import java.util.*
fun decrypt(strMi: String): String {
return DesUtil.decrypt(strMi)
}
fun String.decrypt(): String = DesUtil.decrypt(this)
fun encrypt(strMi: String): String {
return DesUtil.encrypt(strMi)
}
fun String.encrypt(): String = DesUtil.encrypt(this)
fun openAccessibility(ctx: Context) {
fun Context.openAccessibility() = this.let {
try {
Settings.Secure.putString(ctx.contentResolver,
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, ctx.packageName + "/" + EduAccessibilityService::class.java.name)
Settings.Secure.putString(ctx.contentResolver,
Settings.Secure.putString(this.contentResolver,
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, this.packageName + "/" + EduAccessibilityService::class.java.name)
Settings.Secure.putString(this.contentResolver,
Settings.Secure.ACCESSIBILITY_ENABLED, "1")
} catch (e: Exception) {
e.printStackTrace()
}
}
fun closeAccessibility(ctx: Context) {
fun Context.closeAccessibility() = this.let {
try {
Settings.Secure.putString(ctx.contentResolver,
Settings.Secure.putString(this.contentResolver,
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "")
} catch (e: Exception) {
e.printStackTrace()
......@@ -64,32 +63,30 @@ fun getApplicationIcon(context: Context?, packageName: String): Drawable? {
}
@Synchronized
fun drawableToString(drawable: Drawable?): String? {
drawable?.let {
val bitmap = Bitmap
.createBitmap(
it.intrinsicWidth,
it.intrinsicHeight,
if (it.opacity != PixelFormat.OPAQUE) Bitmap.Config.ARGB_8888 else Bitmap.Config.RGB_565)
val canvas = Canvas(bitmap)
it.setBounds(0, 0, it.intrinsicWidth,
it.intrinsicHeight)
it.draw(canvas)
val size = bitmap.width * bitmap.height * 4
// 创建一个字节数组输出流,流的大小为size
val baos = ByteArrayOutputStream(size)
// 设置位图的压缩格式,质量为100%,并放入字节数组输出流中
bitmap.compress(Bitmap.CompressFormat.PNG, 10, baos)
// 将字节数组输出流转化为字节数组byte[]
val imagedata: ByteArray = baos.toByteArray()
return Base64.encodeToString(imagedata, Base64.DEFAULT)
}
return null
fun Drawable.drawableToString(): String = this.let {
val bitmap = Bitmap
.createBitmap(
it.intrinsicWidth,
it.intrinsicHeight,
if (it.opacity != PixelFormat.OPAQUE) Bitmap.Config.ARGB_8888 else Bitmap.Config.RGB_565)
val canvas = Canvas(bitmap)
it.setBounds(0, 0, it.intrinsicWidth,
it.intrinsicHeight)
it.draw(canvas)
val size = bitmap.width * bitmap.height * 4
// 创建一个字节数组输出流,流的大小为size
val baos = ByteArrayOutputStream(size)
// 设置位图的压缩格式,质量为100%,并放入字节数组输出流中
bitmap.compress(Bitmap.CompressFormat.PNG, 10, baos)
// 将字节数组输出流转化为字节数组byte[]
val imagedata: ByteArray = baos.toByteArray()
Base64.encodeToString(imagedata, Base64.DEFAULT)
}
fun write2File(source: String, filePath: String) {
val file = File(filePath)
if(file.exists()){
if (file.exists()) {
file.delete()
}
if (!file.createNewFile()) {
......@@ -101,16 +98,16 @@ fun write2File(source: String, filePath: String) {
}
}
fun formatDate2MdHm(date: Long): String{
fun Long.formatDate2MdHm(): String = this.let {
val format = SimpleDateFormat("MM-dd HH:mm", Locale.US)
return format.format(Date(date))
format.format(Date(this))
}
fun formatDateTime(minute: Long): String {
fun Long.formatDateTime(): String = this.let {
var stringTimes = ""
val days = minute / (60 * 24)
val hours = minute % (60 * 24) / 60
val minutes = minute % 60
val days = this / (60 * 24)
val hours = this % (60 * 24) / 60
val minutes = this % 60
when {
days > 0 -> {
stringTimes = days.toString() + "天" + hours + "时" + minutes + "分"
......@@ -122,5 +119,7 @@ fun formatDateTime(minute: Long): String {
stringTimes = minutes.toString() + "分"
}
}
return stringTimes
}
\ No newline at end of file
stringTimes
}
fun hiddenPkgIcon(ctx: Context?) = Settings.Global.putInt(ctx?.contentResolver, "show_hidden_icon_apps_enabled", 0)
\ No newline at end of file
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<limit-password />
<watch-login />
<reset-password />
<force-lock />
<wipe-data />
<expire-password />
<encrypted-storage />
<disable-camera />
</uses-policies>
</device-admin>
\ No newline at end of file
......@@ -108,6 +108,8 @@ public static java.lang.String TABLENAME;
-keepclassmembers class com.my.pkg.MyRealApplication {
public <init>();
}
-keep class com.huawei.android.app. ** {*;
}
# 如果不使用android.support.annotation.Keep则需加上此行
# -keep class com.my.pkg.SophixStubApplication$RealApplicationStub
#以上sophix热修复
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment