Merge "Invalidate caches when locale changes." into nyc-dev

am: e141241

* commit 'e1412415d1653c81758c0671ab5300770db8f524':
  Invalidate caches when locale changes.

Change-Id: I22c0c294de3308501bb5e948b686533aba69d618
This commit is contained in:
Jeff Sharkey
2016-04-05 21:26:49 +00:00
committed by android-build-merger
4 changed files with 63 additions and 40 deletions

View File

@@ -69,7 +69,7 @@ public class DocumentsApplication extends Application {
final int memoryClassBytes = am.getMemoryClass() * 1024 * 1024; final int memoryClassBytes = am.getMemoryClass() * 1024 * 1024;
mRoots = new RootsCache(this); mRoots = new RootsCache(this);
mRoots.updateAsync(); mRoots.updateAsync(false);
mThumbnails = new ThumbnailCache(memoryClassBytes / 4); mThumbnails = new ThumbnailCache(memoryClassBytes / 4);
@@ -105,7 +105,7 @@ public class DocumentsApplication extends Application {
final String packageName = data.getSchemeSpecificPart(); final String packageName = data.getSchemeSpecificPart();
mRoots.updatePackageAsync(packageName); mRoots.updatePackageAsync(packageName);
} else { } else {
mRoots.updateAsync(); mRoots.updateAsync(true);
} }
} }
}; };

View File

@@ -122,7 +122,7 @@ public class RootsCache {
/** /**
* Gather roots from all known storage providers. * Gather roots from all known storage providers.
*/ */
public void updateAsync() { public void updateAsync(boolean forceRefreshAll) {
// NOTE: This method is called when the UI language changes. // NOTE: This method is called when the UI language changes.
// For that reason we update our RecentsRoot to reflect // For that reason we update our RecentsRoot to reflect
@@ -139,14 +139,15 @@ public class RootsCache {
| Root.FLAG_SUPPORTS_CREATE)); | Root.FLAG_SUPPORTS_CREATE));
assert(mRecentsRoot.availableBytes == -1); assert(mRecentsRoot.availableBytes == -1);
new UpdateTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); new UpdateTask(forceRefreshAll, null)
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} }
/** /**
* Gather roots from storage providers belonging to given package name. * Gather roots from storage providers belonging to given package name.
*/ */
public void updatePackageAsync(String packageName) { public void updatePackageAsync(String packageName) {
new UpdateTask(packageName).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); new UpdateTask(false, packageName).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} }
/** /**
@@ -223,23 +224,22 @@ public class RootsCache {
} }
private class UpdateTask extends AsyncTask<Void, Void, Void> { private class UpdateTask extends AsyncTask<Void, Void, Void> {
private final boolean mForceRefreshAll;
private final String mForceRefreshPackage; private final String mForceRefreshPackage;
private final Multimap<String, RootInfo> mTaskRoots = ArrayListMultimap.create(); private final Multimap<String, RootInfo> mTaskRoots = ArrayListMultimap.create();
private final HashSet<String> mTaskStoppedAuthorities = new HashSet<>(); private final HashSet<String> mTaskStoppedAuthorities = new HashSet<>();
/** /**
* Update all roots. * Create task to update roots cache.
*
* @param forceRefreshAll when true, all previously cached values for
* all packages should be ignored.
* @param forceRefreshPackage when non-null, all previously cached
* values for this specific package should be ignored.
*/ */
public UpdateTask() { public UpdateTask(boolean forceRefreshAll, String forceRefreshPackage) {
this(null); mForceRefreshAll = forceRefreshAll;
}
/**
* Force update roots belonging to given package name. Other roots will
* be copied from cached {@link #mRoots} values.
*/
public UpdateTask(String forceRefreshPackage) {
mForceRefreshPackage = forceRefreshPackage; mForceRefreshPackage = forceRefreshPackage;
} }
@@ -247,14 +247,6 @@ public class RootsCache {
protected Void doInBackground(Void... params) { protected Void doInBackground(Void... params) {
final long start = SystemClock.elapsedRealtime(); final long start = SystemClock.elapsedRealtime();
if (mForceRefreshPackage != null) {
// We must have previously cached values to fill in non-matching
// packages, so wait around for successful first load.
if (!waitForFirstLoad()) {
return null;
}
}
mTaskRoots.put(mRecentsRoot.authority, mRecentsRoot); mTaskRoots.put(mRecentsRoot.authority, mRecentsRoot);
final ContentResolver resolver = mContext.getContentResolver(); final ContentResolver resolver = mContext.getContentResolver();
@@ -300,7 +292,8 @@ public class RootsCache {
return; return;
} }
final boolean forceRefresh = Objects.equals(mForceRefreshPackage, info.packageName); final boolean forceRefresh = mForceRefreshAll
|| Objects.equals(info.packageName, mForceRefreshPackage);
mTaskRoots.putAll(info.authority, loadRootsForAuthority(mContext.getContentResolver(), mTaskRoots.putAll(info.authority, loadRootsForAuthority(mContext.getContentResolver(),
info.authority, forceRefresh)); info.authority, forceRefresh));
} }

View File

