Move all RootInfo queries to background threads to avoid janking the UI. Update passes happen on spawed task, which swaps out updated cache results when finished. Support partial updates when only a single package/authority has changed. Watch for change notifications for roots, since flags can change over time. Ignore stopped packages when in background, but query them for roots when launching any picker UI. Optimize management launches by treating as one-shot requests that don't need to wait for all RootInfo. Bug: 10600454, 10745490 Change-Id: Ibc7b15688ef6b41bd7e9dd0d7564b501e60e49a9
93 lines
3.2 KiB
Java
93 lines
3.2 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.Context;
|
|
import android.content.Intent;
|
|
import android.content.IntentFilter;
|
|
import android.graphics.Point;
|
|
import android.net.Uri;
|
|
|
|
public class DocumentsApplication extends Application {
|
|
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;
|
|
}
|
|
|
|
@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.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();
|
|
}
|
|
}
|
|
};
|
|
}
|