1 /*
2  * Copyright (C) 2017 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.layoutlib.bridge.intensive.util;
18 
19 import com.android.SdkConstants;
20 import com.android.ide.common.rendering.api.AssetRepository;
21 import com.android.ide.common.rendering.api.IImageFactory;
22 import com.android.ide.common.rendering.api.LayoutLog;
23 import com.android.ide.common.rendering.api.LayoutlibCallback;
24 import com.android.ide.common.rendering.api.ResourceNamespace;
25 import com.android.ide.common.rendering.api.ResourceReference;
26 import com.android.ide.common.rendering.api.SessionParams;
27 import com.android.ide.common.rendering.api.SessionParams.RenderingMode;
28 import com.android.ide.common.resources.ResourceResolver;
29 import com.android.ide.common.resources.configuration.FolderConfiguration;
30 import com.android.ide.common.resources.deprecated.ResourceRepository;
31 import com.android.layoutlib.bridge.intensive.setup.ConfigGenerator;
32 import com.android.layoutlib.bridge.intensive.setup.LayoutPullParser;
33 import com.android.resources.ResourceType;
34 
35 import android.annotation.NonNull;
36 
37 import java.util.HashMap;
38 import java.util.Map;
39 
40 import com.google.common.collect.ImmutableMap;
41 
42 /**
43  * Builder to help setting up {@link SessionParams} objects.
44  */
45 public class SessionParamsBuilder {
46 
47     private LayoutPullParser mLayoutParser;
48     private RenderingMode mRenderingMode = RenderingMode.NORMAL;
49     private Object mProjectKey = null;
50     private ConfigGenerator mConfigGenerator = ConfigGenerator.NEXUS_5;
51     private ResourceRepository mFrameworkResources;
52     private ResourceRepository mProjectResources;
53     private String mThemeName;
54     private boolean isProjectTheme;
55     private LayoutlibCallback mLayoutlibCallback;
56     private int mTargetSdk;
57     private int mMinSdk = 0;
58     private LayoutLog mLayoutLog;
59     private Map<SessionParams.Key, Object> mFlags = new HashMap<>();
60     private AssetRepository mAssetRepository = null;
61     private boolean mDecor = true;
62     private IImageFactory mImageFactory = null;
63 
64     @NonNull
setParser(@onNull LayoutPullParser layoutParser)65     public SessionParamsBuilder setParser(@NonNull LayoutPullParser layoutParser) {
66         mLayoutParser = layoutParser;
67 
68         return this;
69     }
70 
71     @NonNull
setRenderingMode(@onNull RenderingMode renderingMode)72     public SessionParamsBuilder setRenderingMode(@NonNull RenderingMode renderingMode) {
73         mRenderingMode = renderingMode;
74         return this;
75     }
76 
77     @NonNull
setConfigGenerator(@onNull ConfigGenerator configGenerator)78     public SessionParamsBuilder setConfigGenerator(@NonNull ConfigGenerator configGenerator) {
79         mConfigGenerator = configGenerator;
80         return this;
81     }
82 
83     @NonNull
setProjectResources(@onNull ResourceRepository resources)84     public SessionParamsBuilder setProjectResources(@NonNull ResourceRepository resources) {
85         mProjectResources = resources;
86         return this;
87     }
88 
89     @NonNull
setFrameworkResources(@onNull ResourceRepository resources)90     public SessionParamsBuilder setFrameworkResources(@NonNull ResourceRepository resources) {
91         mFrameworkResources = resources;
92         return this;
93     }
94 
95     @NonNull
setTheme(@onNull String themeName, boolean isProjectTheme)96     public SessionParamsBuilder setTheme(@NonNull String themeName, boolean isProjectTheme) {
97         mThemeName = themeName;
98         this.isProjectTheme = isProjectTheme;
99         return this;
100     }
101 
102     @NonNull
setTheme(@onNull String themeName)103     public SessionParamsBuilder setTheme(@NonNull String themeName) {
104         boolean isProjectTheme;
105         if (themeName.startsWith(SdkConstants.PREFIX_ANDROID)) {
106             themeName = themeName.substring(SdkConstants.PREFIX_ANDROID.length());
107             isProjectTheme = false;
108         } else {
109             isProjectTheme = true;
110         }
111         return setTheme(themeName, isProjectTheme);
112     }
113 
114     @NonNull
setCallback(@onNull LayoutlibCallback callback)115     public SessionParamsBuilder setCallback(@NonNull LayoutlibCallback callback) {
116         mLayoutlibCallback = callback;
117         return this;
118     }
119 
120     @NonNull
setTargetSdk(int targetSdk)121     public SessionParamsBuilder setTargetSdk(int targetSdk) {
122         mTargetSdk = targetSdk;
123         return this;
124     }
125 
126     @SuppressWarnings("unused")
127     @NonNull
setMinSdk(int minSdk)128     public SessionParamsBuilder setMinSdk(int minSdk) {
129         mMinSdk = minSdk;
130         return this;
131     }
132 
133     @NonNull
setLayoutLog(@onNull LayoutLog layoutLog)134     public SessionParamsBuilder setLayoutLog(@NonNull LayoutLog layoutLog) {
135         mLayoutLog = layoutLog;
136         return this;
137     }
138 
139     @NonNull
setFlag(@onNull SessionParams.Key flag, Object value)140     public SessionParamsBuilder setFlag(@NonNull SessionParams.Key flag, Object value) {
141         mFlags.put(flag, value);
142         return this;
143     }
144 
145     @NonNull
setAssetRepository(@onNull AssetRepository repository)146     public SessionParamsBuilder setAssetRepository(@NonNull AssetRepository repository) {
147         mAssetRepository = repository;
148         return this;
149     }
150 
151     @NonNull
disableDecoration()152     public SessionParamsBuilder disableDecoration() {
153         mDecor = false;
154         return this;
155     }
156 
157     @NonNull
setImageFactory(@onNull IImageFactory imageFactory)158     public SessionParamsBuilder setImageFactory(@NonNull IImageFactory imageFactory) {
159         mImageFactory = imageFactory;
160         return this;
161     }
162 
163     @NonNull
build()164     public SessionParams build() {
165         assert mFrameworkResources != null;
166         assert mProjectResources != null;
167         assert mThemeName != null;
168         assert mLayoutLog != null;
169         assert mLayoutlibCallback != null;
170 
171         FolderConfiguration config = mConfigGenerator.getFolderConfig();
172         ResourceResolver resourceResolver = ResourceResolver.create(
173                 ImmutableMap.of(
174                         ResourceNamespace.ANDROID, mFrameworkResources.getConfiguredResources(config),
175                         ResourceNamespace.TODO(), mProjectResources.getConfiguredResources(config)),
176                 new ResourceReference(
177                         ResourceNamespace.fromBoolean(!isProjectTheme),
178                         ResourceType.STYLE,
179                         mThemeName));
180 
181         SessionParams params = new SessionParams(mLayoutParser, mRenderingMode, mProjectKey /* for
182         caching */, mConfigGenerator.getHardwareConfig(), resourceResolver, mLayoutlibCallback,
183                 mMinSdk, mTargetSdk, mLayoutLog);
184         if (mImageFactory != null) {
185             params.setImageFactory(mImageFactory);
186         }
187 
188         mFlags.forEach(params::setFlag);
189         params.setAssetRepository(mAssetRepository);
190 
191         if (!mDecor) {
192             params.setForceNoDecor();
193         }
194 
195         return params;
196     }
197 }
198