When loading roots for the first time, we're okay using any cached data from the system, but if the locale changes we need to force-refresh everything. Now that we're always using the system cache, we have a nice strong signal for "empty" versus "not cached" results, so we don't need to wait around for the first loading pass to finish. Add logic to invalidate system cache when locale changes, and fix locking bug. Bug: 27977906 Change-Id: Ic50083eff360bea887799583f6c9f02c129eec91
113 lines
4.0 KiB
Java
113 lines
4.0 KiB
Java
/*
|
|
* Copyright (C) 2013 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.android.documentsui;
|
|
|
|
import android.app.ActivityManager;
|
|
import android.app.Application;
|
|
import android.content.BroadcastReceiver;
|
|
import android.content.ContentProviderClient;
|
|
import android.content.ContentResolver;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.content.IntentFilter;
|
|
import android.graphics.Point;
|
|
import android.net.Uri;
|
|
import android.os.RemoteException;
|
|
import android.text.format.DateUtils;
|
|
|
|
public class DocumentsApplication extends Application {
|
|
private static final long PROVIDER_ANR_TIMEOUT = 20 * DateUtils.SECOND_IN_MILLIS;
|
|
|
|
private RootsCache mRoots;
|
|
private Point mThumbnailsSize;
|
|
private ThumbnailCache mThumbnails;
|
|
|
|
public static RootsCache getRootsCache(Context context) {
|
|
return ((DocumentsApplication) context.getApplicationContext()).mRoots;
|
|
}
|
|
|
|
public static ThumbnailCache getThumbnailsCache(Context context, Point size) {
|
|
final DocumentsApplication app = (DocumentsApplication) context.getApplicationContext();
|
|
final ThumbnailCache thumbnails = app.mThumbnails;
|
|
if (!size.equals(app.mThumbnailsSize)) {
|
|
thumbnails.evictAll();
|
|
app.mThumbnailsSize = size;
|
|
}
|
|
return thumbnails;
|
|
}
|
|
|
|
public static ContentProviderClient acquireUnstableProviderOrThrow(
|
|
ContentResolver resolver, String authority) throws RemoteException {
|
|
final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
|
|
authority);
|
|
if (client == null) {
|
|
throw new RemoteException("Failed to acquire provider for " + authority);
|
|
}
|
|
client.setDetectNotResponding(PROVIDER_ANR_TIMEOUT);
|
|
return client;
|
|
}
|
|
|
|
@Override
|
|
public void onCreate() {
|
|
super.onCreate();
|
|
|
|
final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
|
|
final int memoryClassBytes = am.getMemoryClass() * 1024 * 1024;
|
|
|
|
mRoots = new RootsCache(this);
|
|
mRoots.updateAsync(false);
|
|
|
|
mThumbnails = new ThumbnailCache(memoryClassBytes / 4);
|
|
|
|
final IntentFilter packageFilter = new IntentFilter();
|
|
packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
|
|
packageFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
|
|
packageFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
|
|
packageFilter.addAction(Intent.ACTION_PACKAGE_DATA_CLEARED);
|
|
packageFilter.addDataScheme("package");
|
|
registerReceiver(mCacheReceiver, packageFilter);
|
|
|
|
final IntentFilter localeFilter = new IntentFilter();
|
|
localeFilter.addAction(Intent.ACTION_LOCALE_CHANGED);
|
|
registerReceiver(mCacheReceiver, localeFilter);
|
|
}
|
|
|
|
@Override
|
|
public void onTrimMemory(int level) {
|
|
super.onTrimMemory(level);
|
|
|
|
if (level >= TRIM_MEMORY_MODERATE) {
|
|
mThumbnails.evictAll();
|
|
} else if (level >= TRIM_MEMORY_BACKGROUND) {
|
|
mThumbnails.trimToSize(mThumbnails.size() / 2);
|
|
}
|
|
}
|
|
|
|
private BroadcastReceiver mCacheReceiver = new BroadcastReceiver() {
|
|
@Override
|
|
public void onReceive(Context context, Intent intent) {
|
|
final Uri data = intent.getData();
|
|
if (data != null) {
|
|
final String packageName = data.getSchemeSpecificPart();
|
|
mRoots.updatePackageAsync(packageName);
|
|
} else {
|
|
mRoots.updateAsync(true);
|
|
}
|
|
}
|
|
};
|
|
}
|