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:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user