隐藏系统“设置”页面功能选项
首先找到源码的“设置”模块代码,路径:
packages/Setting/......
找到SettingsActivity
类,如果嫌麻烦也可以全局搜doUpdateTilesList
函数,路径:
com.android.settings.SettingsActivity
类中有一个方法doUpdateTilesList
就是我们所需要改动的函数,贴一下方法中的代码:
private void doUpdateTilesList() {
PackageManager pm = getPackageManager();
final UserManager um = UserManager.get(this);
final boolean isAdmin = um.isAdminUser();
final FeatureFactory featureFactory = FeatureFactory.getFactory(this);
boolean somethingChanged = false;
final String packageName = getPackageName();
final StringBuilder changedList = new StringBuilder();
somethingChanged = setTileEnabled(changedList,
new ComponentName(packageName, WifiSettingsActivity.class.getName()),
pm.hasSystemFeature(PackageManager.FEATURE_WIFI), isAdmin) || somethingChanged;
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
Settings.BluetoothSettingsActivity.class.getName()),
pm.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH), isAdmin)
|| somethingChanged;
// Enable DataUsageSummaryActivity if the data plan feature flag is turned on otherwise
// enable DataPlanUsageSummaryActivity.
somethingChanged = setTileEnabled(changedList,
new ComponentName(packageName, Settings.DataUsageSummaryActivity.class.getName()),
Utils.isBandwidthControlEnabled() /* enabled */,
isAdmin) || somethingChanged;
somethingChanged = setTileEnabled(changedList,
new ComponentName(packageName,
Settings.ConnectedDeviceDashboardActivity.class.getName()),
!UserManager.isDeviceInDemoMode(this) /* enabled */,
isAdmin) || somethingChanged;
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
Settings.SimSettingsActivity.class.getName()),
Utils.showSimCardTile(this), isAdmin)
|| somethingChanged;
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
Settings.PowerUsageSummaryActivity.class.getName()),
mBatteryPresent, isAdmin) || somethingChanged;
final boolean isDataUsageSettingsV2Enabled =
FeatureFlagUtils.isEnabled(this, FeatureFlags.DATA_USAGE_SETTINGS_V2);
// Enable new data usage page if v2 enabled
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
Settings.DataUsageSummaryActivity.class.getName()),
Utils.isBandwidthControlEnabled() && isDataUsageSettingsV2Enabled, isAdmin)
|| somethingChanged;
// Enable legacy data usage page if v2 disabled
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
Settings.DataUsageSummaryLegacyActivity.class.getName()),
Utils.isBandwidthControlEnabled() && !isDataUsageSettingsV2Enabled, isAdmin)
|| somethingChanged;
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
Settings.UserSettingsActivity.class.getName()),
UserHandle.MU_ENABLED && UserManager.supportsMultipleUsers()
&& !Utils.isMonkeyRunning(), isAdmin)
|| somethingChanged;
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
Settings.NetworkDashboardActivity.class.getName()),
!UserManager.isDeviceInDemoMode(this), isAdmin)
|| somethingChanged;
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
Settings.DateTimeSettingsActivity.class.getName()),
!UserManager.isDeviceInDemoMode(this), isAdmin)
|| somethingChanged;
final boolean showDev = DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(this)
&& !Utils.isMonkeyRunning();
final boolean isAdminOrDemo = um.isAdminUser() || um.isDemoUser();
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
Settings.DevelopmentSettingsDashboardActivity.class.getName()),
showDev, isAdminOrDemo)
|| somethingChanged;
// Enable/disable backup settings depending on whether the user is admin.
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
BackupSettingsActivity.class.getName()), true, isAdmin)
|| somethingChanged;
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
Settings.WifiDisplaySettingsActivity.class.getName()),
WifiDisplaySettings.isAvailable(this), isAdmin)
|| somethingChanged;
// Enable/disable the Me Card page.
final boolean aboutPhoneV2Enabled = featureFactory
.getAccountFeatureProvider()
.isAboutPhoneV2Enabled(this);
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
Settings.MyDeviceInfoActivity.class.getName()),
aboutPhoneV2Enabled, isAdmin)
|| somethingChanged;
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
Settings.DeviceInfoSettingsActivity.class.getName()),
!aboutPhoneV2Enabled, isAdmin)
|| somethingChanged;
if (UserHandle.MU_ENABLED && !isAdmin) {
// When on restricted users, disable all extra categories (but only the settings ones).
final List<DashboardCategory> categories = mDashboardFeatureProvider.getAllCategories();
synchronized (categories) {
for (DashboardCategory category : categories) {
final int tileCount = category.getTilesCount();
for (int i = 0; i < tileCount; i++) {
final ComponentName component = category.getTile(i).intent.getComponent();
final String name = component.getClassName();
final boolean isEnabledForRestricted = ArrayUtils.contains(
SettingsGateway.SETTINGS_FOR_RESTRICTED, name) || (isAdminOrDemo
&& Settings.DevelopmentSettingsDashboardActivity.class.getName()
.equals(name));
if (packageName.equals(component.getPackageName())
&& !isEnabledForRestricted) {
somethingChanged =
setTileEnabled(changedList, component, false, isAdmin)
|| somethingChanged;
}
}
}
}
}
// Final step, refresh categories.
if (somethingChanged) {
Log.d(LOG_TAG, "Enabled state changed for some tiles, reloading all categories "
+ changedList.toString());
updateCategories();
} else {
Log.d(LOG_TAG, "No enabled state changed, skipping updateCategory call");
}
}
以上就是页面显示调用的函数,需要重点理解代码:
somethingChanged = setTileEnabled(changedList,
new ComponentName(packageName, Settings.DataUsageSummaryActivity.class.getName()),
Utils.isBandwidthControlEnabled() /* enabled */,
isAdmin) || somethingChanged;
例如以上代码表示是否显示DataUsageSummaryActivity类功能,setTileEnabled
函数的倒数第二个参数,是一个boolean值,即表示显示或隐藏,所以如果函数内能直接找到你需要隐藏的功能类,可以直接修改代码块中,倒数第二个参数的值为false即可。
需要注意,有可能存在此函数内没有对应功能的类的逻辑,此时需要你添加代码,如我想隐藏“账户”功能,但是doUpdateTilesList
中没有AccountDashboardActivity
的逻辑代码块,所以我直接添加:
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
Settings.AccountDashboardActivity.class.getName()),
false, isAdmin)
|| somethingChanged;
填入的AccountDashboardActivity
需与清单文件名称一致,不要填错。
然后只需编译Setting模块源代码,生成PAK PUSH进系统目录即可,关于模块编译请查看我的专栏“系统源码定制”的对应文章。