Commit 5b7b2fb1 by Baoxy

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

parent 616ba36e
...@@ -37,19 +37,6 @@ ...@@ -37,19 +37,6 @@
android:label="@string/permlab_install_shortcut" android:label="@string/permlab_install_shortcut"
android:permissionGroup="android.permission-group.SYSTEM_TOOLS" android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
android:protectionLevel="dangerous" /> 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 <application
android:persistent="true" android:persistent="true"
android:backupAgent="com.android.launcher3.LauncherBackupAgent" android:backupAgent="com.android.launcher3.LauncherBackupAgent"
......
...@@ -29,12 +29,10 @@ ...@@ -29,12 +29,10 @@
android:permissionGroup="android.permission-group.SYSTEM_TOOLS" android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
android:protectionLevel="signatureOrSystem" /> 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.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher.permission.WRITE_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.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher3.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.android.launcher3.permission.WRITE_SETTINGS" />
<uses-permission android:name="middleware.permission.MDM" />
<application <application
android:name=".App" android:name=".App"
......
...@@ -35,7 +35,7 @@ android { ...@@ -35,7 +35,7 @@ android {
keyAlias "skr.keystore" keyAlias "skr.keystore"
keyPassword "123456" //签名密码 keyPassword "123456" //签名密码
v1SigningEnabled true v1SigningEnabled true
v2SigningEnabled false v2SigningEnabled true
println("====== signingConfigs.debug ======") println("====== signingConfigs.debug ======")
} }
release { release {
...@@ -44,7 +44,7 @@ android { ...@@ -44,7 +44,7 @@ android {
keyAlias "skr.keystore" keyAlias "skr.keystore"
keyPassword "123456" keyPassword "123456"
v1SigningEnabled true v1SigningEnabled true
v2SigningEnabled false v2SigningEnabled true
println("====== signingConfigs.release ======") println("====== signingConfigs.release ======")
} }
} }
...@@ -78,6 +78,7 @@ android { ...@@ -78,6 +78,7 @@ android {
productFlavors { productFlavors {
aosp { aosp {
// applicationId 'com.android.workassistant'
applicationId 'com.eduspace.mobilemanager' applicationId 'com.eduspace.mobilemanager'
testApplicationId 'com.android.launcher3.tests' testApplicationId 'com.android.launcher3.tests'
} }
...@@ -131,7 +132,7 @@ dependencies { ...@@ -131,7 +132,7 @@ dependencies {
androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
androidTestImplementation "com.android.support:support-annotations:${SUPPORT_LIBS_VERSION}" 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:rxjava:2.0.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.0' implementation 'io.reactivex.rxjava2:rxandroid:2.0.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1' implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'
......
...@@ -4,10 +4,8 @@ import android.app.Application; ...@@ -4,10 +4,8 @@ import android.app.Application;
import android.content.Context; import android.content.Context;
import com.secspace.lib.common.dialog.other.DialogUIUtils; 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.function.database.DatabaseManager;
import com.secspace.lib.common.update.CheckUpdateCore;
import com.secspace.lib.common.utils.DpmHelper;
public class App extends Application { public class App extends Application {
private Context mApp; private Context mApp;
...@@ -16,11 +14,8 @@ public class App extends Application { ...@@ -16,11 +14,8 @@ public class App extends Application {
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
mApp = getApplicationContext(); mApp = getApplicationContext();
DpmHelper dpmHelper = DpmHelper.getInstance(mApp); DpmManager.getInstance().init(mApp);
if (dpmHelper.isMiddlewareLatest()) {
dpmHelper.initMiddleWare();
}
DialogUIUtils.init(mApp); DialogUIUtils.init(mApp);
DatabaseManager.Companion.getInstance(mApp).init(); DatabaseManager.getInstance(mApp).init();
} }
} }
...@@ -72,7 +72,6 @@ import android.view.HapticFeedbackConstants; ...@@ -72,7 +72,6 @@ import android.view.HapticFeedbackConstants;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.KeyboardShortcutGroup; import android.view.KeyboardShortcutGroup;
import android.view.KeyboardShortcutInfo; import android.view.KeyboardShortcutInfo;
import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
...@@ -86,7 +85,6 @@ import android.view.accessibility.AccessibilityManager; ...@@ -86,7 +85,6 @@ import android.view.accessibility.AccessibilityManager;
import android.view.animation.OvershootInterpolator; import android.view.animation.OvershootInterpolator;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.widget.EditText; import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
...@@ -118,7 +116,6 @@ import com.android.launcher3.keyboard.CustomActionsPopup; ...@@ -118,7 +116,6 @@ import com.android.launcher3.keyboard.CustomActionsPopup;
import com.android.launcher3.keyboard.ViewGroupFocusHelper; import com.android.launcher3.keyboard.ViewGroupFocusHelper;
import com.android.launcher3.logging.FileLog; import com.android.launcher3.logging.FileLog;
import com.android.launcher3.logging.UserEventDispatcher; import com.android.launcher3.logging.UserEventDispatcher;
import com.android.launcher3.mdm.DpmOwnerHelper;
import com.android.launcher3.model.ModelWriter; import com.android.launcher3.model.ModelWriter;
import com.android.launcher3.model.PackageItemInfo; import com.android.launcher3.model.PackageItemInfo;
import com.android.launcher3.model.WidgetItem; import com.android.launcher3.model.WidgetItem;
...@@ -155,17 +152,14 @@ import com.android.launcher3.widget.WidgetsContainerView; ...@@ -155,17 +152,14 @@ import com.android.launcher3.widget.WidgetsContainerView;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.secspace.lib.common.dialog.other.DialogUIUtils; import com.secspace.lib.common.dialog.other.DialogUIUtils;
import com.secspace.lib.common.event.ChangeWallPaperEvent; 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.event.RefreshWorkSpaceEvent;
import com.secspace.lib.common.function.ActivationHelper; import com.secspace.lib.common.function.ActivationHelper;
import com.secspace.lib.common.function.DialogManager; import com.secspace.lib.common.function.DialogManager;
import com.secspace.lib.common.function.WorkManager; import com.secspace.lib.common.function.WorkManager;
import com.secspace.lib.common.function.model.Encrypted; 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.update.CheckUpdateCore;
import com.secspace.lib.common.utils.ActivityHelper; import com.secspace.lib.common.utils.ActivityHelper;
import com.secspace.lib.common.utils.DeviceUtil; 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.FileUtil;
import com.secspace.lib.common.utils.ImeiCheckUtils; import com.secspace.lib.common.utils.ImeiCheckUtils;
import com.secspace.lib.common.utils.InputUtil; import com.secspace.lib.common.utils.InputUtil;
...@@ -174,7 +168,6 @@ import com.secspace.lib.common.utils.JsonUtil; ...@@ -174,7 +168,6 @@ import com.secspace.lib.common.utils.JsonUtil;
import com.secspace.lib.common.utils.Prefs; import com.secspace.lib.common.utils.Prefs;
import com.secspace.lib.common.utils.ToastUtil; import com.secspace.lib.common.utils.ToastUtil;
import com.secspace.lib.common.utils.UtilsKt; import com.secspace.lib.common.utils.UtilsKt;
import com.secspace.mdmengine.api.manager.MdmFactoryManager;
import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.Subscribe;
...@@ -1205,7 +1198,7 @@ public class Launcher extends BaseActivity ...@@ -1205,7 +1198,7 @@ public class Launcher extends BaseActivity
if (mLauncherCallbacks != null) { if (mLauncherCallbacks != null) {
mLauncherCallbacks.onResume(); mLauncherCallbacks.onResume();
} }
WorkManager.INSTANCE.enter(Launcher.this); WorkManager.getInstance(Launcher.this).enter(Launcher.this);
} }
public static void forceReload() { public static void forceReload() {
...@@ -1267,101 +1260,6 @@ public class Launcher extends BaseActivity ...@@ -1267,101 +1260,6 @@ public class Launcher extends BaseActivity
return false; 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一下应用 为了过滤应用 //重新loading一下应用 为了过滤应用
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true) @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
...@@ -2190,9 +2088,6 @@ public class Launcher extends BaseActivity ...@@ -2190,9 +2088,6 @@ public class Launcher extends BaseActivity
@Override @Override
public void onDestroy() { public void onDestroy() {
super.onDestroy(); super.onDestroy();
if (mTipDialog != null && mTipDialog.isShowing()) {
mTipDialog.dismiss();
}
EventBus.getDefault().unregister(this); EventBus.getDefault().unregister(this);
mWorkspace.removeCallbacks(mBuildLayersRunnable); mWorkspace.removeCallbacks(mBuildLayersRunnable);
mWorkspace.removeFolderListeners(); mWorkspace.removeFolderListeners();
......
...@@ -118,7 +118,7 @@ class ChangePwdActivity : BaseActivity() { ...@@ -118,7 +118,7 @@ class ChangePwdActivity : BaseActivity() {
return return
} }
var answer = editable.toString() var answer = editable.toString()
answer = encrypt(answer) answer = answer.encrypt()
if (TextUtils.equals(answer1, answer)) { if (TextUtils.equals(answer1, answer)) {
val intent = Intent(mAppContext, PwdPinSetPwdActivity::class.java) val intent = Intent(mAppContext, PwdPinSetPwdActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
......
...@@ -3,24 +3,20 @@ package com.android.launcher3.function.pwd ...@@ -3,24 +3,20 @@ package com.android.launcher3.function.pwd
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.text.TextUtils
import android.view.View import android.view.View
import android.widget.EditText
import android.widget.GridLayout import android.widget.GridLayout
import com.android.launcher3.BaseActivity import com.android.launcher3.BaseActivity
import com.android.launcher3.R import com.android.launcher3.R
import com.android.launcher3.mdm.DisableCompat
import com.qmuiteam.qmui.widget.grouplist.QMUICommonListItemView import com.qmuiteam.qmui.widget.grouplist.QMUICommonListItemView
import com.qmuiteam.qmui.widget.grouplist.QMUIGroupListView import com.qmuiteam.qmui.widget.grouplist.QMUIGroupListView
import com.secspace.lib.common.dialog.other.DialogUIUtils import com.secspace.lib.common.dpm.DpmManager
import com.secspace.lib.common.function.DialogManager.PwdListener import com.secspace.lib.common.utils.PkgManager
import com.secspace.lib.common.function.DialogManager.showEncryptedVerDialog import com.secspace.lib.common.utils.Prefs
import com.secspace.lib.common.function.model.Encrypted import com.secspace.lib.common.utils.dp2px
import com.secspace.lib.common.utils.*
import kotlinx.android.synthetic.main.activity_setting.* import kotlinx.android.synthetic.main.activity_setting.*
class SettingPwdActivity : BaseActivity(){ class SettingPwdActivity : BaseActivity(){
private var mContext: Context? = null private lateinit var mContext: Context
private var pwd: QMUICommonListItemView? = null private var pwd: QMUICommonListItemView? = null
private var pwdCar: QMUICommonListItemView? = null private var pwdCar: QMUICommonListItemView? = null
...@@ -62,12 +58,12 @@ class SettingPwdActivity : BaseActivity(){ ...@@ -62,12 +58,12 @@ class SettingPwdActivity : BaseActivity(){
private fun reinforce() { private fun reinforce() {
val packages: MutableList<String> = PkgManager.getInstance(mContext).queryLauncherPackages() val packages: MutableList<String> = PkgManager.getInstance(mContext).queryLauncherPackages()
packages.remove(mContext?.packageName) packages.remove(mContext.packageName)
if(packages.isNotEmpty()){ if(packages.isNotEmpty()){
Prefs.setHideLauncherPackages(mContext, packages) Prefs.setHideLauncherPackages(mContext, packages)
} }
for (packageName in 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() { ...@@ -82,8 +82,8 @@ class EncryptedSetFragment : Fragment() {
DialogUIUtils.showToastCenter(R.string.edu_item_input_encryted_set_success) DialogUIUtils.showToastCenter(R.string.edu_item_input_encryted_set_success)
answer1 = encrypt(answer1) answer1 = answer1.encrypt()
answer2 = encrypt(answer2) answer2 = answer2.encrypt()
val encrypted = Encrypted(question1, answer1, question2, answer2) val encrypted = Encrypted(question1, answer1, question2, answer2)
Prefs.setEncrypted(activity, Gson().toJson(encrypted)) Prefs.setEncrypted(activity, Gson().toJson(encrypted))
......
...@@ -81,8 +81,8 @@ class EncryptedVerifyFragment : Fragment() { ...@@ -81,8 +81,8 @@ class EncryptedVerifyFragment : Fragment() {
return return
} }
answer1 = encrypt(answer1) answer1 = answer1.encrypt()
answer2 = encrypt(answer2) answer2 = answer2.encrypt()
if (answer1 != encrypted.answer1) { if (answer1 != encrypted.answer1) {
DialogUIUtils.showToastCenter(R.string.edu_item_input_answer1_error) DialogUIUtils.showToastCenter(R.string.edu_item_input_answer1_error)
......
...@@ -23,9 +23,9 @@ import kotlinx.android.synthetic.main.activity_app_manager.* ...@@ -23,9 +23,9 @@ import kotlinx.android.synthetic.main.activity_app_manager.*
import kotlinx.coroutines.* import kotlinx.coroutines.*
class AppChooseActivity : BaseActivity() { class AppChooseActivity : BaseActivity() {
var mAppInfoAdapterSystemApp: AppChooseListAdapter? = null private lateinit var mAppInfoAdapterSystemApp: AppChooseListAdapter
var mAppInfoAdapterUserApp: AppChooseListAdapter? = null private lateinit var mAppInfoAdapterUserApp: AppChooseListAdapter
var job: Job? = null private var job: Job? = null
private val mSystemApps: MutableList<AppModel> = ArrayList() private val mSystemApps: MutableList<AppModel> = ArrayList()
private val mUserApps: MutableList<AppModel> = ArrayList() private val mUserApps: MutableList<AppModel> = ArrayList()
private lateinit var mContext: Context private lateinit var mContext: Context
...@@ -42,20 +42,23 @@ class AppChooseActivity : BaseActivity() { ...@@ -42,20 +42,23 @@ class AppChooseActivity : BaseActivity() {
fun initView() { fun initView() {
tv_setting_title.setText(R.string.edu_item_icon) tv_setting_title.setText(R.string.edu_item_icon)
mAppInfoAdapterSystemApp = AppChooseListAdapter(SYSTEM_APP_FLAG) mAppInfoAdapterSystemApp = AppChooseListAdapter(SYSTEM_APP_FLAG).apply {
mAppInfoAdapterSystemApp?.setItemViewId(R.layout.item_app_choose_list) setItemViewId(R.layout.item_app_choose_list)
val linearLayoutManager = LinearLayoutManager(this, VERTICAL, false) val linearLayoutManager = LinearLayoutManager(mContext, VERTICAL, false)
recyclerview_system.layoutManager = linearLayoutManager recyclerview_system.layoutManager = linearLayoutManager
recyclerview_system.addItemDecoration(DividerItemDecoration(this, DividerItemDecoration.VERTICAL)) recyclerview_system.addItemDecoration(DividerItemDecoration(mContext, DividerItemDecoration.VERTICAL))
recyclerview_system.adapter = mAppInfoAdapterSystemApp recyclerview_system.adapter = this
mAppInfoAdapterUserApp = AppChooseListAdapter(USER_APP_FLAG) list = mSystemApps
mAppInfoAdapterUserApp?.setItemViewId(R.layout.item_app_choose_list) }
val linearLayoutManagerUser = LinearLayoutManager(this, VERTICAL, false)
recyclerview_user.layoutManager = linearLayoutManagerUser mAppInfoAdapterUserApp = AppChooseListAdapter(USER_APP_FLAG).apply {
recyclerview_user.addItemDecoration(DividerItemDecoration(this, DividerItemDecoration.VERTICAL)) setItemViewId(R.layout.item_app_choose_list)
recyclerview_user.adapter = mAppInfoAdapterUserApp val linearLayoutManagerUser = LinearLayoutManager(mContext, VERTICAL, false)
mAppInfoAdapterSystemApp?.list = mSystemApps recyclerview_user.layoutManager = linearLayoutManagerUser
mAppInfoAdapterUserApp?.list = mUserApps recyclerview_user.addItemDecoration(DividerItemDecoration(mContext, DividerItemDecoration.VERTICAL))
recyclerview_user.adapter = this
list = mUserApps
}
} }
private fun loadData() { private fun loadData() {
...@@ -91,10 +94,10 @@ class AppChooseActivity : BaseActivity() { ...@@ -91,10 +94,10 @@ class AppChooseActivity : BaseActivity() {
btn_sure.isEnabled = true btn_sure.isEnabled = true
btn_cancel.isEnabled = true btn_cancel.isEnabled = true
LoadingDialog.getInstance(mContext).dismiss() LoadingDialog.getInstance(mContext).dismiss()
mAppInfoAdapterUserApp?.readResult(mAppContext) mAppInfoAdapterUserApp.readResult(mAppContext)
mAppInfoAdapterSystemApp?.readResult(mAppContext) mAppInfoAdapterSystemApp.readResult(mAppContext)
mAppInfoAdapterSystemApp?.notifyDataSetChanged() mAppInfoAdapterSystemApp.notifyDataSetChanged()
mAppInfoAdapterUserApp?.notifyDataSetChanged() mAppInfoAdapterUserApp.notifyDataSetChanged()
} }
} }
...@@ -106,11 +109,11 @@ class AppChooseActivity : BaseActivity() { ...@@ -106,11 +109,11 @@ class AppChooseActivity : BaseActivity() {
fun btnClick(view: View?) { fun btnClick(view: View?) {
when (view?.id) { when (view?.id) {
R.id.btn_sure -> { R.id.btn_sure -> {
GlobalScope.launch (Dispatchers.Main){ GlobalScope.launch(Dispatchers.Main) {
LoadingDialog.getInstance(mAppContext).show("请稍后") LoadingDialog.getInstance(mAppContext).show("请稍后")
mAppInfoAdapterSystemApp?.saveResult(mAppContext) mAppInfoAdapterSystemApp.saveResult(mAppContext)
mAppInfoAdapterUserApp?.saveResult(mAppContext) mAppInfoAdapterUserApp.saveResult(mAppContext)
SwitchInMdm.addDisallowedRunningApp(mContext) SwitchInMdm.getInstance(mContext).addDisallowedRunningApp()
Launcher.forceReload() Launcher.forceReload()
IntentUtil.startEduLauncher(mContext) IntentUtil.startEduLauncher(mContext)
LoadingDialog.getInstance(mAppContext).dismiss() LoadingDialog.getInstance(mAppContext).dismiss()
......
...@@ -121,14 +121,14 @@ class AppUseActivity : BaseActivity() { ...@@ -121,14 +121,14 @@ class AppUseActivity : BaseActivity() {
} }
private fun initChart() { 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.setData(defaultUseAppEntitys, defaultTotalTime)
time_progress.initAnimation() time_progress.initAnimation()
} }
private fun initRecyclerView() { private fun initRecyclerView() {
val treeAdapter = TreeAdapter(this, selectEntity, selectTotalTime) val treeAdapter = TreeAdapter(this, selectEntity, selectTotalTime)
val layoutManager = object:LinearLayoutManager(this){ val layoutManager = object : LinearLayoutManager(this) {
override fun canScrollVertically(): Boolean { override fun canScrollVertically(): Boolean {
return false return false
} }
...@@ -224,7 +224,7 @@ class AppUseActivity : BaseActivity() { ...@@ -224,7 +224,7 @@ class AppUseActivity : BaseActivity() {
// 根据使用时间降序排列 // 根据使用时间降序排列
selectUseAppEntitys.sortByDescending { it.useTime } selectUseAppEntitys.sortByDescending { it.useTime }
withContext(Dispatchers.Main) { 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 allTime: Float = ((selectEndTime - selectStartTime) / 1000 / 60).toFloat()
val showTime = selectTotalTime / allTime * 100 val showTime = selectTotalTime / allTime * 100
Log.e(TAG, "showTime = $showTime , allTime = $allTime") Log.e(TAG, "showTime = $showTime , allTime = $allTime")
...@@ -268,8 +268,8 @@ class AppUseActivity : BaseActivity() { ...@@ -268,8 +268,8 @@ class AppUseActivity : BaseActivity() {
val useAppsChild = LinkedList<UseAppListEntity>() val useAppsChild = LinkedList<UseAppListEntity>()
map.value.forEach { map.value.forEach {
val tempAppList = UseAppListEntity(1) val tempAppList = UseAppListEntity(1)
tempAppList.startTime = formatDate2MdHm(it.useStartTime) tempAppList.startTime = it.useStartTime.formatDate2MdHm()
tempAppList.endTime = formatDate2MdHm(it.useEndTime) tempAppList.endTime = it.useEndTime.formatDate2MdHm()
useAppsChild.add(tempAppList) useAppsChild.add(tempAppList)
appList.useTime += ((it.useEndTime - it.useStartTime) / 1000 / 60) appList.useTime += ((it.useEndTime - it.useStartTime) / 1000 / 60)
} }
......
...@@ -9,10 +9,10 @@ import android.widget.GridLayout ...@@ -9,10 +9,10 @@ import android.widget.GridLayout
import com.android.launcher3.BaseActivity import com.android.launcher3.BaseActivity
import com.android.launcher3.R import com.android.launcher3.R
import com.android.launcher3.function.pwd.SettingPwdActivity 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.QMUICommonListItemView
import com.qmuiteam.qmui.widget.grouplist.QMUIGroupListView import com.qmuiteam.qmui.widget.grouplist.QMUIGroupListView
import com.secspace.lib.common.dialog.LoadingDialog 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.event.ChangeWallPaperEvent
import com.secspace.lib.common.function.DialogManager import com.secspace.lib.common.function.DialogManager
import com.secspace.lib.common.utils.PkgManager import com.secspace.lib.common.utils.PkgManager
...@@ -29,7 +29,7 @@ import kotlinx.coroutines.launch ...@@ -29,7 +29,7 @@ import kotlinx.coroutines.launch
import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.EventBus
class SettingAdminActivity : BaseActivity() { class SettingAdminActivity : BaseActivity() {
private var mContext: Context? = null private lateinit var mContext: Context
private var icon: QMUICommonListItemView? = null private var icon: QMUICommonListItemView? = null
private var reinforce: QMUICommonListItemView? = null private var reinforce: QMUICommonListItemView? = null
private var pwdManager: QMUICommonListItemView? = null private var pwdManager: QMUICommonListItemView? = null
...@@ -101,12 +101,12 @@ class SettingAdminActivity : BaseActivity() { ...@@ -101,12 +101,12 @@ class SettingAdminActivity : BaseActivity() {
private fun reinforce() { private fun reinforce() {
val packages: MutableList<String> = PkgManager.getInstance(mContext).queryLauncherPackages() val packages: MutableList<String> = PkgManager.getInstance(mContext).queryLauncherPackages()
packages.remove(mContext?.packageName) packages.remove(mContext.packageName)
if (packages.isNotEmpty()) { if (packages.isNotEmpty()) {
Prefs.setHideLauncherPackages(mContext, packages) Prefs.setHideLauncherPackages(mContext, packages)
} }
for (packageName in 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 ...@@ -6,7 +6,7 @@ import android.content.Intent
import android.text.TextUtils import android.text.TextUtils
import com.android.launcher3.Launcher import com.android.launcher3.Launcher
import com.secspace.lib.common.event.RefreshWorkSpaceEvent 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 com.secspace.lib.common.utils.Prefs
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
...@@ -24,7 +24,7 @@ class AppInstallReceiver : BroadcastReceiver() { ...@@ -24,7 +24,7 @@ class AppInstallReceiver : BroadcastReceiver() {
pkgs.add(packageName) pkgs.add(packageName)
Prefs.setUserShowAppPkgs(context, pkgs) Prefs.setUserShowAppPkgs(context, pkgs)
GlobalScope.launch(Dispatchers.IO) { GlobalScope.launch(Dispatchers.IO) {
addDisallowedRunningApp(context) SwitchInMdm.getInstance(context).addDisallowedRunningApp()
} }
Launcher.forceReload() Launcher.forceReload()
EventBus.getDefault().post(RefreshWorkSpaceEvent()) EventBus.getDefault().post(RefreshWorkSpaceEvent())
......
...@@ -12,7 +12,7 @@ public class BootReceiver extends BroadcastReceiver { ...@@ -12,7 +12,7 @@ public class BootReceiver extends BroadcastReceiver {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
Log.i("BootReceiver", "onReceive: "+intent.getAction()); Log.i("BootReceiver", "onReceive: "+intent.getAction());
if(Prefs.isAutoStartSelf(context)){ if(Prefs.isInSpace(context)){
Intent intent1=new Intent(); Intent intent1=new Intent();
intent1.setClass(context, BlankActivity.class); intent1.setClass(context, BlankActivity.class);
intent1.setPackage(context.getPackageName()); intent1.setPackage(context.getPackageName());
......
...@@ -73,7 +73,7 @@ public class WifiScanService extends Service { ...@@ -73,7 +73,7 @@ public class WifiScanService extends Service {
} }
WifiManagerUtils.getInstance(mContext).isIllegalWifi(); WifiManagerUtils.getInstance(mContext).isIllegalWifi();
} }
if (!Prefs.isAutoStartSelf(mContext)){ if (!Prefs.isInSpace(mContext)){
// writeLog(timeStamp2Date(System.currentTimeMillis())+"\r\n"); // writeLog(timeStamp2Date(System.currentTimeMillis())+"\r\n");
// mContext.startService(new Intent(mContext,WifiScanService.class)); // mContext.startService(new Intent(mContext,WifiScanService.class));
} }
......
...@@ -62,5 +62,5 @@ dependencies { ...@@ -62,5 +62,5 @@ dependencies {
androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
api project(path: ':lib_common') 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; ...@@ -6,18 +6,16 @@ import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import com.secspace.lib.common.dpm.DpmManager;
import com.secspace.lib.common.utils.DeviceUtil; 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.ImeiCheckUtils;
import com.secspace.lib.common.utils.PkgManager; import com.secspace.lib.common.utils.PkgManager;
import com.secspace.lib.common.utils.Prefs; import com.secspace.lib.common.utils.Prefs;
import com.secspace.mdmengine.api.manager.MdmFactoryManager;
import java.util.List; import java.util.List;
...@@ -34,13 +32,13 @@ public class MainActivity extends AppCompatActivity { ...@@ -34,13 +32,13 @@ public class MainActivity extends AppCompatActivity {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); setContentView(R.layout.activity_main);
ImeiCheckUtils.getInstance(this).initImeiList(); ImeiCheckUtils.getInstance(this).initImeiList();
startService(new Intent(this,MyService.class)); startService(new Intent(this, MyService.class));
} }
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
Log.i(TAG, "onResume: "+checkImei()); Log.i(TAG, "onResume: " + checkImei());
if (!checkImei()) { if (!checkImei()) {
showPwdDialog(getString(R.string.not__prmission), getString(R.string.work_sure), null, new DialogInterface.OnClickListener() { showPwdDialog(getString(R.string.not__prmission), getString(R.string.work_sure), null, new DialogInterface.OnClickListener() {
@Override @Override
...@@ -53,9 +51,9 @@ public class MainActivity extends AppCompatActivity { ...@@ -53,9 +51,9 @@ public class MainActivity extends AppCompatActivity {
return; return;
} }
try { try {
DpmHelper.getInstance(this).initMiddleWare(); DpmManager.getInstance().init(this);
if (!DpmHelper.getInstance(this).isMiddlewareDPMActived()) { if (!DpmManager.getInstance().isActive()) {
DpmHelper.getInstance(this).toActivateMiddlewareDpm(); DpmManager.getInstance().active(DpmManager.getInstance().mAdminName);
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
...@@ -106,23 +104,18 @@ public class MainActivity extends AppCompatActivity { ...@@ -106,23 +104,18 @@ public class MainActivity extends AppCompatActivity {
} }
public void remove_forbidden(View view) { public void remove_forbidden(View view) {
DisableCompat.enableComponent(this, componentName8); DpmManager.getInstance().applicationManager.enableComponent(this, componentName8);
MdmFactoryManager.getInstance().getDeviceSettingsManager().setRestoreFactoryDisabled(false); DpmManager.getInstance().settingsManager.setRestoreFactoryDisabled(false);
MdmFactoryManager.getInstance().getDeviceSettingsManager().clearDefaultLauncher(this.getPackageName()); DpmManager.getInstance().restrictionManager.clearDefaultLauncher();
DisableCompat.enableComponent(this, huaweiLuancher); DpmManager.getInstance().applicationManager.enableComponent(this, huaweiLuancher);
} }
public void uninstall_mobile_steward(View view) { public void uninstall_mobile_steward(View view) {
MdmFactoryManager.getInstance().getDeviceRestrictionManager().clearDeviceOwnerApp(); List<String> disabledDeactivateMdmPackageList = DpmManager.getInstance().applicationManager.getDisabledDeactivateMdmPackageList();
List<String> disabledDeactivateMdmPackageList = MdmFactoryManager.getInstance().getDeviceApplicationManager().getDisabledDeactivateMdmPackageList(); DpmManager.getInstance().applicationManager.removeDisabledDeactivateMdmPackages(disabledDeactivateMdmPackageList);
if (disabledDeactivateMdmPackageList != null && disabledDeactivateMdmPackageList.size() > 0) { List<String> disallowedUninstallPackageList = DpmManager.getInstance().applicationManager.getDisallowedUninstallPackageList();
MdmFactoryManager.getInstance().getDeviceApplicationManager().removeDisabledDeactivateMdmPackages(disabledDeactivateMdmPackageList); DpmManager.getInstance().applicationManager.removeDisallowedUninstallPackages(disallowedUninstallPackageList);
} DpmManager.getInstance().removeActive(DpmManager.getInstance().mAdminName);
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"));
PkgManager.getInstance(this).uninstallByInstaller("com.secspace.mobilemanager"); PkgManager.getInstance(this).uninstallByInstaller("com.secspace.mobilemanager");
PkgManager.getInstance(this).uninstallByInstaller(PACKAGENAME_MIDDLEWARE); PkgManager.getInstance(this).uninstallByInstaller(PACKAGENAME_MIDDLEWARE);
} }
......
...@@ -26,7 +26,7 @@ MAVEN_URL=http://192.168.0.170:13000/nexus/content/repositories/releases/ ...@@ -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/ MAVEN_URL_SNAPSHOT=http://192.168.0.170:13000/nexus/content/repositories/releases/
#32位有符号数2147483647(10) #32位有符号数2147483647(10)
versionIntCode=2020040801 versionIntCode=2020041101
versionNameMajor=1 versionNameMajor=1
versionNameMinor=0 versionNameMinor=0
......
...@@ -114,11 +114,12 @@ dependencies { ...@@ -114,11 +114,12 @@ dependencies {
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2' annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
annotationProcessor "android.arch.persistence.room:compiler:1.1.1" annotationProcessor "android.arch.persistence.room:compiler:1.1.1"
api 'com.tk.lib:log:1.0.3' 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/jxl.jar')
implementation files('libs/activation.aar') implementation files('libs/activation.aar')
implementation files('libs/update.aar') implementation files('libs/update.aar')
implementation files('libs/downloader.aar') implementation files('libs/downloader.aar')
implementation files('libs/mdmkit-10.0.1.300.jar')
// Room // Room
implementation 'com.tk.lib:room:1.0.2' implementation 'com.tk.lib:room:1.0.2'
// Downloader // Downloader
......
...@@ -6,16 +6,85 @@ ...@@ -6,16 +6,85 @@
android:label="@string/common_sec_permission_default" android:label="@string/common_sec_permission_default"
android:protectionLevel="signature"></permission> 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.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.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="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="secspace.permission.sec.Default"></uses-permission> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="middleware.permission.MDM" /> <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> <application>
<activity <activity
android:name=".tips.PermissionTipActivity" android:name=".tips.PermissionTipActivity"
...@@ -28,9 +97,11 @@ ...@@ -28,9 +97,11 @@
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity android:name=".AddDeviceAdminActivity" <activity
android:excludeFromRecents="true"/> android:name=".AddDeviceAdminActivity"
<service android:name=".function.ExitService"/> android:excludeFromRecents="true" />
<service android:name=".function.ExitService" />
<service <service
android:name=".function.service.EduAccessibilityService" android:name=".function.service.EduAccessibilityService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
...@@ -41,5 +112,20 @@ ...@@ -41,5 +112,20 @@
android:name="android.accessibilityservice" android:name="android.accessibilityservice"
android:resource="@xml/work_accessibility" /> android:resource="@xml/work_accessibility" />
</service> </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> </application>
</manifest> </manifest>
...@@ -6,6 +6,8 @@ import android.os.Bundle; ...@@ -6,6 +6,8 @@ import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import com.secspace.lib.common.dpm.DpmManager;
/** /**
* Created by lichuanzhi@tiankuan.net * Created by lichuanzhi@tiankuan.net
*/ */
......
...@@ -45,7 +45,6 @@ public abstract class BaseActivity extends AppCompatActivity implements EasyPerm ...@@ -45,7 +45,6 @@ public abstract class BaseActivity extends AppCompatActivity implements EasyPerm
public static final String INTENT_FROM_MANUAL = "isFromManual"; public static final String INTENT_FROM_MANUAL = "isFromManual";
private static final String[] RUNTIME_PERMISSIONS = new String[]{ private static final String[] RUNTIME_PERMISSIONS = new String[]{
"android.permission.READ_PHONE_STATE", "android.permission.READ_PHONE_STATE",
"android.permission.CALL_PHONE",
"android.permission.READ_EXTERNAL_STORAGE", "android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_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 ...@@ -66,7 +66,7 @@ class BuyCodeDialog private constructor(val mContext: Context) : DialogInterface
when (v.id) { when (v.id) {
R.id.btn_accept -> { R.id.btn_accept -> {
dismiss() dismiss()
WorkManager.removeForbidden(mContext) WorkManager.getInstance(mContext).removeForbidden()
active(mContext, object : ActivationListener { active(mContext, object : ActivationListener {
override fun activationFailed() {} override fun activationFailed() {}
override fun activated() { override fun activated() {
...@@ -76,7 +76,7 @@ class BuyCodeDialog private constructor(val mContext: Context) : DialogInterface ...@@ -76,7 +76,7 @@ class BuyCodeDialog private constructor(val mContext: Context) : DialogInterface
} }
R.id.btn_exit -> { R.id.btn_exit -> {
dismiss() dismiss()
WorkManager.removeForbidden(mContext) WorkManager.getInstance(mContext).removeForbidden()
} }
} }
} }
...@@ -84,7 +84,7 @@ class BuyCodeDialog private constructor(val mContext: Context) : DialogInterface ...@@ -84,7 +84,7 @@ class BuyCodeDialog private constructor(val mContext: Context) : DialogInterface
companion object { companion object {
@Volatile @Volatile
private var instance: BuyCodeDialog? = null private var instance: BuyCodeDialog? = null
@JvmStatic
fun getInstance(context: Context): BuyCodeDialog { fun getInstance(context: Context): BuyCodeDialog {
if (instance == null) { if (instance == null) {
synchronized(BuyCodeDialog::class) { synchronized(BuyCodeDialog::class) {
......
...@@ -3,50 +3,15 @@ package com.secspace.lib.common.function ...@@ -3,50 +3,15 @@ package com.secspace.lib.common.function
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context
import android.content.DialogInterface
import android.view.View 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.DialogUIListener
import com.secspace.lib.common.dialog.other.DialogUIUtils 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. * Created by cyw_m on 2018/4/6.
*/ */
@SuppressLint("StaticFieldLeak") @SuppressLint("StaticFieldLeak")
object DialogManager { 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?) { fun showPrivacyPolicyDialog(activity: Activity?) {
PrivacyPolicyDialog(activity).show() 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 ...@@ -6,7 +6,6 @@ import android.content.Intent
import android.os.IBinder import android.os.IBinder
import android.util.Log import android.util.Log
import com.secspace.lib.common.dialog.LoadingDialog 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.IntentUtil
import com.secspace.lib.common.utils.Prefs import com.secspace.lib.common.utils.Prefs
import com.secspace.lib.common.utils.closeAccessibility import com.secspace.lib.common.utils.closeAccessibility
...@@ -14,7 +13,7 @@ import kotlinx.coroutines.* ...@@ -14,7 +13,7 @@ import kotlinx.coroutines.*
class ExitService : Service() { class ExitService : Service() {
private val TAG = "ExitService" private val TAG = "ExitService"
private var mAppContext: Context? = null private lateinit var mAppContext: Context
private var outing = false private var outing = false
override fun onBind(intent: Intent?): IBinder? { override fun onBind(intent: Intent?): IBinder? {
...@@ -31,9 +30,9 @@ class ExitService : Service() { ...@@ -31,9 +30,9 @@ class ExitService : Service() {
LoadingDialog.getInstance(mAppContext).show("切换中") LoadingDialog.getInstance(mAppContext).show("切换中")
GlobalScope.launch(Dispatchers.IO) { GlobalScope.launch(Dispatchers.IO) {
closeAccessibility(mAppContext as ExitService) (mAppContext as ExitService).closeAccessibility()
Prefs.setMdmInitializedWhenEnter(mAppContext, false) Prefs.setMdmInitializedWhenEnter(mAppContext, false)
WorkManager.exit(mAppContext) WorkManager.getInstance(mAppContext).exit()
delay(1500) delay(1500)
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
IntentUtil.startSystemLauncher(mAppContext) IntentUtil.startSystemLauncher(mAppContext)
......
package com.secspace.lib.common.function package com.secspace.lib.common.function
import android.content.Context import android.content.Context
import com.secspace.lib.common.dialog.LoadingDialog import java.util.*
import com.secspace.lib.common.env.Packages
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.util.ArrayList
abstract class ISwitch { 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?>? { protected fun getPersistentList(context: Context): MutableList<String>{
var list: MutableList<String?>? = null val list: MutableList<String> = ArrayList()
if (list == null) {
list = ArrayList()
}
if (list.size > 0) {
list.clear()
}
list.add(context.packageName) list.add(context.packageName)
list.add(Packages.PkgSecSpace.PACKAGENAME_MIDDLEWARE)
return list return list
} }
} }
\ No newline at end of file
...@@ -2,132 +2,103 @@ package com.secspace.lib.common.function ...@@ -2,132 +2,103 @@ package com.secspace.lib.common.function
import android.content.Context import android.content.Context
import android.content.Intent 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.content.pm.ResolveInfo
import android.util.Log import android.util.Log
import com.secspace.lib.common.arouter.libwork.IWorkApi import com.secspace.lib.common.dpm.DpmManager
import com.secspace.lib.common.env.Packages.PkgSecSpace import com.secspace.lib.common.env.Packages.PkgHuaWei.PACKAGENAME_HW_LAUNCHER
import com.secspace.lib.common.utils.DisableCompat import com.secspace.lib.common.utils.Package.ComponentNames.*
import com.secspace.lib.common.utils.DpmHelper import com.secspace.lib.common.utils.PkgManager
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.utils.Prefs 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() { class SwitchOutMdm constructor(var context: Context) : ISwitch() {
private var context: Context? = null
private val TAG = "SwitchOutMdm"
private fun removeDisallowedRunningApp(){ public override suspend fun init() {
val mdmFactoryManager = MdmFactoryManager.getInstance() Prefs.setInSpace(context, false)
mdmFactoryManager.deviceApplicationManager?.let { recover()
val list = it.disallowedRunningApp clearDefaultLauncher()
it.removeDisallowedRunningApp(list) removeDisallowedRunningApp()
Log.e(TAG, "remove:${list}") clearProcesses()
} killBackgroundApplication()
} }
private fun recover(context: Context) { private fun removeDisallowedRunningApp() = DpmManager.instance.applicationManager.let {
val mdmFactoryManager = MdmFactoryManager.getInstance() it.removeDisallowedRunningApp(it.getDisallowedRunningApp())
Prefs.setAutoStartSelf(context, false) }
mdmFactoryManager.deviceApplicationManager?.let {
private fun recover() {
DpmManager.instance.applicationManager.let {
it.removePersistentApp(getPersistentList(context)) 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 { DpmManager.instance.restrictionManager.let {
it.isAdbDisabled = false it.setAdbDisabled(false)
it.isUSBOtgDisabled = false it.setUSBOtgDisabled(false)
it.isUSBDataDisabled = false it.setUSBDataDisabled(false)
it.isExternalStorageDisabled = false it.setExternalStorageDisabled(false)
it.isStatusBarExpandPanelDisabled = false it.setStatusBarExpandPanelDisabled(false)
} it.setSystemUpdateDisabled(false)
mdmFactoryManager.deviceSettingsManager?.let {
it.isRestoreFactoryDisabled = false
it.isSystemUpdateDisabled = false
} }
DpmManager.instance.settingsManager.setRestoreFactoryDisabled(false)
DisableCompat.enableComponent(context, COMPONENT_UPDATE_SYSTEM)
DisableCompat.enableComponent(context, EnterprisePrivacySettingsActivity)
} }
private fun clearProcesses() { private fun clearProcesses() {
val dam = MdmFactoryManager.getInstance().deviceApplicationManager val mainIntent = Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER)
dam?.let { val resolveInfos: List<ResolveInfo> = context.packageManager.queryIntentActivities(mainIntent, 0)
//clear task for (resolveInfo in resolveInfos) {
val runningTasks = it.getRunningTasks(1000) val packageName = resolveInfo.activityInfo.packageName
if (runningTasks != null) { if (getPersistentList(context).contains(packageName)) {
for (task in runningTasks) { continue
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")
}
} }
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() { private fun killBackgroundApplication() {
val packageManager: PackageManager? = context?.packageManager
val mainIntent = Intent(Intent.ACTION_MAIN, null) val mainIntent = Intent(Intent.ACTION_MAIN, null)
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER) mainIntent.addCategory(Intent.CATEGORY_LAUNCHER)
val apps = packageManager?.queryIntentActivities(mainIntent, 0) val apps = context.packageManager.queryIntentActivities(mainIntent, 0)
for (i in apps?.indices!!) { for (i in apps?.indices!!) {
val name = apps[i].activityInfo.packageName val name = apps[i].activityInfo.packageName
Log.i(TAG, "killBackgroundApplication: $name") Log.i(TAG, "killBackgroundApplication: $name")
if (context?.packageName?.let { name.contains(it) }!! || name == PkgSecSpace.PACKAGENAME_MIDDLEWARE) { if (getPersistentList(context).contains(name)) {
continue continue
} }
MdmFactoryManager.getInstance().deviceApplicationManager?.forceStopPackage(name) PkgManager.getInstance(context).foceStopApp(name)
} }
} }
override suspend fun init(context: Context) { private fun clearDefaultLauncher() {
this.context = context DpmManager.instance.applicationManager.enableComponent(context, COMPONENT_HUAWEI_LUANCHER)
Prefs.setInSpace(context, false) DpmManager.instance.restrictionManager.clearDefaultLauncher()
recover(context) val launchers = Prefs.getHideLauncherPackages(context)
MdmUtils.clearDefaultLauncher(context) if (!launchers.contains(PACKAGENAME_HW_LAUNCHER)) {
removeDisallowedRunningApp() launchers.add(PACKAGENAME_HW_LAUNCHER)
clearProcesses() }
killBackgroundApplication() 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 ...@@ -8,7 +8,7 @@ import android.os.Handler
import android.os.Looper import android.os.Looper
import android.os.SystemClock import android.os.SystemClock
import com.secspace.lib.common.R 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.env.SEnvironment
import com.secspace.lib.common.function.ActivationHelper.ActivationListener import com.secspace.lib.common.function.ActivationHelper.ActivationListener
import com.secspace.lib.common.function.ActivationHelper.active import com.secspace.lib.common.function.ActivationHelper.active
...@@ -16,77 +16,47 @@ import com.secspace.lib.common.function.DialogManager.MessageListener ...@@ -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.function.DialogManager.showActivateLoseDialog
import com.secspace.lib.common.utils.* import com.secspace.lib.common.utils.*
import com.secspace.log.Log import com.secspace.log.Log
import com.secspace.mdmengine.api.manager.MdmFactoryManager
import com.skr.activation.network.linstener.CheckActiveStatusListener import com.skr.activation.network.linstener.CheckActiveStatusListener
import kotlinx.coroutines.* import kotlinx.coroutines.*
import java.io.File import java.io.File
object WorkManager { class WorkManager private constructor(var context: Context) {
private val TAG = "SecSpaceWorkManager"
private lateinit var mContext: Context
private val mHandler: Handler = Handler(Looper.getMainLooper(), Handler.Callback { true }) private val mHandler: Handler = Handler(Looper.getMainLooper(), Handler.Callback { true })
private var mEnterTime: Long = 0 private var mEnterTime: Long = 0
private var isChecksCompleted = false private var isChecksCompleted = false
private val SYSTEM_AGENT_RUNTIME_PERMISSIONS = arrayOf(
"android.permission.READ_PHONE_STATE", fun enter(launcher: Activity) {
"android.permission.WRITE_EXTERNAL_STORAGE", val isMdmInitialized = Prefs.isMdmInitializedWhenEnter(context)
"android.permission.READ_EXTERNAL_STORAGE"
)
fun enter(launcher: Activity?) {
mContext = launcher!!.applicationContext
val isMdmInitialized = Prefs.isMdmInitializedWhenEnter(mContext)
if (isChecksCompleted && isMdmInitialized) { if (isChecksCompleted && isMdmInitialized) {
Log.i(TAG, "isMdmInitialized: $isMdmInitialized, isChecksCompleted:$isChecksCompleted") Log.i(TAG, "isMdmInitialized: $isMdmInitialized, isChecksCompleted:$isChecksCompleted")
return return
} }
mEnterTime = SystemClock.uptimeMillis() mEnterTime = SystemClock.uptimeMillis()
//检查中间件是否是最新的 DpmManager.instance.init(context)
if (!DpmHelper.getInstance(mContext).isMiddlewareLatest) {
DialogManager.showInstallMiddleWare(launcher)
return
}
DpmHelper.getInstance(mContext).initMiddleWare() if (!DpmManager.instance.isActive()) {
DpmManager.instance.active()
//检查中间件是否激活
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
} }
// LoadingDialog.getInstance(launcher).show("切换中")
GlobalScope.launch(Dispatchers.IO) { GlobalScope.launch(Dispatchers.IO) {
// TODO 暂时屏蔽 launcher.openAccessibility()
// openAccessibility(launcher) SwitchInMdm.getInstance(context).init()
SwitchInMdm.onInit(launcher)
activate(launcher) activate(launcher)
withContext(Dispatchers.Main){ withContext(Dispatchers.Main) {
if(Prefs.isTips(launcher)){ if (Prefs.isTips(launcher)) {
DialogManager.showMessageDialogOnlySure(launcher, launcher.getString(R.string.common_remind), launcher.getString(R.string.edu_item_first_install_tips), null) DialogManager.showMessageDialogOnlySure(launcher, launcher.getString(R.string.common_remind), launcher.getString(R.string.edu_item_first_install_tips), null)
Prefs.setTips(launcher, false) Prefs.setTips(launcher, false)
} }
} }
// checkLocalUpdateFile() //检查本地更新文件 checkLocalUpdateFile() //检查本地更新文件
delay(5000) delay(5000)
ActivationHelper.checkActivate(launcher, EduCheckActiveStatusListener(launcher)) ActivationHelper.checkActivate(launcher, EduCheckActiveStatusListener(launcher))
} }
isChecksCompleted = true isChecksCompleted = true
Prefs.setMdmInitializedWhenEnter(mContext, true) Prefs.setMdmInitializedWhenEnter(context, true)
} }
fun activate(activity: Activity) { private fun activate(activity: Activity) {
active(activity, object : ActivationListener { active(activity, object : ActivationListener {
override fun activationFailed() { override fun activationFailed() {
showActivateLoseDialog(activity, activity.getString(R.string.common_remind) showActivateLoseDialog(activity, activity.getString(R.string.common_remind)
...@@ -103,10 +73,8 @@ object WorkManager { ...@@ -103,10 +73,8 @@ object WorkManager {
}, false) }, false)
} }
fun exit(context: Context?) { fun exit() = GlobalScope.launch(Dispatchers.IO) {
GlobalScope.launch(Dispatchers.IO) { SwitchOutMdm.getInstance(context).init()
context?.let { SwitchOutMdm.onExit(it) }
}
} }
private fun hasPermissions(permissions: Array<String>, packageName: String): Boolean { private fun hasPermissions(permissions: Array<String>, packageName: String): Boolean {
...@@ -116,7 +84,7 @@ object WorkManager { ...@@ -116,7 +84,7 @@ object WorkManager {
val length = permissions.size val length = permissions.size
for (i in 0 until length) { for (i in 0 until length) {
val permission = permissions[i] val permission = permissions[i]
if (mContext.packageManager.checkPermission(permission, packageName) != PackageManager.PERMISSION_GRANTED) { if (context.packageManager.checkPermission(permission, packageName) != PackageManager.PERMISSION_GRANTED) {
return false return false
} }
} }
...@@ -129,7 +97,7 @@ object WorkManager { ...@@ -129,7 +97,7 @@ object WorkManager {
*/ */
private fun checkLocalUpdateFile() { private fun checkLocalUpdateFile() {
Log.d(TAG, "check local update file") Log.d(TAG, "check local update file")
val dir = File(mContext.getExternalFilesDir(""), "Download") val dir = File(context.getExternalFilesDir(""), "Download")
if (!dir.exists()) { if (!dir.exists()) {
Log.i(TAG, "Download dir is not exist.") Log.i(TAG, "Download dir is not exist.")
return return
...@@ -140,10 +108,10 @@ object WorkManager { ...@@ -140,10 +108,10 @@ object WorkManager {
return return
} }
var updateFile: File? = null var updateFile: File? = null
val currentVCode = PkgManager.getInstance(mContext).getVersionCodeFromPackage(mContext.packageName) val currentVCode = PkgManager.getInstance(context).getVersionCodeFromPackage(context.packageName)
var newVCode = -1 var newVCode = -1
for (file: File in files) { for (file: File in files) {
val fileCode = PkgManager.getInstance(mContext).getStorageApkVersionCode(file.absolutePath) val fileCode = PkgManager.getInstance(context).getStorageApkVersionCode(file.absolutePath)
if (newVCode < fileCode) { if (newVCode < fileCode) {
newVCode = fileCode newVCode = fileCode
updateFile = file updateFile = file
...@@ -159,16 +127,16 @@ object WorkManager { ...@@ -159,16 +127,16 @@ object WorkManager {
return return
} }
Log.i(TAG, "Will install update File: " + updateFile.absolutePath) Log.i(TAG, "Will install update File: " + updateFile.absolutePath)
ToastUtil.showShort(mContext, "更新中...") ToastUtil.showShort(context, "更新中...")
install(updateFile.absolutePath) install(updateFile.absolutePath)
} }
private fun pathFromAssets(name: String): String { 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) { private fun install(path: String) {
PkgManager.getInstance(mContext).installByInstaller(path) PkgManager.getInstance(context).installByInstaller(path)
} }
/** /**
...@@ -180,10 +148,10 @@ object WorkManager { ...@@ -180,10 +148,10 @@ object WorkManager {
install(path) install(path)
} }
fun removeForbidden(context: Context) { fun removeForbidden() {
Prefs.setMdmInitializedWhenEnter(context, false) Prefs.setMdmInitializedWhenEnter(context, false)
GlobalScope.launch(Dispatchers.IO) { GlobalScope.launch(Dispatchers.IO) {
SwitchOutMdm.onExit(context) SwitchOutMdm.getInstance(context).init()
UninstallUtil.removeForbidden(context) UninstallUtil.removeForbidden(context)
} }
} }
...@@ -236,4 +204,23 @@ object WorkManager { ...@@ -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) { ...@@ -60,7 +60,7 @@ class DatabaseManager private constructor(val context: Context) {
companion object { companion object {
@Volatile @Volatile
private var instance: DatabaseManager? = null private var instance: DatabaseManager? = null
@JvmStatic
fun getInstance(context: Context): DatabaseManager { fun getInstance(context: Context): DatabaseManager {
if (instance == null) { if (instance == null) {
synchronized(DatabaseManager::class) { 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 ...@@ -5,6 +5,8 @@ import android.util.Log
import com.secspace.lib.common.function.database.DatabaseManager import com.secspace.lib.common.function.database.DatabaseManager
import com.secspace.lib.common.function.model.UseApp import com.secspace.lib.common.function.model.UseApp
import com.secspace.lib.common.function.model.UseTime 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 import com.secspace.lib.common.utils.getApplicationName
class UseAppManager private constructor(val context: Context) { class UseAppManager private constructor(val context: Context) {
...@@ -80,9 +82,9 @@ class UseAppManager private constructor(val context: Context) { ...@@ -80,9 +82,9 @@ class UseAppManager private constructor(val context: Context) {
useApp.appPackage = packageName useApp.appPackage = packageName
useApp.uploadTime = 0 useApp.uploadTime = 0
DatabaseManager.getInstance(context).getUseAppDao()?.insertUseApp(useApp) 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, "文件写入完毕") // Log.e(TAG, "文件写入完毕")
// write2File(iconString,Environment.getExternalStorageDirectory().toString() + "/temp1.txt") // 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 ...@@ -5,7 +5,6 @@ import android.content.Context
import android.os.Environment import android.os.Environment
import android.telephony.TelephonyManager import android.telephony.TelephonyManager
import android.util.Log import android.util.Log
import com.skr.activation.utils.DesUtil
import java.io.File import java.io.File
import java.io.FileWriter import java.io.FileWriter
import java.util.* import java.util.*
...@@ -51,14 +50,14 @@ object ImeiUtil { ...@@ -51,14 +50,14 @@ object ImeiUtil {
if (file.createNewFile()) { if (file.createNewFile()) {
val fileWriter = FileWriter(file, false) val fileWriter = FileWriter(file, false)
fileWriter.use { fileWriter.use {
fileWriter.write(DesUtil.encrypt(imei)) fileWriter.write(imei.encrypt())
} }
} else { } else {
Log.e(TAG, "createNewFile failed") Log.e(TAG, "createNewFile failed")
} }
} }
} else { } else {
imei = DesUtil.decrypt(file.readText()) imei = file.readText().decrypt()
Log.i(TAG, "imei $imei") Log.i(TAG, "imei $imei")
} }
return imei return imei
...@@ -78,13 +77,13 @@ object ImeiUtil { ...@@ -78,13 +77,13 @@ object ImeiUtil {
if (file.createNewFile()) { if (file.createNewFile()) {
val fileWriter = FileWriter(file, false) val fileWriter = FileWriter(file, false)
fileWriter.use { fileWriter.use {
fileWriter.write(DesUtil.encrypt(uuid)) fileWriter.write(uuid.encrypt())
} }
} else { } else {
Log.e(TAG, "createNewFile failed") Log.e(TAG, "createNewFile failed")
} }
} else { } else {
uuid = DesUtil.decrypt(file.readText()) uuid = file.readText().decrypt()
Log.i(TAG, "uuid $uuid") Log.i(TAG, "uuid $uuid")
} }
return 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 { ...@@ -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_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_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 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 COMPONENT_HUAWEI_LUANCHER = 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_ENTERPRISE_PRIVACY_SETTING = new ComponentName("com.android.settings", "com.android.settings.Settings$COMPONENT_ENTERPRISE_PRIVACY_SETTING");
} }
} }
...@@ -274,26 +274,6 @@ public class Prefs { ...@@ -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 * @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 { ...@@ -216,14 +216,4 @@ public class SettingsUtil {
} }
return granted; 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 package com.secspace.lib.common.utils
import android.content.ComponentName
import android.content.Context import android.content.Context
import com.secspace.lib.common.env.Packages.PkgSecSpace.PACKAGENAME_MDMENHANCE import com.secspace.lib.common.dpm.DpmManager
import com.secspace.lib.common.env.Packages.PkgSecSpace.PACKAGENAME_MIDDLEWARE import com.secspace.lib.common.utils.Package.ComponentNames.COMPONENT_HUAWEI_LUANCHER
import com.secspace.lib.common.utils.Package.COMPONENT_ADMIN_CLASS
import com.secspace.lib.common.utils.Package.ComponentNames.COMPONENT_NAME_HW_HWOUC 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?) { fun removeForbidden(context: Context) {
DisableCompat.enableComponent(context, huaweiLuancher) DpmManager.instance.restrictionManager.let {
MdmFactoryManager.getInstance().switchFactory(WhichFactory.HUAWEI) it.clearDefaultLauncher()
DisableCompat.enableComponent(context, COMPONENT_NAME_HW_HWOUC) it.setStatusBarExpandPanelDisabled(false)
MdmFactoryManager.getInstance().deviceSettingsManager.isSystemUpdateDisabled = false it.setSystemUpdateDisabled(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)
} }
val disallowedUninstallPackageList = MdmFactoryManager.getInstance().deviceApplicationManager.disallowedUninstallPackageList
if (disallowedUninstallPackageList != null && disallowedUninstallPackageList.size > 0) { DpmManager.instance.applicationManager.let {
MdmFactoryManager.getInstance().deviceApplicationManager.removeDisallowedUninstallPackages(disallowedUninstallPackageList) 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() DpmManager.instance.settingsManager.let {
DisableCompat.enableComponent(context, huaweiLuancher) it.setRestoreFactoryDisabled(false)
}
DpmManager.instance.removeActive()
} }
fun uninstallService(context: Context?) { fun uninstallService(context: Context?) {
if (PkgManagerHelper.getInstance(context).isAppInstalled(context?.packageName)) { if (PkgManagerHelper.getInstance(context).isAppInstalled(context?.packageName)) {
PkgManagerHelper.getInstance(context).uninstallByInstaller(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 ...@@ -10,6 +10,9 @@ import android.provider.Settings
import android.util.Base64 import android.util.Base64
import com.secspace.lib.common.function.service.EduAccessibilityService import com.secspace.lib.common.function.service.EduAccessibilityService
import com.skr.activation.utils.DesUtil 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.ByteArrayOutputStream
import java.io.File import java.io.File
import java.io.FileWriter import java.io.FileWriter
...@@ -17,28 +20,24 @@ import java.text.SimpleDateFormat ...@@ -17,28 +20,24 @@ import java.text.SimpleDateFormat
import java.util.* import java.util.*
fun decrypt(strMi: String): String { fun String.decrypt(): String = DesUtil.decrypt(this)
return DesUtil.decrypt(strMi)
}
fun encrypt(strMi: String): String { fun String.encrypt(): String = DesUtil.encrypt(this)
return DesUtil.encrypt(strMi)
}
fun openAccessibility(ctx: Context) { fun Context.openAccessibility() = this.let {
try { try {
Settings.Secure.putString(ctx.contentResolver, Settings.Secure.putString(this.contentResolver,
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, ctx.packageName + "/" + EduAccessibilityService::class.java.name) Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, this.packageName + "/" + EduAccessibilityService::class.java.name)
Settings.Secure.putString(ctx.contentResolver, Settings.Secure.putString(this.contentResolver,
Settings.Secure.ACCESSIBILITY_ENABLED, "1") Settings.Secure.ACCESSIBILITY_ENABLED, "1")
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
} }
} }
fun closeAccessibility(ctx: Context) { fun Context.closeAccessibility() = this.let {
try { try {
Settings.Secure.putString(ctx.contentResolver, Settings.Secure.putString(this.contentResolver,
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "") Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "")
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
...@@ -64,32 +63,30 @@ fun getApplicationIcon(context: Context?, packageName: String): Drawable? { ...@@ -64,32 +63,30 @@ fun getApplicationIcon(context: Context?, packageName: String): Drawable? {
} }
@Synchronized @Synchronized
fun drawableToString(drawable: Drawable?): String? { fun Drawable.drawableToString(): String = this.let {
drawable?.let { val bitmap = Bitmap
val bitmap = Bitmap .createBitmap(
.createBitmap( it.intrinsicWidth,
it.intrinsicWidth, it.intrinsicHeight,
it.intrinsicHeight, if (it.opacity != PixelFormat.OPAQUE) Bitmap.Config.ARGB_8888 else Bitmap.Config.RGB_565)
if (it.opacity != PixelFormat.OPAQUE) Bitmap.Config.ARGB_8888 else Bitmap.Config.RGB_565) val canvas = Canvas(bitmap)
val canvas = Canvas(bitmap) it.setBounds(0, 0, it.intrinsicWidth,
it.setBounds(0, 0, it.intrinsicWidth, it.intrinsicHeight)
it.intrinsicHeight) it.draw(canvas)
it.draw(canvas) val size = bitmap.width * bitmap.height * 4
val size = bitmap.width * bitmap.height * 4 // 创建一个字节数组输出流,流的大小为size
// 创建一个字节数组输出流,流的大小为size val baos = ByteArrayOutputStream(size)
val baos = ByteArrayOutputStream(size) // 设置位图的压缩格式,质量为100%,并放入字节数组输出流中
// 设置位图的压缩格式,质量为100%,并放入字节数组输出流中 bitmap.compress(Bitmap.CompressFormat.PNG, 10, baos)
bitmap.compress(Bitmap.CompressFormat.PNG, 10, baos) // 将字节数组输出流转化为字节数组byte[]
// 将字节数组输出流转化为字节数组byte[] val imagedata: ByteArray = baos.toByteArray()
val imagedata: ByteArray = baos.toByteArray() Base64.encodeToString(imagedata, Base64.DEFAULT)
return Base64.encodeToString(imagedata, Base64.DEFAULT)
}
return null
} }
fun write2File(source: String, filePath: String) { fun write2File(source: String, filePath: String) {
val file = File(filePath) val file = File(filePath)
if(file.exists()){ if (file.exists()) {
file.delete() file.delete()
} }
if (!file.createNewFile()) { if (!file.createNewFile()) {
...@@ -101,16 +98,16 @@ fun write2File(source: String, filePath: String) { ...@@ -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) 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 = "" var stringTimes = ""
val days = minute / (60 * 24) val days = this / (60 * 24)
val hours = minute % (60 * 24) / 60 val hours = this % (60 * 24) / 60
val minutes = minute % 60 val minutes = this % 60
when { when {
days > 0 -> { days > 0 -> {
stringTimes = days.toString() + "天" + hours + "时" + minutes + "分" stringTimes = days.toString() + "天" + hours + "时" + minutes + "分"
...@@ -122,5 +119,7 @@ fun formatDateTime(minute: Long): String { ...@@ -122,5 +119,7 @@ fun formatDateTime(minute: Long): String {
stringTimes = minutes.toString() + "分" stringTimes = minutes.toString() + "分"
} }
} }
return stringTimes stringTimes
} }
\ No newline at end of file
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; ...@@ -108,6 +108,8 @@ public static java.lang.String TABLENAME;
-keepclassmembers class com.my.pkg.MyRealApplication { -keepclassmembers class com.my.pkg.MyRealApplication {
public <init>(); public <init>();
} }
-keep class com.huawei.android.app. ** {*;
}
# 如果不使用android.support.annotation.Keep则需加上此行 # 如果不使用android.support.annotation.Keep则需加上此行
# -keep class com.my.pkg.SophixStubApplication$RealApplicationStub # -keep class com.my.pkg.SophixStubApplication$RealApplicationStub
#以上sophix热修复 #以上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