1818
1919import com .android .internal .content .PackageMonitor ;
2020
21+ import android .app .AppGlobals ;
22+ import android .content .BroadcastReceiver ;
2123import android .content .ComponentName ;
2224import android .content .Context ;
2325import android .content .Intent ;
26+ import android .content .IntentFilter ;
27+ import android .content .pm .IPackageManager ;
2428import android .content .pm .ResolveInfo ;
2529import android .content .pm .ServiceInfo ;
26- import android .content .pm .PackageManager .NameNotFoundException ;
2730import android .os .Binder ;
31+ import android .os .RemoteException ;
32+ import android .os .UserHandle ;
2833import android .provider .Settings ;
2934import android .speech .RecognitionService ;
3035import android .text .TextUtils ;
3439
3540public class RecognitionManagerService extends Binder {
3641 final static String TAG = "RecognitionManagerService" ;
37-
38- final Context mContext ;
39- final MyPackageMonitor mMonitor ;
40-
42+
43+ private final Context mContext ;
44+ private final MyPackageMonitor mMonitor ;
45+ private final IPackageManager mIPm ;
46+
47+ private static final boolean DEBUG = false ;
48+
4149 class MyPackageMonitor extends PackageMonitor {
4250 public void onSomePackagesChanged () {
43- ComponentName comp = getCurRecognizer ();
51+ int userHandle = getChangingUserId ();
52+ if (DEBUG ) Slog .i (TAG , "onSomePackagesChanged user=" + userHandle );
53+ ComponentName comp = getCurRecognizer (userHandle );
4454 if (comp == null ) {
4555 if (anyPackagesAppearing ()) {
46- comp = findAvailRecognizer (null );
56+ comp = findAvailRecognizer (null , userHandle );
4757 if (comp != null ) {
48- setCurRecognizer (comp );
58+ setCurRecognizer (comp , userHandle );
4959 }
5060 }
5161 return ;
5262 }
53-
63+
5464 int change = isPackageDisappearing (comp .getPackageName ());
5565 if (change == PACKAGE_PERMANENT_CHANGE
5666 || change == PACKAGE_TEMPORARY_CHANGE ) {
57- setCurRecognizer (findAvailRecognizer (null ) );
67+ setCurRecognizer (findAvailRecognizer (null , userHandle ), userHandle );
5868
5969 } else if (isPackageModified (comp .getPackageName ())) {
60- setCurRecognizer (findAvailRecognizer (comp .getPackageName ()));
70+ setCurRecognizer (findAvailRecognizer (comp .getPackageName (), userHandle ),
71+ userHandle );
6172 }
6273 }
6374 }
64-
75+
6576 RecognitionManagerService (Context context ) {
6677 mContext = context ;
6778 mMonitor = new MyPackageMonitor ();
68- mMonitor .register (context , null , true );
79+ mMonitor .register (context , null , UserHandle .ALL , true );
80+ mIPm = AppGlobals .getPackageManager ();
81+ mContext .registerReceiverAsUser (mBroadcastReceiver , UserHandle .ALL ,
82+ new IntentFilter (Intent .ACTION_BOOT_COMPLETED ), null , null );
6983 }
70-
84+
7185 public void systemReady () {
72- ComponentName comp = getCurRecognizer ();
86+ initForUser (UserHandle .USER_OWNER );
87+ }
88+
89+ private void initForUser (int userHandle ) {
90+ if (DEBUG ) Slog .i (TAG , "initForUser user=" + userHandle );
91+ ComponentName comp = getCurRecognizer (userHandle );
7392 if (comp != null ) {
7493 // See if the current recognizer is no longer available.
7594 try {
76- mContext . getPackageManager (). getServiceInfo (comp , 0 );
77- } catch (NameNotFoundException e ) {
78- comp = findAvailRecognizer (null );
95+ mIPm . getServiceInfo (comp , 0 , userHandle );
96+ } catch (RemoteException e ) {
97+ comp = findAvailRecognizer (null , userHandle );
7998 if (comp != null ) {
80- setCurRecognizer (comp );
99+ setCurRecognizer (comp , userHandle );
81100 }
82101 }
83102 } else {
84- comp = findAvailRecognizer (null );
103+ comp = findAvailRecognizer (null , userHandle );
85104 if (comp != null ) {
86- setCurRecognizer (comp );
105+ setCurRecognizer (comp , userHandle );
87106 }
88107 }
89108 }
90-
91- ComponentName findAvailRecognizer (String prefPackage ) {
109+
110+ ComponentName findAvailRecognizer (String prefPackage , int userHandle ) {
92111 List <ResolveInfo > available =
93- mContext .getPackageManager ().queryIntentServices (
94- new Intent (RecognitionService .SERVICE_INTERFACE ), 0 );
112+ mContext .getPackageManager ().queryIntentServicesAsUser (
113+ new Intent (RecognitionService .SERVICE_INTERFACE ), 0 , userHandle );
95114 int numAvailable = available .size ();
96-
115+
97116 if (numAvailable == 0 ) {
98- Slog .w (TAG , "no available voice recognition services found" );
117+ Slog .w (TAG , "no available voice recognition services found for user " + userHandle );
99118 return null ;
100119 } else {
101120 if (prefPackage != null ) {
@@ -109,25 +128,42 @@ ComponentName findAvailRecognizer(String prefPackage) {
109128 if (numAvailable > 1 ) {
110129 Slog .w (TAG , "more than one voice recognition service found, picking first" );
111130 }
112-
131+
113132 ServiceInfo serviceInfo = available .get (0 ).serviceInfo ;
114133 return new ComponentName (serviceInfo .packageName , serviceInfo .name );
115134 }
116135 }
117-
118- ComponentName getCurRecognizer () {
119- String curRecognizer = Settings .Secure .getString (
136+
137+ ComponentName getCurRecognizer (int userHandle ) {
138+ String curRecognizer = Settings .Secure .getStringForUser (
120139 mContext .getContentResolver (),
121- Settings .Secure .VOICE_RECOGNITION_SERVICE );
140+ Settings .Secure .VOICE_RECOGNITION_SERVICE , userHandle );
122141 if (TextUtils .isEmpty (curRecognizer )) {
123142 return null ;
124143 }
144+ if (DEBUG ) Slog .i (TAG , "getCurRecognizer curRecognizer=" + curRecognizer
145+ + " user=" + userHandle );
125146 return ComponentName .unflattenFromString (curRecognizer );
126147 }
127-
128- void setCurRecognizer (ComponentName comp ) {
129- Settings .Secure .putString (mContext .getContentResolver (),
148+
149+ void setCurRecognizer (ComponentName comp , int userHandle ) {
150+ Settings .Secure .putStringForUser (mContext .getContentResolver (),
130151 Settings .Secure .VOICE_RECOGNITION_SERVICE ,
131- comp != null ? comp .flattenToShortString () : "" );
152+ comp != null ? comp .flattenToShortString () : "" , userHandle );
153+ if (DEBUG ) Slog .i (TAG , "setCurRecognizer comp=" + comp
154+ + " user=" + userHandle );
132155 }
156+
157+ BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver () {
158+ public void onReceive (Context context , Intent intent ) {
159+ String action = intent .getAction ();
160+ if (DEBUG ) Slog .i (TAG , "received " + action );
161+ if (Intent .ACTION_BOOT_COMPLETED .equals (action )) {
162+ int userHandle = intent .getIntExtra (Intent .EXTRA_USER_HANDLE , -1 );
163+ if (userHandle > 0 ) {
164+ initForUser (userHandle );
165+ }
166+ }
167+ }
168+ };
133169}
0 commit comments