1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/* 2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Copyright (C) 2010 The Android Open Source Project 3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * you may not use this file except in compliance with the License. 6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * You may obtain a copy of the License at 7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Unless required by applicable law or agreed to in writing, software 11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * See the License for the specific language governing permissions and 14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * limitations under the License. 15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipackage com.android.layoutlib.bridge; 18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.IAnimationListener; 20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.ILayoutPullParser; 21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.RenderParams; 22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.RenderSession; 23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.Result; 24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.ViewInfo; 25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.impl.RenderSessionImpl; 26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.View; 28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.ViewGroup; 29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.awt.image.BufferedImage; 31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.List; 32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.Map; 33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/** 35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * An implementation of {@link RenderSession}. 36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * This is a pretty basic class that does almost nothing. All of the work is done in 38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * {@link RenderSessionImpl}. 39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic class BridgeRenderSession extends RenderSession { 42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private final RenderSessionImpl mSession; 44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private Result mLastResult; 45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public Result getResult() { 48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return mLastResult; 49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public BufferedImage getImage() { 53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return mSession.getImage(); 54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public boolean isAlphaChannelImage() { 58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return mSession.isAlphaChannelImage(); 59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public List<ViewInfo> getRootViews() { 63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return mSession.getViewInfos(); 64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 6714bf0cef7eeed572a67c29a328581afac4decc20Deepanshu Gupta public List<ViewInfo> getSystemRootViews() { 6814bf0cef7eeed572a67c29a328581afac4decc20Deepanshu Gupta return mSession.getSystemViewInfos(); 6914bf0cef7eeed572a67c29a328581afac4decc20Deepanshu Gupta } 7014bf0cef7eeed572a67c29a328581afac4decc20Deepanshu Gupta 7114bf0cef7eeed572a67c29a328581afac4decc20Deepanshu Gupta @Override 72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public Map<String, String> getDefaultProperties(Object viewObject) { 73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return mSession.getDefaultProperties(viewObject); 74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public Result getProperty(Object objectView, String propertyName) { 78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // pass 79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return super.getProperty(objectView, propertyName); 80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public Result setProperty(Object objectView, String propertyName, String propertyValue) { 84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // pass 85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return super.setProperty(objectView, propertyName, propertyValue); 86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public Result render(long timeout) { 90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski try { 91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Bridge.prepareThread(); 92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mLastResult = mSession.acquire(timeout); 93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (mLastResult.isSuccess()) { 94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mLastResult = mSession.render(false /*freshRender*/); 95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } finally { 97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mSession.release(); 98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Bridge.cleanupThread(); 99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return mLastResult; 102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public Result animate(Object targetObject, String animationName, 106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski boolean isFrameworkAnimation, IAnimationListener listener) { 107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski try { 108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Bridge.prepareThread(); 109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mLastResult = mSession.acquire(RenderParams.DEFAULT_TIMEOUT); 110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (mLastResult.isSuccess()) { 111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mLastResult = mSession.animate(targetObject, animationName, isFrameworkAnimation, 112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski listener); 113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } finally { 115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mSession.release(); 116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Bridge.cleanupThread(); 117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return mLastResult; 120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public Result insertChild(Object parentView, ILayoutPullParser childXml, int index, 124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski IAnimationListener listener) { 125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (parentView instanceof ViewGroup == false) { 126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throw new IllegalArgumentException("parentView is not a ViewGroup"); 127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski try { 130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Bridge.prepareThread(); 131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mLastResult = mSession.acquire(RenderParams.DEFAULT_TIMEOUT); 132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (mLastResult.isSuccess()) { 133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mLastResult = mSession.insertChild((ViewGroup) parentView, childXml, index, 134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski listener); 135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } finally { 137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mSession.release(); 138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Bridge.cleanupThread(); 139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return mLastResult; 142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public Result moveChild(Object parentView, Object childView, int index, 147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Map<String, String> layoutParams, IAnimationListener listener) { 148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (parentView instanceof ViewGroup == false) { 149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throw new IllegalArgumentException("parentView is not a ViewGroup"); 150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (childView instanceof View == false) { 152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throw new IllegalArgumentException("childView is not a View"); 153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski try { 156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Bridge.prepareThread(); 157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mLastResult = mSession.acquire(RenderParams.DEFAULT_TIMEOUT); 158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (mLastResult.isSuccess()) { 159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mLastResult = mSession.moveChild((ViewGroup) parentView, (View) childView, index, 160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski layoutParams, listener); 161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } finally { 163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mSession.release(); 164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Bridge.cleanupThread(); 165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return mLastResult; 168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public Result removeChild(Object childView, IAnimationListener listener) { 172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (childView instanceof View == false) { 173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski throw new IllegalArgumentException("childView is not a View"); 174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski try { 177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Bridge.prepareThread(); 178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mLastResult = mSession.acquire(RenderParams.DEFAULT_TIMEOUT); 179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (mLastResult.isSuccess()) { 180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mLastResult = mSession.removeChild((View) childView, listener); 181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } finally { 183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mSession.release(); 184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Bridge.cleanupThread(); 185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return mLastResult; 188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 190282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 191282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public void dispose() { 192282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 193282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /*package*/ BridgeRenderSession(RenderSessionImpl scene, Result lastResult) { 195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mSession = scene; 196282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (scene != null) { 197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mSession.setScene(this); 198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mLastResult = lastResult; 200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 201282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} 202