1 /*
2  * Copyright (C) 2008 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 package android.content.res;
17 
18 import android.annotation.NonNull;
19 import android.annotation.Nullable;
20 import com.android.ide.common.rendering.api.AssetRepository;
21 import com.android.layoutlib.bridge.Bridge;
22 
23 import java.io.IOException;
24 import java.io.InputStream;
25 
26 public class BridgeAssetManager extends AssetManager {
27     @Nullable private AssetRepository mAssetRepository;
28 
29     /**
30      * This initializes the static field {@link AssetManager#sSystem} which is used
31      * by methods who get a global asset manager using {@link AssetManager#getSystem()}.
32      * <p/>
33      * They will end up using our bridge asset manager.
34      * <p/>
35      * {@link Bridge} calls this method after setting up a new bridge.
36      */
initSystem()37     public static AssetManager initSystem() {
38         if (!(AssetManager.sSystem instanceof BridgeAssetManager)) {
39             // Note that AssetManager() creates a system AssetManager and we override it
40             // with our BridgeAssetManager.
41             AssetManager.sSystem = new BridgeAssetManager();
42         }
43         return AssetManager.sSystem;
44     }
45 
46     /**
47      * Clears the static {@link AssetManager#sSystem} to make sure we don't leave objects
48      * around that would prevent us from unloading the library.
49      */
clearSystem()50     public static void clearSystem() {
51         AssetManager.sSystem = null;
52     }
53 
setAssetRepository(@onNull AssetRepository assetRepository)54     public void setAssetRepository(@NonNull AssetRepository assetRepository) {
55         mAssetRepository = assetRepository;
56     }
57 
58     /**
59      * Clears the AssetRepository reference.
60      */
releaseAssetRepository()61     public void releaseAssetRepository() {
62         mAssetRepository = null;
63     }
64 
65     @NonNull
getAssetRepository()66     public AssetRepository getAssetRepository() {
67         if (mAssetRepository == null) {
68             throw new IllegalStateException("Asset repository is not set");
69         }
70         return mAssetRepository;
71     }
72 
73     @Override
open(String fileName, int accessMode)74     public InputStream open(String fileName, int accessMode) throws IOException {
75         return getAssetRepository().openAsset(fileName, accessMode);
76     }
77 
78     @Override
openNonAsset(int cookie, String fileName, int accessMode)79     public InputStream openNonAsset(int cookie, String fileName, int accessMode)
80             throws IOException {
81         return getAssetRepository().openNonAsset(cookie, fileName, accessMode);
82     }
83 
BridgeAssetManager()84     public BridgeAssetManager() {
85     }
86 }
87