1c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet/* 2c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * Copyright (C) 2010 The Android Open Source Project 3c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * 4c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * Licensed under the Apache License, Version 2.0 (the "License"); 5c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * you may not use this file except in compliance with the License. 6c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * You may obtain a copy of the License at 7c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * 8c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * http://www.apache.org/licenses/LICENSE-2.0 9c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * 10c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * Unless required by applicable law or agreed to in writing, software 11c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * distributed under the License is distributed on an "AS IS" BASIS, 12c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * See the License for the specific language governing permissions and 14c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * limitations under the License. 15c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet */ 16c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 17c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetpackage com.android.layoutlib.bridge; 18c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 1919a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohetimport com.android.ide.common.rendering.api.IAnimationListener; 2019a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohetimport com.android.ide.common.rendering.api.ILayoutPullParser; 21bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport com.android.ide.common.rendering.api.RenderParams; 2219a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohetimport com.android.ide.common.rendering.api.RenderSession; 2319a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohetimport com.android.ide.common.rendering.api.Result; 2419a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohetimport com.android.ide.common.rendering.api.ViewInfo; 2519a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohetimport com.android.layoutlib.bridge.impl.RenderSessionImpl; 26c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 27c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohetimport android.view.View; 28c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohetimport android.view.ViewGroup; 29c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 30c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport java.awt.image.BufferedImage; 317d7016e72431ad7ee595d857a19231c69efeb6deXavier Ducrohetimport java.util.List; 32cf52390eee4c9ae792ef63af1528b2e71b33a04fXavier Ducrohetimport java.util.Map; 33c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 34c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet/** 3519a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet * An implementation of {@link RenderSession}. 36c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * 37c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * This is a pretty basic class that does almost nothing. All of the work is done in 3819a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet * {@link RenderSessionImpl}. 39c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * 40c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet */ 4119a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohetpublic class BridgeRenderSession extends RenderSession { 42c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 4319a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet private final RenderSessionImpl mSession; 4419a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet private Result mLastResult; 45c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 46c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet @Override 4719a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet public Result getResult() { 48c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet return mLastResult; 49c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 50c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 51c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet @Override 52c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet public BufferedImage getImage() { 5319a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet return mSession.getImage(); 54c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 55c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 56c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet @Override 5716584225125acba18b74920b902c798dfead0328Xavier Ducrohet public boolean isAlphaChannelImage() { 5816584225125acba18b74920b902c798dfead0328Xavier Ducrohet return mSession.isAlphaChannelImage(); 5916584225125acba18b74920b902c798dfead0328Xavier Ducrohet } 6016584225125acba18b74920b902c798dfead0328Xavier Ducrohet 6116584225125acba18b74920b902c798dfead0328Xavier Ducrohet @Override 627d7016e72431ad7ee595d857a19231c69efeb6deXavier Ducrohet public List<ViewInfo> getRootViews() { 637d7016e72431ad7ee595d857a19231c69efeb6deXavier Ducrohet return mSession.getViewInfos(); 64c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 65c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 66c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet @Override 6719a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet public Map<String, String> getDefaultProperties(Object viewObject) { 6819a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet return mSession.getDefaultProperties(viewObject); 69cf52390eee4c9ae792ef63af1528b2e71b33a04fXavier Ducrohet } 70cf52390eee4c9ae792ef63af1528b2e71b33a04fXavier Ducrohet 71cf52390eee4c9ae792ef63af1528b2e71b33a04fXavier Ducrohet @Override 72162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet public Result getProperty(Object objectView, String propertyName) { 73162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet // TODO Auto-generated method stub 74162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet return super.getProperty(objectView, propertyName); 75162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet } 76162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet 77162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet @Override 78162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet public Result setProperty(Object objectView, String propertyName, String propertyValue) { 79162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet // TODO Auto-generated method stub 80162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet return super.setProperty(objectView, propertyName, propertyValue); 81162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet } 82162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet 83162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet @Override 8419a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet public Result render(long timeout) { 852eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet try { 869eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.prepareThread(); 8719a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mLastResult = mSession.acquire(timeout); 88c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet if (mLastResult.isSuccess()) { 895a82d8c58bf91c357c37a82b9f5e5c26f676d847Xavier Ducrohet mLastResult = mSession.render(false /*freshRender*/); 90c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 912eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet } finally { 9219a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mSession.release(); 939eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.cleanupThread(); 942eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet } 952eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet 962eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet return mLastResult; 972eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet } 982eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet 992eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet @Override 10019a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet public Result animate(Object targetObject, String animationName, 1012eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet boolean isFrameworkAnimation, IAnimationListener listener) { 1022eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet try { 1039eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.prepareThread(); 104bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet mLastResult = mSession.acquire(RenderParams.DEFAULT_TIMEOUT); 105c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet if (mLastResult.isSuccess()) { 10619a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mLastResult = mSession.animate(targetObject, animationName, isFrameworkAnimation, 1072eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet listener); 1082eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet } 1092eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet } finally { 11019a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mSession.release(); 1119eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.cleanupThread(); 112c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 113c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 114c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet return mLastResult; 115c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 116c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 117c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet @Override 11819a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet public Result insertChild(Object parentView, ILayoutPullParser childXml, int index, 119c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet IAnimationListener listener) { 120c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet if (parentView instanceof ViewGroup == false) { 121c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet throw new IllegalArgumentException("parentView is not a ViewGroup"); 122c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 123c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 124c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet try { 1259eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.prepareThread(); 126bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet mLastResult = mSession.acquire(RenderParams.DEFAULT_TIMEOUT); 127c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet if (mLastResult.isSuccess()) { 128d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet mLastResult = mSession.insertChild((ViewGroup) parentView, childXml, index, 129d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet listener); 130c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 131c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } finally { 13219a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mSession.release(); 1339eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.cleanupThread(); 134c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 135c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 136c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet return mLastResult; 137c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 138c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 139c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 140c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet @Override 14119a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet public Result moveChild(Object parentView, Object childView, int index, 1423c78f2de353df3e287444dd9f9fbab3bd4456217Xavier Ducrohet Map<String, String> layoutParams, IAnimationListener listener) { 143c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet if (parentView instanceof ViewGroup == false) { 144c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet throw new IllegalArgumentException("parentView is not a ViewGroup"); 145c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 146c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet if (childView instanceof View == false) { 147c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet throw new IllegalArgumentException("childView is not a View"); 148c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 149c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 150c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet try { 1519eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.prepareThread(); 152bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet mLastResult = mSession.acquire(RenderParams.DEFAULT_TIMEOUT); 153c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet if (mLastResult.isSuccess()) { 15419a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mLastResult = mSession.moveChild((ViewGroup) parentView, (View) childView, index, 15501811aa86279af1b341a4fff344d66c0ebdd63daXavier Ducrohet layoutParams, listener); 156c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 157c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } finally { 15819a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mSession.release(); 1599eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.cleanupThread(); 160c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 161c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 162c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet return mLastResult; 163c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 164c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 165c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet @Override 16619a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet public Result removeChild(Object childView, IAnimationListener listener) { 167c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet if (childView instanceof View == false) { 168c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet throw new IllegalArgumentException("childView is not a View"); 169c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 170c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 171c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet try { 1729eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.prepareThread(); 173bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet mLastResult = mSession.acquire(RenderParams.DEFAULT_TIMEOUT); 174c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet if (mLastResult.isSuccess()) { 17519a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mLastResult = mSession.removeChild((View) childView, listener); 176c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 177c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } finally { 17819a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mSession.release(); 1799eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.cleanupThread(); 180c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 181c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 182c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet return mLastResult; 183c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 184c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 185c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet @Override 186c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet public void dispose() { 187c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 188c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 18919a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet /*package*/ BridgeRenderSession(RenderSessionImpl scene, Result lastResult) { 19019a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mSession = scene; 191639e1bd35231a8f71e7acc95fedaf13ace9b65a9Xavier Ducrohet if (scene != null) { 192639e1bd35231a8f71e7acc95fedaf13ace9b65a9Xavier Ducrohet mSession.setScene(this); 193639e1bd35231a8f71e7acc95fedaf13ace9b65a9Xavier Ducrohet } 194c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet mLastResult = lastResult; 195c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 196c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet} 197