Loading services/java/com/android/server/RecognitionManagerService.java +72 −36 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -35,17 +40,22 @@ 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; Loading @@ -54,10 +64,11 @@ public class RecognitionManagerService extends Binder { 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); } } } Loading @@ -65,37 +76,45 @@ public class RecognitionManagerService extends Binder { 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) { Loading @@ -115,19 +134,36 @@ public class RecognitionManagerService extends Binder { } } 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); } } } }; } Loading
services/java/com/android/server/RecognitionManagerService.java +72 −36 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -35,17 +40,22 @@ 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; Loading @@ -54,10 +64,11 @@ public class RecognitionManagerService extends Binder { 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); } } } Loading @@ -65,37 +76,45 @@ public class RecognitionManagerService extends Binder { 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) { Loading @@ -115,19 +134,36 @@ public class RecognitionManagerService extends Binder { } } 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); } } } }; }