summaryrefslogtreecommitdiffstats
path: root/services/java/com
diff options
context:
space:
mode:
authorAdam Cohen <adamcohen@google.com>2012-11-01 14:06:16 -0700
committerAdam Cohen <adamcohen@google.com>2012-11-01 15:06:44 -0700
commit039206a9b40d2188eb735f56ee51f131555c9dd3 (patch)
tree63c01f2698374d5a68354731d03b036e9e9659b6 /services/java/com
parent9986b2d2851e09dfeeb6c32659c9a630436e5272 (diff)
downloadframeworks_base-039206a9b40d2188eb735f56ee51f131555c9dd3.zip
frameworks_base-039206a9b40d2188eb735f56ee51f131555c9dd3.tar.gz
frameworks_base-039206a9b40d2188eb735f56ee51f131555c9dd3.tar.bz2
Pushing state persistence to a background thread
Change-Id: If776bc22c48525ba91dc7e4dd0e27de92612f2f5
Diffstat (limited to 'services/java/com')
-rw-r--r--services/java/com/android/server/AppWidgetServiceImpl.java47
1 files changed, 35 insertions, 12 deletions
diff --git a/services/java/com/android/server/AppWidgetServiceImpl.java b/services/java/com/android/server/AppWidgetServiceImpl.java
index 6a313a0..4f72abb 100644
--- a/services/java/com/android/server/AppWidgetServiceImpl.java
+++ b/services/java/com/android/server/AppWidgetServiceImpl.java
@@ -41,7 +41,10 @@ import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
import android.os.Environment;
+import android.os.Handler;
+import android.os.HandlerThread;
import android.os.IBinder;
+import android.os.Looper;
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
@@ -180,6 +183,8 @@ class AppWidgetServiceImpl {
boolean mStateLoaded;
int mMaxWidgetBitmapMemory;
+ private final Handler mSaveStateHandler;
+
// These are for debugging only -- widgets are going missing in some rare instances
ArrayList<Provider> mDeletedProviders = new ArrayList<Provider>();
ArrayList<Host> mDeletedHosts = new ArrayList<Host>();
@@ -189,6 +194,10 @@ class AppWidgetServiceImpl {
mPm = AppGlobals.getPackageManager();
mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
mUserId = userId;
+
+ HandlerThread handlerThread = new HandlerThread("AppWidgetServiceImpl -- Save state");
+ handlerThread.start();
+ mSaveStateHandler = new Handler(handlerThread.getLooper());
computeMaximumWidgetBitmapMemory();
}
@@ -236,7 +245,7 @@ class AppWidgetServiceImpl {
updateProvidersForPackageLocked(cn.getPackageName(), removedProviders);
}
}
- saveStateLocked();
+ saveStateAsync();
}
}
}
@@ -286,7 +295,7 @@ class AppWidgetServiceImpl {
providersModified |= addProvidersForPackageLocked(pkgName);
}
}
- saveStateLocked();
+ saveStateAsync();
}
} else {
Bundle extras = intent.getExtras();
@@ -297,7 +306,7 @@ class AppWidgetServiceImpl {
ensureStateLoadedLocked();
for (String pkgName : pkgList) {
providersModified |= removeProvidersForPackageLocked(pkgName);
- saveStateLocked();
+ saveStateAsync();
}
}
}
@@ -411,7 +420,7 @@ class AppWidgetServiceImpl {
private void ensureStateLoadedLocked() {
if (!mStateLoaded) {
- loadAppWidgetList();
+ loadAppWidgetListLocked();
loadStateLocked();
mStateLoaded = true;
}
@@ -432,7 +441,7 @@ class AppWidgetServiceImpl {
host.instances.add(id);
mAppWidgetIds.add(id);
- saveStateLocked();
+ saveStateAsync();
if (DBG) log("Allocating AppWidgetId for " + packageName + " host=" + hostId
+ " id=" + appWidgetId);
return appWidgetId;
@@ -445,7 +454,7 @@ class AppWidgetServiceImpl {
AppWidgetId id = lookupAppWidgetIdLocked(appWidgetId);
if (id != null) {
deleteAppWidgetLocked(id);
- saveStateLocked();
+ saveStateAsync();
}
}
}
@@ -457,7 +466,7 @@ class AppWidgetServiceImpl {
Host host = lookupHostLocked(callingUid, hostId);
if (host != null) {
deleteHostLocked(host);
- saveStateLocked();
+ saveStateAsync();
}
}
}
@@ -476,7 +485,7 @@ class AppWidgetServiceImpl {
}
}
if (changed) {
- saveStateLocked();
+ saveStateAsync();
}
}
}
@@ -592,7 +601,7 @@ class AppWidgetServiceImpl {
// schedule the future updates
registerForBroadcastsLocked(p, getAppWidgetIds(p));
- saveStateLocked();
+ saveStateAsync();
}
} finally {
Binder.restoreCallingIdentity(ident);
@@ -656,8 +665,8 @@ class AppWidgetServiceImpl {
} else {
mPackagesWithBindWidgetPermission.remove(packageName);
}
+ saveStateAsync();
}
- saveStateLocked();
}
// Binds to a specific RemoteViewsService
@@ -894,6 +903,20 @@ class AppWidgetServiceImpl {
}
}
+ private void saveStateAsync() {
+ mSaveStateHandler.post(mSaveStateRunnable);
+ }
+
+ private final Runnable mSaveStateRunnable = new Runnable() {
+ @Override
+ public void run() {
+ synchronized (mAppWidgetIds) {
+ ensureStateLoadedLocked();
+ saveStateLocked();
+ }
+ }
+ };
+
public void updateAppWidgetOptions(int appWidgetId, Bundle options) {
synchronized (mAppWidgetIds) {
options = cloneIfLocalBinder(options);
@@ -914,7 +937,7 @@ class AppWidgetServiceImpl {
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id.appWidgetId);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS, id.options);
mContext.sendBroadcastAsUser(intent, new UserHandle(mUserId));
- saveStateLocked();
+ saveStateAsync();
}
}
@@ -1215,7 +1238,7 @@ class AppWidgetServiceImpl {
}
}
- void loadAppWidgetList() {
+ void loadAppWidgetListLocked() {
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
try {
List<ResolveInfo> broadcastReceivers = mPm.queryIntentReceivers(intent,