diff options
| -rw-r--r-- | core/java/com/android/internal/content/PackageMonitor.java | 18 | ||||
| -rw-r--r-- | services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java | 44 |
2 files changed, 60 insertions, 2 deletions
diff --git a/core/java/com/android/internal/content/PackageMonitor.java b/core/java/com/android/internal/content/PackageMonitor.java index c6b6a7fb999f..d2e97897c042 100644 --- a/core/java/com/android/internal/content/PackageMonitor.java +++ b/core/java/com/android/internal/content/PackageMonitor.java @@ -65,6 +65,7 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { int mChangeType; int mChangeUserId = UserHandle.USER_NULL; boolean mSomePackagesChanged; + String[] mModifiedComponents; String[] mTempArray = new String[1]; @@ -269,6 +270,18 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { } return false; } + + public boolean isComponentModified(String className) { + if (className == null || mModifiedComponents == null) { + return false; + } + for (int i = mModifiedComponents.length - 1; i >= 0; i--) { + if (className.equals(mModifiedComponents[i])) { + return true; + } + } + return false; + } public void onSomePackagesChanged() { } @@ -301,6 +314,7 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { mDisappearingPackages = mAppearingPackages = null; mSomePackagesChanged = false; + mModifiedComponents = null; String action = intent.getAction(); if (Intent.ACTION_PACKAGE_ADDED.equals(action)) { @@ -358,13 +372,13 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { } else if (Intent.ACTION_PACKAGE_CHANGED.equals(action)) { String pkg = getPackageName(intent); int uid = intent.getIntExtra(Intent.EXTRA_UID, 0); - String[] components = intent.getStringArrayExtra( + mModifiedComponents = intent.getStringArrayExtra( Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST); if (pkg != null) { mModifiedPackages = mTempArray; mTempArray[0] = pkg; mChangeType = PACKAGE_PERMANENT_CHANGE; - if (onPackageChanged(pkg, uid, components)) { + if (onPackageChanged(pkg, uid, mModifiedComponents)) { mSomePackagesChanged = true; } onPackageModified(pkg); diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java index 6c4ced4326a2..4ffacfd7056a 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java @@ -1203,6 +1203,50 @@ public class VoiceInteractionManagerService extends SystemService { } @Override + public void onPackageModified(String pkgName) { + // If the package modified is not in the current user, then don't bother making + // any changes as we are going to do any initialization needed when we switch users. + if (mCurUser != getChangingUserId()) { + return; + } + // Package getting updated will be handled by {@link #onSomePackagesChanged}. + if (isPackageAppearing(pkgName) != PACKAGE_UNCHANGED) { + return; + } + final ComponentName curInteractor = getCurInteractor(mCurUser); + if (curInteractor == null) { + final VoiceInteractionServiceInfo availInteractorInfo + = findAvailInteractor(mCurUser, pkgName); + if (availInteractorInfo != null) { + final ComponentName availInteractor = new ComponentName( + availInteractorInfo.getServiceInfo().packageName, + availInteractorInfo.getServiceInfo().name); + setCurInteractor(availInteractor, mCurUser); + if (getCurRecognizer(mCurUser) == null && + availInteractorInfo.getRecognitionService() != null) { + setCurRecognizer(new ComponentName( + availInteractorInfo.getServiceInfo().packageName, + availInteractorInfo.getRecognitionService()), mCurUser); + } + } + } else { + if (didSomePackagesChange()) { + // Package is changed + if (curInteractor != null && pkgName.equals( + curInteractor.getPackageName())) { + switchImplementationIfNeeded(true); + } + } else { + // Only some components are changed + if (curInteractor != null + && isComponentModified(curInteractor.getClassName())) { + switchImplementationIfNeeded(true); + } + } + } + } + + @Override public void onSomePackagesChanged() { int userHandle = getChangingUserId(); if (DEBUG) Slog.d(TAG, "onSomePackagesChanged user=" + userHandle); |