diff options
| -rw-r--r-- | services/java/com/android/server/RecognitionManagerService.java | 108 |
1 files changed, 72 insertions, 36 deletions
diff --git a/services/java/com/android/server/RecognitionManagerService.java b/services/java/com/android/server/RecognitionManagerService.java index 3567cfc..1e0755d 100644 --- a/services/java/com/android/server/RecognitionManagerService.java +++ b/services/java/com/android/server/RecognitionManagerService.java @@ -18,13 +18,18 @@ package com.android.server; import com.android.internal.content.PackageMonitor; +import android.app.AppGlobals; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.IPackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; -import android.content.pm.PackageManager.NameNotFoundException; import android.os.Binder; +import android.os.RemoteException; +import android.os.UserHandle; import android.provider.Settings; import android.speech.RecognitionService; import android.text.TextUtils; @@ -34,68 +39,82 @@ import java.util.List; public class RecognitionManagerService extends Binder { final static String TAG = "RecognitionManagerService"; - - final Context mContext; - final MyPackageMonitor mMonitor; - + + private final Context mContext; + private final MyPackageMonitor mMonitor; + private final IPackageManager mIPm; + + private static final boolean DEBUG = false; + class MyPackageMonitor extends PackageMonitor { public void onSomePackagesChanged() { - ComponentName comp = getCurRecognizer(); + int userHandle = getChangingUserId(); + if (DEBUG) Slog.i(TAG, "onSomePackagesChanged user=" + userHandle); + ComponentName comp = getCurRecognizer(userHandle); if (comp == null) { if (anyPackagesAppearing()) { - comp = findAvailRecognizer(null); + comp = findAvailRecognizer(null, userHandle); if (comp != null) { - setCurRecognizer(comp); + setCurRecognizer(comp, userHandle); } } return; } - + int change = isPackageDisappearing(comp.getPackageName()); if (change == PACKAGE_PERMANENT_CHANGE || change == PACKAGE_TEMPORARY_CHANGE) { - setCurRecognizer(findAvailRecognizer(null)); + setCurRecognizer(findAvailRecognizer(null, userHandle), userHandle); } else if (isPackageModified(comp.getPackageName())) { - setCurRecognizer(findAvailRecognizer(comp.getPackageName())); + setCurRecognizer(findAvailRecognizer(comp.getPackageName(), userHandle), + userHandle); } } } - + RecognitionManagerService(Context context) { mContext = context; mMonitor = new MyPackageMonitor(); - mMonitor.register(context, null, true); + mMonitor.register(context, null, UserHandle.ALL, true); + mIPm = AppGlobals.getPackageManager(); + mContext.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, + new IntentFilter(Intent.ACTION_BOOT_COMPLETED), null, null); } - + public void systemReady() { - ComponentName comp = getCurRecognizer(); + initForUser(UserHandle.USER_OWNER); + } + + private void initForUser(int userHandle) { + if (DEBUG) Slog.i(TAG, "initForUser user=" + userHandle); + ComponentName comp = getCurRecognizer(userHandle); if (comp != null) { // See if the current recognizer is no longer available. try { - mContext.getPackageManager().getServiceInfo(comp, 0); - } catch (NameNotFoundException e) { - comp = findAvailRecognizer(null); + mIPm.getServiceInfo(comp, 0, userHandle); + } catch (RemoteException e) { + comp = findAvailRecognizer(null, userHandle); if (comp != null) { - setCurRecognizer(comp); + setCurRecognizer(comp, userHandle); } } } else { - comp = findAvailRecognizer(null); + comp = findAvailRecognizer(null, userHandle); if (comp != null) { - setCurRecognizer(comp); + setCurRecognizer(comp, userHandle); } } } - - ComponentName findAvailRecognizer(String prefPackage) { + + ComponentName findAvailRecognizer(String prefPackage, int userHandle) { List<ResolveInfo> available = - mContext.getPackageManager().queryIntentServices( - new Intent(RecognitionService.SERVICE_INTERFACE), 0); + mContext.getPackageManager().queryIntentServicesAsUser( + new Intent(RecognitionService.SERVICE_INTERFACE), 0, userHandle); int numAvailable = available.size(); - + if (numAvailable == 0) { - Slog.w(TAG, "no available voice recognition services found"); + Slog.w(TAG, "no available voice recognition services found for user " + userHandle); return null; } else { if (prefPackage != null) { @@ -109,25 +128,42 @@ public class RecognitionManagerService extends Binder { if (numAvailable > 1) { Slog.w(TAG, "more than one voice recognition service found, picking first"); } - + ServiceInfo serviceInfo = available.get(0).serviceInfo; return new ComponentName(serviceInfo.packageName, serviceInfo.name); } } - - ComponentName getCurRecognizer() { - String curRecognizer = Settings.Secure.getString( + + ComponentName getCurRecognizer(int userHandle) { + String curRecognizer = Settings.Secure.getStringForUser( mContext.getContentResolver(), - Settings.Secure.VOICE_RECOGNITION_SERVICE); + Settings.Secure.VOICE_RECOGNITION_SERVICE, userHandle); if (TextUtils.isEmpty(curRecognizer)) { return null; } + if (DEBUG) Slog.i(TAG, "getCurRecognizer curRecognizer=" + curRecognizer + + " user=" + userHandle); return ComponentName.unflattenFromString(curRecognizer); } - - void setCurRecognizer(ComponentName comp) { - Settings.Secure.putString(mContext.getContentResolver(), + + void setCurRecognizer(ComponentName comp, int userHandle) { + Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.VOICE_RECOGNITION_SERVICE, - comp != null ? comp.flattenToShortString() : ""); + comp != null ? comp.flattenToShortString() : "", userHandle); + if (DEBUG) Slog.i(TAG, "setCurRecognizer comp=" + comp + + " user=" + userHandle); } + + BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (DEBUG) Slog.i(TAG, "received " + action); + if (Intent.ACTION_BOOT_COMPLETED.equals(action)) { + int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1); + if (userHandle > 0) { + initForUser(userHandle); + } + } + } + }; } |
