Disable WebViewSetting for non-admin users.

For an app to be able to know whether the WebViewSetting is enabled for
a user we disable the setting at boot for non-admin users. In this way
an app can call intent.resolveActivity[Info] for the WebViewSetting
intent to check whether the WebViewSetting is enabled before linking to
it.

Bug: 28034166
Change-Id: I33b3fa10a38f2a2600cddd0891ef746126abdd61
This commit is contained in:
Gustav Sennton
2016-05-11 12:31:40 +01:00
parent 938501cf76
commit 66313bb11d
2 changed files with 26 additions and 5 deletions

View File

@@ -153,7 +153,7 @@
</intent-filter> </intent-filter>
</activity> </activity>
<receiver android:name="ManagedProfileSetup"> <receiver android:name="SettingsInitialize">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.USER_INITIALIZE"/> <action android:name="android.intent.action.USER_INITIALIZE"/>
<action android:name="android.intent.action.PRE_BOOT_COMPLETED"/> <action android:name="android.intent.action.PRE_BOOT_COMPLETED"/>

View File

@@ -36,10 +36,11 @@ import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS;
/** /**
* Listens to {@link Intent.ACTION_BOOT_COMPLETED} and {@link Intent.ACTION_PRE_BOOT_COMPLETED} * Listens to {@link Intent.ACTION_BOOT_COMPLETED} and {@link Intent.ACTION_PRE_BOOT_COMPLETED}
* performs setup steps for a managed profile (disables the launcher icon of the Settings app and * performs setup steps for a managed profile (disables the launcher icon of the Settings app,
* adds cross-profile intent filters for the appropriate Settings activities). * adds cross-profile intent filters for the appropriate Settings activities), and disables the
* webview setting for non-admin users.
*/ */
public class ManagedProfileSetup extends BroadcastReceiver { public class SettingsInitialize extends BroadcastReceiver {
private static final String TAG = "Settings"; private static final String TAG = "Settings";
private static final String PRIMARY_PROFILE_SETTING = private static final String PRIMARY_PROFILE_SETTING =
"com.android.settings.PRIMARY_PROFILE_CONTROLLED"; "com.android.settings.PRIMARY_PROFILE_CONTROLLED";
@@ -48,12 +49,18 @@ public class ManagedProfileSetup extends BroadcastReceiver {
public void onReceive(Context context, Intent broadcast) { public void onReceive(Context context, Intent broadcast) {
final UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE); final UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
UserInfo userInfo = um.getUserInfo(UserHandle.myUserId()); UserInfo userInfo = um.getUserInfo(UserHandle.myUserId());
final PackageManager pm = context.getPackageManager();
managedProfileSetup(context, pm, broadcast, userInfo);
webviewSettingSetup(context, pm, userInfo);
}
private void managedProfileSetup(Context context, final PackageManager pm, Intent broadcast,
UserInfo userInfo) {
if (userInfo == null || !userInfo.isManagedProfile()) { if (userInfo == null || !userInfo.isManagedProfile()) {
return; return;
} }
Log.i(TAG, "Received broadcast: " + broadcast.getAction() Log.i(TAG, "Received broadcast: " + broadcast.getAction()
+ ". Setting up intent forwarding for managed profile."); + ". Setting up intent forwarding for managed profile.");
final PackageManager pm = context.getPackageManager();
// Clear any previous intent forwarding we set up // Clear any previous intent forwarding we set up
pm.clearCrossProfileIntentFilters(userInfo.id); pm.clearCrossProfileIntentFilters(userInfo.id);
@@ -86,4 +93,18 @@ public class ManagedProfileSetup extends BroadcastReceiver {
pm.setComponentEnabledSetting(settingsComponentName, pm.setComponentEnabledSetting(settingsComponentName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
} }
// Disable WebView Setting if the current user is not an admin
private void webviewSettingSetup(Context context, PackageManager pm, UserInfo userInfo) {
if (userInfo == null) {
return;
}
ComponentName settingsComponentName =
new ComponentName(context, WebViewImplementation.class);
pm.setComponentEnabledSetting(settingsComponentName,
userInfo.isAdmin() ?
PackageManager.COMPONENT_ENABLED_STATE_ENABLED :
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}
} }