Skip to content

Commit e1a996e

Browse files
Dianne HackbornAndroid (Google) Code Review
authored andcommitted
Merge "Move handling of package changes to a background thread."
2 parents ebd4775 + d0d7503 commit e1a996e

File tree

13 files changed

+95
-68
lines changed

13 files changed

+95
-68
lines changed

core/java/android/server/search/SearchManagerService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public SearchManagerService(Context context) {
6969
private synchronized Searchables getSearchables() {
7070
if (mSearchables == null) {
7171
Log.i(TAG, "Building list of searchable activities");
72-
new MyPackageMonitor().register(mContext, true);
72+
new MyPackageMonitor().register(mContext, null, true);
7373
mSearchables = new Searchables(mContext);
7474
mSearchables.buildSearchableList();
7575
}

core/java/android/widget/ActivityChooserModel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ private ActivityChooserModel(Context context, String historyFileName) {
365365
} else {
366366
mHistoryFileName = historyFileName;
367367
}
368-
mPackageMonitor.register(mContext, true);
368+
mPackageMonitor.register(mContext, null, true);
369369
}
370370

371371
/**

core/java/com/android/internal/app/ResolverActivity.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ protected void onCreate(Bundle savedInstanceState, Intent intent,
9999
ap.mTitle = title;
100100
ap.mOnClickListener = this;
101101

102-
mPackageMonitor.register(this, false);
102+
mPackageMonitor.register(this, getMainLooper(), false);
103103

104104
if (alwaysUseOption) {
105105
LayoutInflater inflater = (LayoutInflater) getSystemService(
@@ -135,7 +135,7 @@ protected void onCreate(Bundle savedInstanceState, Intent intent,
135135
@Override
136136
protected void onRestart() {
137137
super.onRestart();
138-
mPackageMonitor.register(this, false);
138+
mPackageMonitor.register(this, getMainLooper(), false);
139139
mAdapter.handlePackagesChanged();
140140
}
141141

core/java/com/android/internal/content/PackageMonitor.java

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
import android.content.Intent;
2222
import android.content.IntentFilter;
2323
import android.net.Uri;
24+
import android.os.Handler;
25+
import android.os.HandlerThread;
26+
import android.os.Looper;
2427

2528
import java.util.HashSet;
2629

@@ -32,7 +35,11 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
3235
static final IntentFilter sPackageFilt = new IntentFilter();
3336
static final IntentFilter sNonDataFilt = new IntentFilter();
3437
static final IntentFilter sExternalFilt = new IntentFilter();
35-
38+
39+
static final Object sLock = new Object();
40+
static HandlerThread sBackgroundThread;
41+
static Handler sBackgroundHandler;
42+
3643
static {
3744
sPackageFilt.addAction(Intent.ACTION_PACKAGE_ADDED);
3845
sPackageFilt.addAction(Intent.ACTION_PACKAGE_REMOVED);
@@ -49,6 +56,7 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
4956
final HashSet<String> mUpdatingPackages = new HashSet<String>();
5057

5158
Context mRegisteredContext;
59+
Handler mRegisteredHandler;
5260
String[] mDisappearingPackages;
5361
String[] mAppearingPackages;
5462
String[] mModifiedPackages;
@@ -57,18 +65,35 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
5765

5866
String[] mTempArray = new String[1];
5967

60-
public void register(Context context, boolean externalStorage) {
68+
public void register(Context context, Looper thread, boolean externalStorage) {
6169
if (mRegisteredContext != null) {
6270
throw new IllegalStateException("Already registered");
6371
}
6472
mRegisteredContext = context;
65-
context.registerReceiver(this, sPackageFilt);
66-
context.registerReceiver(this, sNonDataFilt);
73+
if (thread == null) {
74+
synchronized (sLock) {
75+
if (sBackgroundThread == null) {
76+
sBackgroundThread = new HandlerThread("PackageMonitor",
77+
android.os.Process.THREAD_PRIORITY_BACKGROUND);
78+
sBackgroundThread.start();
79+
sBackgroundHandler = new Handler(sBackgroundThread.getLooper());
80+
}
81+
mRegisteredHandler = sBackgroundHandler;
82+
}
83+
} else {
84+
mRegisteredHandler = new Handler(thread);
85+
}
86+
context.registerReceiver(this, sPackageFilt, null, mRegisteredHandler);
87+
context.registerReceiver(this, sNonDataFilt, null, mRegisteredHandler);
6788
if (externalStorage) {
68-
context.registerReceiver(this, sExternalFilt);
89+
context.registerReceiver(this, sExternalFilt, null, mRegisteredHandler);
6990
}
7091
}
71-
92+
93+
public Handler getRegisteredHandler() {
94+
return mRegisteredHandler;
95+
}
96+
7297
public void unregister() {
7398
if (mRegisteredContext == null) {
7499
throw new IllegalStateException("Not registered");

services/java/com/android/server/DevicePolicyManagerService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ public void onSomePackagesChanged() {
451451
public DevicePolicyManagerService(Context context) {
452452
mContext = context;
453453
mMonitor = new MyPackageMonitor();
454-
mMonitor.register(context, true);
454+
mMonitor.register(context, null, true);
455455
mWakeLock = ((PowerManager)context.getSystemService(Context.POWER_SERVICE))
456456
.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "DPM");
457457
IntentFilter filter = new IntentFilter();

services/java/com/android/server/InputMethodManagerService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -594,7 +594,7 @@ public void executeMessage(Message msg) {
594594
}
595595
mImListManager = new InputMethodAndSubtypeListManager(context, this);
596596

597-
(new MyPackageMonitor()).register(mContext, true);
597+
(new MyPackageMonitor()).register(mContext, null, true);
598598

599599
IntentFilter screenOnOffFilt = new IntentFilter();
600600
screenOnOffFilt.addAction(Intent.ACTION_SCREEN_ON);

services/java/com/android/server/LocationManagerService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ public LocationManagerService(Context context) {
511511
com.android.internal.R.string.config_networkLocationProvider);
512512
mGeocodeProviderPackageName = resources.getString(
513513
com.android.internal.R.string.config_geocodeProvider);
514-
mPackageMonitor.register(context, true);
514+
mPackageMonitor.register(context, null, true);
515515

516516
if (LOCAL_LOGV) {
517517
Slog.v(TAG, "Constructed LocationManager Service");

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public void onSomePackagesChanged() {
6565
RecognitionManagerService(Context context) {
6666
mContext = context;
6767
mMonitor = new MyPackageMonitor();
68-
mMonitor.register(context, true);
68+
mMonitor.register(context, null, true);
6969
}
7070

7171
public void systemReady() {

services/java/com/android/server/TextServicesManagerService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public TextServicesManagerService(Context context) {
7777
mSystemReady = false;
7878
mContext = context;
7979
mMonitor = new TextServicesMonitor();
80-
mMonitor.register(context, true);
80+
mMonitor.register(context, null, true);
8181
synchronized (mSpellCheckerMap) {
8282
buildSpellCheckerMapLocked(context, mSpellCheckerList, mSpellCheckerMap);
8383
}

services/java/com/android/server/WallpaperManagerService.java

Lines changed: 51 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ public void onPackageModified(String packageName) {
295295
|| !wallpaper.wallpaperComponent.getPackageName().equals(packageName)) {
296296
continue;
297297
}
298-
doPackagesChanged(true, wallpaper);
298+
doPackagesChangedLocked(true, wallpaper);
299299
}
300300
}
301301
}
@@ -315,66 +315,68 @@ public void onPackageUpdateStarted(String packageName, int uid) {
315315

316316
@Override
317317
public boolean onHandleForceStop(Intent intent, String[] packages, int uid, boolean doit) {
318-
boolean changed = false;
319-
for (int i = 0; i < mWallpaperMap.size(); i++) {
320-
WallpaperData wallpaper = mWallpaperMap.valueAt(i);
321-
boolean res = doPackagesChanged(doit, wallpaper);
322-
changed |= res;
318+
synchronized (mLock) {
319+
boolean changed = false;
320+
for (int i = 0; i < mWallpaperMap.size(); i++) {
321+
WallpaperData wallpaper = mWallpaperMap.valueAt(i);
322+
boolean res = doPackagesChangedLocked(doit, wallpaper);
323+
changed |= res;
324+
}
325+
return changed;
323326
}
324-
return changed;
325327
}
326328

327329
@Override
328330
public void onSomePackagesChanged() {
329-
for (int i = 0; i < mWallpaperMap.size(); i++) {
330-
WallpaperData wallpaper = mWallpaperMap.valueAt(i);
331-
doPackagesChanged(true, wallpaper);
331+
synchronized (mLock) {
332+
for (int i = 0; i < mWallpaperMap.size(); i++) {
333+
WallpaperData wallpaper = mWallpaperMap.valueAt(i);
334+
doPackagesChangedLocked(true, wallpaper);
335+
}
332336
}
333337
}
334338

335-
boolean doPackagesChanged(boolean doit, WallpaperData wallpaper) {
339+
boolean doPackagesChangedLocked(boolean doit, WallpaperData wallpaper) {
336340
boolean changed = false;
337-
synchronized (mLock) {
338-
if (wallpaper.wallpaperComponent != null) {
339-
int change = isPackageDisappearing(wallpaper.wallpaperComponent
340-
.getPackageName());
341-
if (change == PACKAGE_PERMANENT_CHANGE
342-
|| change == PACKAGE_TEMPORARY_CHANGE) {
343-
changed = true;
344-
if (doit) {
345-
Slog.w(TAG, "Wallpaper uninstalled, removing: "
346-
+ wallpaper.wallpaperComponent);
347-
clearWallpaperLocked(false, wallpaper.userId);
348-
}
349-
}
350-
}
351-
if (wallpaper.nextWallpaperComponent != null) {
352-
int change = isPackageDisappearing(wallpaper.nextWallpaperComponent
353-
.getPackageName());
354-
if (change == PACKAGE_PERMANENT_CHANGE
355-
|| change == PACKAGE_TEMPORARY_CHANGE) {
356-
wallpaper.nextWallpaperComponent = null;
357-
}
358-
}
359-
if (wallpaper.wallpaperComponent != null
360-
&& isPackageModified(wallpaper.wallpaperComponent.getPackageName())) {
361-
try {
362-
mContext.getPackageManager().getServiceInfo(
363-
wallpaper.wallpaperComponent, 0);
364-
} catch (NameNotFoundException e) {
365-
Slog.w(TAG, "Wallpaper component gone, removing: "
341+
if (wallpaper.wallpaperComponent != null) {
342+
int change = isPackageDisappearing(wallpaper.wallpaperComponent
343+
.getPackageName());
344+
if (change == PACKAGE_PERMANENT_CHANGE
345+
|| change == PACKAGE_TEMPORARY_CHANGE) {
346+
changed = true;
347+
if (doit) {
348+
Slog.w(TAG, "Wallpaper uninstalled, removing: "
366349
+ wallpaper.wallpaperComponent);
367350
clearWallpaperLocked(false, wallpaper.userId);
368351
}
369352
}
370-
if (wallpaper.nextWallpaperComponent != null
371-
&& isPackageModified(wallpaper.nextWallpaperComponent.getPackageName())) {
372-
try {
373-
mContext.getPackageManager().getServiceInfo(
374-
wallpaper.nextWallpaperComponent, 0);
375-
} catch (NameNotFoundException e) {
376-
wallpaper.nextWallpaperComponent = null;
377-
}
353+
}
354+
if (wallpaper.nextWallpaperComponent != null) {
355+
int change = isPackageDisappearing(wallpaper.nextWallpaperComponent
356+
.getPackageName());
357+
if (change == PACKAGE_PERMANENT_CHANGE
358+
|| change == PACKAGE_TEMPORARY_CHANGE) {
359+
wallpaper.nextWallpaperComponent = null;
360+
}
361+
}
362+
if (wallpaper.wallpaperComponent != null
363+
&& isPackageModified(wallpaper.wallpaperComponent.getPackageName())) {
364+
try {
365+
mContext.getPackageManager().getServiceInfo(
366+
wallpaper.wallpaperComponent, 0);
367+
} catch (NameNotFoundException e) {
368+
Slog.w(TAG, "Wallpaper component gone, removing: "
369+
+ wallpaper.wallpaperComponent);
370+
clearWallpaperLocked(false, wallpaper.userId);
371+
}
372+
}
373+
if (wallpaper.nextWallpaperComponent != null
374+
&& isPackageModified(wallpaper.nextWallpaperComponent.getPackageName())) {
375+
try {
376+
mContext.getPackageManager().getServiceInfo(
377+
wallpaper.nextWallpaperComponent, 0);
378+
} catch (NameNotFoundException e) {
379+
wallpaper.nextWallpaperComponent = null;
378380
}
379381
}
380382
return changed;
@@ -387,7 +389,7 @@ public WallpaperManagerService(Context context) {
387389
mIWindowManager = IWindowManager.Stub.asInterface(
388390
ServiceManager.getService(Context.WINDOW_SERVICE));
389391
mMonitor = new MyPackageMonitor();
390-
mMonitor.register(context, true);
392+
mMonitor.register(context, null, true);
391393
WALLPAPER_BASE_DIR.mkdirs();
392394
loadSettingsLocked(0);
393395
}

0 commit comments

Comments
 (0)