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