Data cleared usually means accounts went away, so kick off roots refresh. Also update any visible UI after a refresh finishes. Bug: 10899793 Change-Id: Id68c80b5e635e358cfd75f4961ce13cd1c7c5f82
111 lines
4.0 KiB
Java
111 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() {
|
|
final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
|
|
final int memoryClassBytes = am.getMemoryClass() * 1024 * 1024;
|
|
|
|
mRoots = new RootsCache(this);
|
|
mRoots.updateAsync();
|
|
|
|
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();
|
|
}
|
|
}
|
|
};
|
|
}
|