From a43f144d4f0443146bae33359cc3222d2059db16 Mon Sep 17 00:00:00 2001 From: Gustav Sennton Date: Thu, 23 Mar 2017 17:04:23 +0000 Subject: [PATCH] Listen to USER_STARTED instead of USER_ADDED from WebViewUpdateService. When adding a restricted user, 'hidden' applications are uninstalled for the user after creation of the user, but before the user is 'started'. Because WebViewUpdateService only listens to USER_ADDED and USER_REMOVED intents it wouldn't realize that Chrome had been uninstalled for a new restricted user (at the time of user-creation Chrome would be installed). Instead listen to user-started/stopped intents to ensure the restricted-user case is handled correctly. Bug: 35813523 Test: Add a restricted user (on a Pixel C), with Chrome disabled. Start an app using WebView (and ensure WebView doesn't crash). Change-Id: I0c5d0a543b4bc80d269e586444b80cd3baffa11c --- .../java/com/android/server/webkit/WebViewUpdateService.java | 4 ++-- .../com/android/server/webkit/WebViewUpdateServiceImpl.java | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateService.java b/services/core/java/com/android/server/webkit/WebViewUpdateService.java index 3b400b43b7253..d7458f2f6e1ab 100644 --- a/services/core/java/com/android/server/webkit/WebViewUpdateService.java +++ b/services/core/java/com/android/server/webkit/WebViewUpdateService.java @@ -92,7 +92,7 @@ public class WebViewUpdateService extends SystemService { (intent.getExtras().getBoolean(Intent.EXTRA_REPLACING) ? PACKAGE_ADDED_REPLACED : PACKAGE_ADDED), userId); break; - case Intent.ACTION_USER_ADDED: + case Intent.ACTION_USER_STARTED: mImpl.handleNewUser(userId); break; case Intent.ACTION_USER_REMOVED: @@ -115,7 +115,7 @@ public class WebViewUpdateService extends SystemService { null /* broadcast permission */, null /* handler */); IntentFilter userAddedFilter = new IntentFilter(); - userAddedFilter.addAction(Intent.ACTION_USER_ADDED); + userAddedFilter.addAction(Intent.ACTION_USER_STARTED); userAddedFilter.addAction(Intent.ACTION_USER_REMOVED); getContext().registerReceiverAsUser(mWebViewUpdatedReceiver, UserHandle.ALL, userAddedFilter, null /* broadcast permission */, null /* handler */); diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java index 114c3628abde1..991d40ab18d2c 100644 --- a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java +++ b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java @@ -112,6 +112,10 @@ public class WebViewUpdateServiceImpl { } void handleNewUser(int userId) { + // The system user is always started at boot, and by that point we have already run one + // round of the package-changing logic (through prepareWebViewInSystemServer()), so early + // out here. + if (userId == UserHandle.USER_SYSTEM) return; handleUserChange(); }