SessionParamsBuilder.java revision bbacaf0b6c74fc744c17af1b01192863ab8c9389
1bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez/*
2bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez * Copyright (C) 2017 The Android Open Source Project
3bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez *
4bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez * Licensed under the Apache License, Version 2.0 (the "License");
5bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez * you may not use this file except in compliance with the License.
6bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez * You may obtain a copy of the License at
7bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez *
8bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez *      http://www.apache.org/licenses/LICENSE-2.0
9bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez *
10bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez * Unless required by applicable law or agreed to in writing, software
11bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez * distributed under the License is distributed on an "AS IS" BASIS,
12bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez * See the License for the specific language governing permissions and
14bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez * limitations under the License.
15bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez */
16bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
17bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezpackage com.android.layoutlib.bridge.intensive.util;
18bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
19bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport com.android.SdkConstants;
20bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport com.android.ide.common.rendering.api.AssetRepository;
21bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport com.android.ide.common.rendering.api.LayoutLog;
22bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport com.android.ide.common.rendering.api.LayoutlibCallback;
23bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport com.android.ide.common.rendering.api.SessionParams;
24bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport com.android.ide.common.rendering.api.SessionParams.RenderingMode;
25bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport com.android.ide.common.resources.ResourceRepository;
26bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport com.android.ide.common.resources.ResourceResolver;
27bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport com.android.ide.common.resources.configuration.FolderConfiguration;
28bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport com.android.layoutlib.bridge.intensive.setup.ConfigGenerator;
29bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport com.android.layoutlib.bridge.intensive.setup.LayoutPullParser;
30bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
31bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport android.annotation.NonNull;
32bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
33bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport java.util.HashMap;
34bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport java.util.Map;
35bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
36bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez/**
37bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez * Builder to help setting up {@link SessionParams} objects.
38bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez */
39bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezpublic class SessionParamsBuilder {
40bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
41bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private LayoutPullParser mLayoutParser;
42bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private RenderingMode mRenderingMode = RenderingMode.NORMAL;
43bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private Object mProjectKey = null;
44bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private ConfigGenerator mConfigGenerator = ConfigGenerator.NEXUS_5;
45bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private ResourceRepository mFrameworkResources;
46bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private ResourceRepository mProjectResources;
47bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private String mThemeName;
48bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private boolean isProjectTheme;
49bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private LayoutlibCallback mLayoutlibCallback;
50bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private int mTargetSdk;
51bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private int mMinSdk = 0;
52bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private LayoutLog mLayoutLog;
53bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private Map<SessionParams.Key, Object> mFlags = new HashMap<>();
54bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private AssetRepository mAssetRepository = null;
55bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
56bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
57bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setParser(@NonNull LayoutPullParser layoutParser) {
58bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mLayoutParser = layoutParser;
59bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
60bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
61bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
62bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
63bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
64bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setRenderingMode(@NonNull RenderingMode renderingMode) {
65bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mRenderingMode = renderingMode;
66bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
67bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
68bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
69bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
70bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setConfigGenerator(@NonNull ConfigGenerator configGenerator) {
71bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mConfigGenerator = configGenerator;
72bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
73bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
74bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
75bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
76bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setProjectResources(@NonNull ResourceRepository resources) {
77bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mProjectResources = resources;
78bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
79bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
80bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
81bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
82bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setFrameworkResources(@NonNull ResourceRepository resources) {
83bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mFrameworkResources = resources;
84bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
85bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
86bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
87bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
88bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setTheme(@NonNull String themeName, boolean isProjectTheme) {
89bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mThemeName = themeName;
90bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        this.isProjectTheme = isProjectTheme;
91bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
92bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
93bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
94bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
95bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setTheme(@NonNull String themeName) {
96bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        boolean isProjectTheme;
97bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        if (themeName.startsWith(SdkConstants.PREFIX_ANDROID)) {
98bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez            themeName = themeName.substring(SdkConstants.PREFIX_ANDROID.length());
99bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez            isProjectTheme = false;
100bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        } else {
101bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez            isProjectTheme = true;
102bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        }
103bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return setTheme(themeName, isProjectTheme);
104bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
105bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
106bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
107bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setCallback(@NonNull LayoutlibCallback callback) {
108bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mLayoutlibCallback = callback;
109bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
110bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
111bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
112bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
113bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setTargetSdk(int targetSdk) {
114bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mTargetSdk = targetSdk;
115bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
116bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
117bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
118bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @SuppressWarnings("unused")
119bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
120bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setMinSdk(int minSdk) {
121bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mMinSdk = minSdk;
122bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
123bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
124bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
125bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
126bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setLayoutLog(@NonNull LayoutLog layoutLog) {
127bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mLayoutLog = layoutLog;
128bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
129bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
130bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
131bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
132bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setFlag(@NonNull SessionParams.Key flag, Object value) {
133bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mFlags.put(flag, value);
134bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
135bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
136bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
137bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
138bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setAssetRepository(@NonNull AssetRepository repository) {
139bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mAssetRepository = repository;
140bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
141bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
142bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
143bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
144bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParams build() {
145bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        assert mFrameworkResources != null;
146bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        assert mProjectResources != null;
147bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        assert mThemeName != null;
148bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        assert mLayoutLog != null;
149bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        assert mLayoutlibCallback != null;
150bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
151bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        FolderConfiguration config = mConfigGenerator.getFolderConfig();
152bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        ResourceResolver resourceResolver =
153bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez                ResourceResolver.create(mProjectResources.getConfiguredResources(config),
154bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez                        mFrameworkResources.getConfiguredResources(config), mThemeName,
155bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez                        isProjectTheme);
156bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
157bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        SessionParams params = new SessionParams(mLayoutParser, mRenderingMode, mProjectKey /* for
158bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        caching */, mConfigGenerator.getHardwareConfig(), resourceResolver, mLayoutlibCallback,
159bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez                mMinSdk, mTargetSdk, mLayoutLog);
160bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
161bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mFlags.forEach(params::setFlag);
162bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        params.setAssetRepository(mAssetRepository);
163bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
164bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return params;
165bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
166bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez}
167