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;
230358a99f349e418142779f328a3136b1f5f1565eMichal Bendowskiimport com.android.ide.common.rendering.api.ResourceNamespace;
249fa0055f15bda4f5a8b37621c1bbbf9d3017b93cMichal Bendowskiimport com.android.ide.common.rendering.api.ResourceReference;
25bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport com.android.ide.common.rendering.api.SessionParams;
26bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport com.android.ide.common.rendering.api.SessionParams.RenderingMode;
27bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport com.android.ide.common.resources.ResourceResolver;
28bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport com.android.ide.common.resources.configuration.FolderConfiguration;
299fa0055f15bda4f5a8b37621c1bbbf9d3017b93cMichal Bendowskiimport com.android.ide.common.resources.deprecated.ResourceRepository;
30bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport com.android.layoutlib.bridge.intensive.setup.ConfigGenerator;
31bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport com.android.layoutlib.bridge.intensive.setup.LayoutPullParser;
329fa0055f15bda4f5a8b37621c1bbbf9d3017b93cMichal Bendowskiimport com.android.resources.ResourceType;
33bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
34bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport android.annotation.NonNull;
35bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
36bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport java.util.HashMap;
37bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezimport java.util.Map;
38bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
390358a99f349e418142779f328a3136b1f5f1565eMichal Bendowskiimport com.google.common.collect.ImmutableMap;
400358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski
41bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez/**
42bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez * Builder to help setting up {@link SessionParams} objects.
43bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez */
44bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perezpublic class SessionParamsBuilder {
45bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
46bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private LayoutPullParser mLayoutParser;
47bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private RenderingMode mRenderingMode = RenderingMode.NORMAL;
48bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private Object mProjectKey = null;
49bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private ConfigGenerator mConfigGenerator = ConfigGenerator.NEXUS_5;
50bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private ResourceRepository mFrameworkResources;
51bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private ResourceRepository mProjectResources;
52bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private String mThemeName;
53bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private boolean isProjectTheme;
54bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private LayoutlibCallback mLayoutlibCallback;
55bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private int mTargetSdk;
56bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private int mMinSdk = 0;
57bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private LayoutLog mLayoutLog;
58bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private Map<SessionParams.Key, Object> mFlags = new HashMap<>();
59bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    private AssetRepository mAssetRepository = null;
60bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
61bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
62bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setParser(@NonNull LayoutPullParser layoutParser) {
63bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mLayoutParser = layoutParser;
64bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
65bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
66bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
67bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
68bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
69bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setRenderingMode(@NonNull RenderingMode renderingMode) {
70bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mRenderingMode = renderingMode;
71bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
72bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
73bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
74bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
75bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setConfigGenerator(@NonNull ConfigGenerator configGenerator) {
76bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mConfigGenerator = configGenerator;
77bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
78bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
79bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
80bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
81bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setProjectResources(@NonNull ResourceRepository resources) {
82bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mProjectResources = resources;
83bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
84bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
85bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
86bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
87bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setFrameworkResources(@NonNull ResourceRepository resources) {
88bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mFrameworkResources = resources;
89bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
90bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
91bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
92bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
93bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setTheme(@NonNull String themeName, boolean isProjectTheme) {
94bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mThemeName = themeName;
95bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        this.isProjectTheme = isProjectTheme;
96bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
97bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
98bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
99bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
100bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setTheme(@NonNull String themeName) {
101bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        boolean isProjectTheme;
102bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        if (themeName.startsWith(SdkConstants.PREFIX_ANDROID)) {
103bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez            themeName = themeName.substring(SdkConstants.PREFIX_ANDROID.length());
104bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez            isProjectTheme = false;
105bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        } else {
106bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez            isProjectTheme = true;
107bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        }
108bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return setTheme(themeName, isProjectTheme);
109bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
110bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
111bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
112bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setCallback(@NonNull LayoutlibCallback callback) {
113bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mLayoutlibCallback = callback;
114bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
115bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
116bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
117bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
118bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setTargetSdk(int targetSdk) {
119bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mTargetSdk = targetSdk;
120bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
121bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
122bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
123bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @SuppressWarnings("unused")
124bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
125bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setMinSdk(int minSdk) {
126bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mMinSdk = minSdk;
127bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
128bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
129bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
130bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
131bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setLayoutLog(@NonNull LayoutLog layoutLog) {
132bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mLayoutLog = layoutLog;
133bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
134bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
135bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
136bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
137bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setFlag(@NonNull SessionParams.Key flag, Object value) {
138bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mFlags.put(flag, value);
139bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
140bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
141bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
142bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
143bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParamsBuilder setAssetRepository(@NonNull AssetRepository repository) {
144bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mAssetRepository = repository;
145bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return this;
146bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
147bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
148bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    @NonNull
149bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    public SessionParams build() {
150bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        assert mFrameworkResources != null;
151bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        assert mProjectResources != null;
152bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        assert mThemeName != null;
153bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        assert mLayoutLog != null;
154bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        assert mLayoutlibCallback != null;
155bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
156bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        FolderConfiguration config = mConfigGenerator.getFolderConfig();
1570358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski        ResourceResolver resourceResolver = ResourceResolver.create(
1580358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski                ImmutableMap.of(
1590358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski                        ResourceNamespace.ANDROID, mFrameworkResources.getConfiguredResources(config),
1600358a99f349e418142779f328a3136b1f5f1565eMichal Bendowski                        ResourceNamespace.TODO, mProjectResources.getConfiguredResources(config)),
1619fa0055f15bda4f5a8b37621c1bbbf9d3017b93cMichal Bendowski                new ResourceReference(
1629fa0055f15bda4f5a8b37621c1bbbf9d3017b93cMichal Bendowski                        ResourceNamespace.fromBoolean(!isProjectTheme),
1639fa0055f15bda4f5a8b37621c1bbbf9d3017b93cMichal Bendowski                        ResourceType.STYLE,
1649fa0055f15bda4f5a8b37621c1bbbf9d3017b93cMichal Bendowski                        mThemeName));
165bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
166bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        SessionParams params = new SessionParams(mLayoutParser, mRenderingMode, mProjectKey /* for
167bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        caching */, mConfigGenerator.getHardwareConfig(), resourceResolver, mLayoutlibCallback,
168bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez                mMinSdk, mTargetSdk, mLayoutLog);
169bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
170bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        mFlags.forEach(params::setFlag);
171bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        params.setAssetRepository(mAssetRepository);
172bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez
173bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez        return params;
174bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez    }
175bbacaf0b6c74fc744c17af1b01192863ab8c9389Diego Perez}
176