@@ -42,10 +42,10 @@ import android.database.sqlite.SQLiteException;
import android.net.Uri; import android.net.Uri;
import android.os.Binder; import android.os.Binder;
import android.os.Bundle; import android.os.Bundle;
import android.os.FactoryTest;
import android.os.IBinder; import android.os.IBinder;
import android.os.Parcel; import android.os.Parcel;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemProperties; import android.os.SystemProperties;
import android.os.UserHandle; import android.os.UserHandle;
import android.text.TextUtils; import android.text.TextUtils;
@@ -59,6 +59,7 @@ import android.util.SparseIntArray;
import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.IndentingPrintWriter;
import com.android.server.LocalServices; import com.android.server.LocalServices;
import com.android.server.SystemService;
import java.io.FileDescriptor; import java.io.FileDescriptor;
import java.io.PrintWriter; import java.io.PrintWriter;
@@ -74,6 +75,29 @@ import java.util.List;
public final class ContentService extends IContentService.Stub { public final class ContentService extends IContentService.Stub {
private static final String TAG = "ContentService"; private static final String TAG = "ContentService";
public static class Lifecycle extends SystemService {
private ContentService mContentService;
public Lifecycle(Context context) {
super(context);
}
@Override
public void onStart() {
final boolean factoryTest = (FactoryTest
.getMode() == FactoryTest.FACTORY_TEST_LOW_LEVEL);
mContentService = new ContentService(getContext(), factoryTest);
publishBinderService(ContentResolver.CONTENT_SERVICE_NAME, mContentService);
}
@Override
public void onCleanupUser(int userHandle) {
synchronized (mContentService.mCache) {
mContentService.mCache.remove(userHandle);
}
}
}
private Context mContext; private Context mContext;
private boolean mFactoryTest; private boolean mFactoryTest;
@@ -94,12 +118,18 @@ public final class ContentService extends IContentService.Stub {
private BroadcastReceiver mCacheReceiver = new BroadcastReceiver() { private BroadcastReceiver mCacheReceiver = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
final Uri data = intent.getData(); synchronized (mCache) {
if (data != null) { if (Intent.ACTION_LOCALE_CHANGED.equals(intent.getAction())) {
final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, mCache.clear();
UserHandle.USER_NULL); } else {
final String packageName = data.getSchemeSpecificPart(); final Uri data = intent.getData();
invalidateCacheLocked(userId, packageName, null); if (data != null) {
final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE,
UserHandle.USER_NULL);
final String packageName = data.getSchemeSpecificPart();
invalidateCacheLocked(userId, packageName, null);
}
}
} }
} }
}; };
@@ -227,6 +257,11 @@ public final class ContentService extends IContentService.Stub {
packageFilter.addDataScheme("package"); packageFilter.addDataScheme("package");
mContext.registerReceiverAsUser(mCacheReceiver, UserHandle.ALL, mContext.registerReceiverAsUser(mCacheReceiver, UserHandle.ALL,
packageFilter, null, null); packageFilter, null, null);
final IntentFilter localeFilter = new IntentFilter();
localeFilter.addAction(Intent.ACTION_LOCALE_CHANGED);
mContext.registerReceiverAsUser(mCacheReceiver, UserHandle.ALL,
localeFilter, null, null);
} }
public void systemReady() { public void systemReady() {
@@ -1080,12 +1115,6 @@ public final class ContentService extends IContentService.Stub {
} }
} }
public static ContentService main(Context context, boolean factoryTest) {
ContentService service = new ContentService(context, factoryTest);
ServiceManager.addService(ContentResolver.CONTENT_SERVICE_NAME, service);
return service;
}
/** /**
* Checks if the request is from the system or an app that has INTERACT_ACROSS_USERS_FULL * Checks if the request is from the system or an app that has INTERACT_ACROSS_USERS_FULL
* permission, if the userHandle is not for the caller. * permission, if the userHandle is not for the caller.

View File

@@ -157,6 +157,8 @@ public final class SystemServer {
"com.google.android.clockwork.ThermalObserver"; "com.google.android.clockwork.ThermalObserver";
private static final String WEAR_BLUETOOTH_SERVICE_CLASS = private static final String WEAR_BLUETOOTH_SERVICE_CLASS =
"com.google.android.clockwork.bluetooth.WearBluetoothService"; "com.google.android.clockwork.bluetooth.WearBluetoothService";
private static final String CONTENT_SERVICE_CLASS =
"com.android.server.content.ContentService$Lifecycle";
private static final String PERSISTENT_DATA_BLOCK_PROP = "ro.frp.pst"; private static final String PERSISTENT_DATA_BLOCK_PROP = "ro.frp.pst";
@@ -574,8 +576,7 @@ public final class SystemServer {
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
traceBeginAndSlog("StartContentService"); traceBeginAndSlog("StartContentService");
contentService = ContentService.main(context, mSystemServiceManager.startService(CONTENT_SERVICE_CLASS);
mFactoryTestMode == FactoryTest.FACTORY_TEST_LOW_LEVEL);
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
traceBeginAndSlog("InstallSystemProviders"); traceBeginAndSlog("InstallSystemProviders");
@@ -1324,7 +1325,7 @@ public final class SystemServer {
reportWtf("starting System UI", e); reportWtf("starting System UI", e);
} }
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "MakeMountServiceReady"); Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "MakeNetworkScoreReady");
try { try {
if (networkScoreF != null) networkScoreF.systemReady(); if (networkScoreF != null) networkScoreF.systemReady();
} catch (Throwable e) { } catch (Throwable e) {