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