1 /*
2  * Copyright (C) 2013 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.documentsui;
18 
19 import android.app.ActivityManager;
20 import android.app.Application;
21 import android.content.BroadcastReceiver;
22 import android.content.ContentProviderClient;
23 import android.content.ContentResolver;
24 import android.content.Context;
25 import android.content.Intent;
26 import android.content.IntentFilter;
27 import android.net.Uri;
28 import android.os.RemoteException;
29 import android.text.format.DateUtils;
30 
31 import com.android.documentsui.clipping.ClipStorage;
32 import com.android.documentsui.clipping.ClipStore;
33 import com.android.documentsui.clipping.DocumentClipper;
34 import com.android.documentsui.roots.ProvidersCache;
35 
36 public class DocumentsApplication extends Application {
37     private static final long PROVIDER_ANR_TIMEOUT = 20 * DateUtils.SECOND_IN_MILLIS;
38 
39     private ProvidersCache mProviders;
40     private ThumbnailCache mThumbnailCache;
41     private ClipStorage mClipStore;
42     private DocumentClipper mClipper;
43 
getProvidersCache(Context context)44     public static ProvidersCache getProvidersCache(Context context) {
45         return ((DocumentsApplication) context.getApplicationContext()).mProviders;
46     }
47 
getThumbnailCache(Context context)48     public static ThumbnailCache getThumbnailCache(Context context) {
49         final DocumentsApplication app = (DocumentsApplication) context.getApplicationContext();
50         return app.mThumbnailCache;
51     }
52 
acquireUnstableProviderOrThrow( ContentResolver resolver, String authority)53     public static ContentProviderClient acquireUnstableProviderOrThrow(
54             ContentResolver resolver, String authority) throws RemoteException {
55         final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
56                 authority);
57         if (client == null) {
58             throw new RemoteException("Failed to acquire provider for " + authority);
59         }
60         client.setDetectNotResponding(PROVIDER_ANR_TIMEOUT);
61         return client;
62     }
63 
getDocumentClipper(Context context)64     public static DocumentClipper getDocumentClipper(Context context) {
65         return ((DocumentsApplication) context.getApplicationContext()).mClipper;
66     }
67 
getClipStore(Context context)68     public static ClipStore getClipStore(Context context) {
69         return ((DocumentsApplication) context.getApplicationContext()).mClipStore;
70     }
71 
72     @Override
onCreate()73     public void onCreate() {
74         super.onCreate();
75 
76         final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
77         final int memoryClassBytes = am.getMemoryClass() * 1024 * 1024;
78 
79         mProviders = new ProvidersCache(this);
80         mProviders.updateAsync(false);
81 
82         mThumbnailCache = new ThumbnailCache(memoryClassBytes / 4);
83 
84         mClipStore = new ClipStorage(
85                 ClipStorage.prepareStorage(getCacheDir()),
86                 getSharedPreferences(ClipStorage.PREF_NAME, 0));
87         mClipper = DocumentClipper.create(this, mClipStore);
88 
89         final IntentFilter packageFilter = new IntentFilter();
90         packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
91         packageFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
92         packageFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
93         packageFilter.addAction(Intent.ACTION_PACKAGE_DATA_CLEARED);
94         packageFilter.addDataScheme("package");
95         registerReceiver(mCacheReceiver, packageFilter);
96 
97         final IntentFilter localeFilter = new IntentFilter();
98         localeFilter.addAction(Intent.ACTION_LOCALE_CHANGED);
99         registerReceiver(mCacheReceiver, localeFilter);
100     }
101 
102     @Override
onTrimMemory(int level)103     public void onTrimMemory(int level) {
104         super.onTrimMemory(level);
105 
106         mThumbnailCache.onTrimMemory(level);
107     }
108 
109     private BroadcastReceiver mCacheReceiver = new BroadcastReceiver() {
110         @Override
111         public void onReceive(Context context, Intent intent) {
112             final Uri data = intent.getData();
113             if (data != null) {
114                 final String packageName = data.getSchemeSpecificPart();
115                 mProviders.updatePackageAsync(packageName);
116             } else {
117                 mProviders.updateAsync(true);
118             }
119         }
120     };
121 }
122