Skip to content

Commit b8c2ac3

Browse files
Amith YamasaniAndroid (Google) Code Review
authored andcommitted
Merge "Watch for voice recognition service changes for all users" into jb-mr1-dev
2 parents 4bbcc65 + f80a9b2 commit b8c2ac3

File tree

1 file changed

+72
-36
lines changed

1 file changed

+72
-36
lines changed

services/java/com/android/server/RecognitionManagerService.java

Lines changed: 72 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,18 @@
1818

1919
import com.android.internal.content.PackageMonitor;
2020

21+
import android.app.AppGlobals;
22+
import android.content.BroadcastReceiver;
2123
import android.content.ComponentName;
2224
import android.content.Context;
2325
import android.content.Intent;
26+
import android.content.IntentFilter;
27+
import android.content.pm.IPackageManager;
2428
import android.content.pm.ResolveInfo;
2529
import android.content.pm.ServiceInfo;
26-
import android.content.pm.PackageManager.NameNotFoundException;
2730
import android.os.Binder;
31+
import android.os.RemoteException;
32+
import android.os.UserHandle;
2833
import android.provider.Settings;
2934
import android.speech.RecognitionService;
3035
import android.text.TextUtils;
@@ -34,68 +39,82 @@
3439

3540
public 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

Comments
 (0)