1 /*
2  * Copyright (C) 2020 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.example.loaders;
18 
19 import android.app.Application;
20 import android.content.res.Resources;
21 import android.content.res.loader.ResourcesLoader;
22 import android.content.res.loader.ResourcesProvider;
23 import android.os.ParcelFileDescriptor;
24 import android.util.Log;
25 
26 import java.io.File;
27 import java.io.FileOutputStream;
28 import java.io.IOException;
29 import java.io.InputStream;
30 
31 public class LoadersApplication extends Application {
32     private static final String TAG = "LoadersApplication";
33     private static final String LOADER_RESOURCES_APK = "AppResourcesLoaders_Overlay.apk";
34 
35     @Override
onCreate()36     public void onCreate() {
37         try {
38             final Resources resources = getResources();
39             final ResourcesLoader loader = new ResourcesLoader();
40             loader.addProvider(ResourcesProvider.loadFromApk(copyResource(LOADER_RESOURCES_APK)));
41             resources.addLoaders(loader);
42         } catch (IOException e) {
43             throw new IllegalStateException("Failed to load loader resources ", e);
44         }
45     }
46 
copyResource(String fileName)47     private ParcelFileDescriptor copyResource(String fileName) throws IOException {
48         final File apkFile = new File(getFilesDir(), fileName);
49         final InputStream is = getClassLoader().getResourceAsStream(LOADER_RESOURCES_APK);
50         final FileOutputStream os = new FileOutputStream(apkFile);
51         byte[] buffer = new byte[8192];
52         int count;
53         while ((count = is.read(buffer)) != -1) {
54             os.write(buffer, 0, count);
55         }
56         return ParcelFileDescriptor.open(apkFile, ParcelFileDescriptor.MODE_READ_ONLY);
57     }
58 }
59