1.默认主屏幕应用(默认LAUNCHER)
//vendor/mediatek/proprietary/packages/apps/PermissionController/src/com/android/permissioncontroller/role/service/RoleControllerServiceImpl.java
@Override
@WorkerThread
public boolean onGrantDefaultRoles() {
if (DEBUG) {
Log.i(LOG_TAG, "Granting default roles, user: " + UserHandle.myUserId());
}
// Gather the available roles for current user.
ArrayMap<String, Role> roleMap = Roles.get(this);
List<Role> roles = new ArrayList<>();
List<String> roleNames = new ArrayList<>();
ArraySet<String> addedRoleNames = new ArraySet<>();
int roleMapSize = roleMap.size();
for (int i = 0; i < roleMapSize; i++) {
Role role = roleMap.valueAt(i);
if (!role.isAvailable(this)) {
continue;
}
roles.add(role);
String roleName = role.getName();
roleNames.add(roleName);
if (!mRoleManager.isRoleAvailable(roleName)) {
addedRoleNames.add(roleName);
}
}
// TODO: Clean up holders of roles that will be removed.
// Set the available role names in RoleManager.
mRoleManager.setRoleNamesFromController(roleNames);
int addedRoleNamesSize = addedRoleNames.size();
for (int i = 0; i < addedRoleNamesSize; i++) {
String roleName = addedRoleNames.valueAt(i);
Role role = roleMap.get(roleName);
role.onRoleAdded(this);
}
// Go through the holders of all roles.
int rolesSize = roles.size();
for (int rolesIndex = 0; rolesIndex < rolesSize; rolesIndex++) {
Role role = roles.get(rolesIndex);
String roleName = role.getName();
// For each of the current holders, check if it is still qualified, redo grant if so, or
// remove it otherwise.
List<String> currentPackageNames = mRoleManager.getRoleHolders(roleName);
int currentPackageNamesSize = currentPackageNames.size();
for (int currentPackageNamesIndex = 0;
currentPackageNamesIndex < currentPackageNamesSize;
currentPackageNamesIndex++) {
String packageName = currentPackageNames.get(currentPackageNamesIndex);
if (role.isPackageQualified(packageName, this)) {
// We should not override user set or fixed permissions because we are only
// redoing the grant here. Otherwise, user won't be able to revoke permissions
// granted by role.
addRoleHolderInternal(role, packageName, false, false, true);
} else {
Log.i(LOG_TAG, "Removing package that no longer qualifies for the role,"
+ " package: " + packageName + ", role: " + roleName);
removeRoleHolderInternal(role, packageName, false);
}
}
// If there is no holder for a role now, we need to add default or fallback holders, if
// any.
currentPackageNames = mRoleManager.getRoleHolders(roleName);
currentPackageNamesSize = currentPackageNames.size();
if (currentPackageNamesSize == 0) {
List<String> packageNamesToAdd = null;
if (addedRoleNames.contains(roleName)) {
packageNamesToAdd = role.getDefaultHolders(this);
}
if (packageNamesToAdd == null || packageNamesToAdd.isEmpty()) {
packageNamesToAdd = CollectionUtils.singletonOrEmpty(role.getFallbackHolder(
this));
//添加默认LAUNCHFER和默认短信应用
if(RoleManager.ROLE_HOME.equals(roleName)){
String homePackage = android.os.SystemProperties.get("ro.config.default_home");
if(!android.text.TextUtils.isEmpty(homePackage)){
packageNamesToAdd = new ArrayList<>();
packageNamesToAdd.add(homePackage);
}
}else if (RoleManager.ROLE_SMS.equals(roleName)) {
String mmsPackage = android.os.SystemProperties.get("ro.config.default_mms");
if(!android.text.TextUtils.isEmpty(mmsPackage)){
packageNamesToAdd = new ArrayList<>();
packageNamesToAdd.add(mmsPackage);
}
}
//end..
}
int packageNamesToAddSize = packageNamesToAdd.size();
for (int packageNamesToAddIndex = 0; packageNamesToAddIndex < packageNamesToAddSize;
packageNamesToAddIndex++) {
String packageName = packageNamesToAdd.get(packageNamesToAddIndex);
if (!role.isPackageQualified(packageName, this)) {
Log.e(LOG_TAG, "Default/fallback role holder package doesn't qualify for"
+ " the role, package: " + packageName + ", role: " + roleName);
continue;
}
Log.i(LOG_TAG, "Adding package as default/fallback role holder, package: "
+ packageName + ", role: " + roleName);
// TODO: If we don't override user here, user might end up missing incoming
// phone calls or SMS, so we just keep the old behavior. But overriding user
// choice about permission without explicit user action is bad, so maybe we
// should at least show a notification?
addRoleHolderInternal(role, packageName, true);
}
}
// Ensure that an exclusive role has at most one holder.
currentPackageNames = mRoleManager.getRoleHolders(roleName);
currentPackageNamesSize = currentPackageNames.size();
if (role.isExclusive() && currentPackageNamesSize > 1) {
Log.w(LOG_TAG, "Multiple packages holding an exclusive role, role: "
+ roleName);
// No good way to determine who should be the only one, just keep the first one.
for (int currentPackageNamesIndex = 1;
currentPackageNamesIndex < currentPackageNamesSize;
currentPackageNamesIndex++) {
String packageName = currentPackageNames.get(currentPackageNamesIndex);
Log.i(LOG_TAG, "Removing extraneous package for an exclusive role, package: "
+ packageName + ", role: " + roleName);
removeRoleHolderInternal(role, packageName, false);
}
}
}
return true;
}
2.禁止打开 默认应用-主屏幕应用 选择界面
--- a/alps/vendor/mediatek/proprietary/packages/apps/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppActivity.java
+++ b/alps/vendor/mediatek/proprietary/packages/apps/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppActivity.java
@@ -35,6 +35,7 @@ import com.android.permissioncontroller.role.model.Role;
import com.android.permissioncontroller.role.model.Roles;
import com.android.permissioncontroller.role.ui.auto.AutoDefaultAppFragment;
import com.android.permissioncontroller.role.ui.handheld.HandheldDefaultAppFragment;
+import android.app.role.RoleManager;
/**
* Activity for a default app.
@@ -81,6 +82,7 @@ public class DefaultAppActivity extends FragmentActivity {
}
Role role = Roles.get(this).get(roleName);
+ android.util.Log.d("lfy","[DefaultAppActivity] onCreate...roleName="+roleName);
if (role == null) {
Log.e(LOG_TAG, "Unknown role: " + roleName);
finish();
@@ -96,6 +98,10 @@ public class DefaultAppActivity extends FragmentActivity {
finish();
return;
}
+ if (RoleManager.ROLE_HOME.equals(roleName)) {
+ finish();
+ return;
+ }
if (savedInstanceState == null) {
Fragment fragment;