From 3d84813961a7e33ea1f61803cdcda125760cc4c9 Mon Sep 17 00:00:00 2001 From: Hongming Jin Date: Tue, 24 Apr 2018 14:20:11 -0700 Subject: [PATCH] Unbind autofill service when the service package is updated. Test: atest FieldsClassificationTest adb shell cmd autofill get fc_score half kale m -j50 ExtServices && adb install -r ${OUT}/system/priv-app/ExtServices/ExtServices.apk adb shell cmd autofill get fc_score half kale Bug: 77596771 Change-Id: I29f6f5593dbe0155437d01ef73d07a354abe687d --- .../server/autofill/AutofillManagerService.java | 12 ++++++++++++ .../autofill/AutofillManagerServiceImpl.java | 16 ++++++++++++++++ .../autofill/FieldClassificationStrategy.java | 14 +++++++++++++- 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java index 3253f2e406921..51c0488dcd9f4 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java @@ -219,6 +219,8 @@ public final class AutofillManagerService extends SystemService { final String activePackageName = getActiveAutofillServicePackageName(); if (packageName.equals(activePackageName)) { removeCachedServiceLocked(getChangingUserId()); + } else { + handlePackageUpdateLocked(packageName); } } } @@ -250,6 +252,8 @@ public final class AutofillManagerService extends SystemService { return true; } removeCachedServiceLocked(getChangingUserId()); + } else { + handlePackageUpdateLocked(pkg); } } } @@ -274,6 +278,14 @@ public final class AutofillManagerService extends SystemService { } return serviceComponent.getPackageName(); } + + @GuardedBy("mLock") + private void handlePackageUpdateLocked(String packageName) { + final int size = mServicesCache.size(); + for (int i = 0; i < size; i++) { + mServicesCache.valueAt(i).handlePackageUpdateLocked(packageName); + } + } }; // package changes diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java index 0bb29a7d1967e..e582daa29335a 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java @@ -625,10 +625,26 @@ final class AutofillManagerServiceImpl { } } + @GuardedBy("mLock") + void handlePackageUpdateLocked(String packageName) { + final ServiceInfo serviceInfo = mFieldClassificationStrategy.getServiceInfo(); + if (serviceInfo != null && serviceInfo.packageName.equals(packageName)) { + resetExtServiceLocked(); + } + } + + @GuardedBy("mLock") + void resetExtServiceLocked() { + if (sVerbose) Slog.v(TAG, "reset autofill service."); + mFieldClassificationStrategy.reset(); + } + @GuardedBy("mLock") void destroyLocked() { if (sVerbose) Slog.v(TAG, "destroyLocked()"); + resetExtServiceLocked(); + final int numSessions = mSessions.size(); final ArraySet remoteFillServices = new ArraySet<>(numSessions); for (int i = 0; i < numSessions; i++) { diff --git a/services/autofill/java/com/android/server/autofill/FieldClassificationStrategy.java b/services/autofill/java/com/android/server/autofill/FieldClassificationStrategy.java index da5220104e3c3..9bec856e23089 100644 --- a/services/autofill/java/com/android/server/autofill/FieldClassificationStrategy.java +++ b/services/autofill/java/com/android/server/autofill/FieldClassificationStrategy.java @@ -83,7 +83,7 @@ final class FieldClassificationStrategy { } @Nullable - private ServiceInfo getServiceInfo() { + ServiceInfo getServiceInfo() { final String packageName = mContext.getPackageManager().getServicesSystemSharedLibraryPackageName(); if (packageName == null) { @@ -119,6 +119,18 @@ final class FieldClassificationStrategy { return name; } + void reset() { + synchronized (mLock) { + if (mServiceConnection != null) { + if (sDebug) Slog.d(TAG, "reset(): unbinding service."); + mContext.unbindService(mServiceConnection); + mServiceConnection = null; + } else { + if (sDebug) Slog.d(TAG, "reset(): service is not bound. Do nothing."); + } + } + } + /** * Run a command, starting the service connection if necessary. */