BridgeRenderSession.java revision 01811aa86279af1b341a4fff344d66c0ebdd63da
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 19c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohetimport com.android.layoutlib.api.IXmlPullParser; 20c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.api.LayoutScene; 212eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohetimport com.android.layoutlib.api.SceneParams; 22c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.api.SceneResult; 23c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.api.ViewInfo; 24c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.bridge.impl.LayoutSceneImpl; 25c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 26c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohetimport android.view.View; 27c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohetimport android.view.ViewGroup; 28c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 29c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport java.awt.image.BufferedImage; 30cf52390eee4c9ae792ef63af1528b2e71b33a04fXavier Ducrohetimport java.util.Map; 31c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 32c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet/** 33c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * An implementation of {@link LayoutScene}. 34c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * 35c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * This is a pretty basic class that does almost nothing. All of the work is done in 36c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * {@link LayoutSceneImpl}. 37c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * 38c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet */ 39c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetpublic class BridgeLayoutScene extends LayoutScene { 40c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 41c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet private final LayoutSceneImpl mScene; 42c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet private SceneResult mLastResult; 43c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 44c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet @Override 45c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet public SceneResult getResult() { 46c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet return mLastResult; 47c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 48c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 49c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet @Override 50c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet public BufferedImage getImage() { 51c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet return mScene.getImage(); 52c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 53c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 54c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet @Override 55c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet public ViewInfo getRootView() { 56c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet return mScene.getViewInfo(); 57c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 58c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 59c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet @Override 60cf52390eee4c9ae792ef63af1528b2e71b33a04fXavier Ducrohet public Map<String, String> getDefaultViewPropertyValues(Object viewObject) { 61cf52390eee4c9ae792ef63af1528b2e71b33a04fXavier Ducrohet return mScene.getDefaultViewPropertyValues(viewObject); 62cf52390eee4c9ae792ef63af1528b2e71b33a04fXavier Ducrohet } 63cf52390eee4c9ae792ef63af1528b2e71b33a04fXavier Ducrohet 64cf52390eee4c9ae792ef63af1528b2e71b33a04fXavier Ducrohet @Override 652eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet public SceneResult render(long timeout) { 662eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet try { 679eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.prepareThread(); 682eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet mLastResult = mScene.acquire(timeout); 69c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet if (mLastResult.isSuccess()) { 70c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet mLastResult = mScene.render(); 71c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 722eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet } finally { 732eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet mScene.release(); 749eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.cleanupThread(); 752eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet } 762eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet 772eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet return mLastResult; 782eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet } 792eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet 802eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet @Override 812eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet public SceneResult animate(Object targetObject, String animationName, 822eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet boolean isFrameworkAnimation, IAnimationListener listener) { 832eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet try { 849eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.prepareThread(); 852eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet mLastResult = mScene.acquire(SceneParams.DEFAULT_TIMEOUT); 86c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet if (mLastResult.isSuccess()) { 872eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet mLastResult = mScene.animate(targetObject, animationName, isFrameworkAnimation, 882eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet listener); 892eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet } 902eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet } finally { 912eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet mScene.release(); 929eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.cleanupThread(); 93c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 94c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 95c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet return mLastResult; 96c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 97c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 98c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet @Override 99c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet public SceneResult insertChild(Object parentView, IXmlPullParser childXml, int index, 100c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet IAnimationListener listener) { 101c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet if (parentView instanceof ViewGroup == false) { 102c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet throw new IllegalArgumentException("parentView is not a ViewGroup"); 103c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 104c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 105c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet try { 1069eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.prepareThread(); 107c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet mLastResult = mScene.acquire(SceneParams.DEFAULT_TIMEOUT); 108c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet if (mLastResult.isSuccess()) { 109c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet mLastResult = mScene.insertChild((ViewGroup) parentView, childXml, index, listener); 110c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 111c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } finally { 112c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet mScene.release(); 1139eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.cleanupThread(); 114c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 115c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 116c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet return mLastResult; 117c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 118c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 119c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 120c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet @Override 121c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet public SceneResult moveChild(Object parentView, Object childView, int index, 1223c78f2de353df3e287444dd9f9fbab3bd4456217Xavier Ducrohet Map<String, String> layoutParams, IAnimationListener listener) { 123c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet if (parentView instanceof ViewGroup == false) { 124c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet throw new IllegalArgumentException("parentView is not a ViewGroup"); 125c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 126c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet if (childView instanceof View == false) { 127c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet throw new IllegalArgumentException("childView is not a View"); 128c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 129c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 130c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet try { 1319eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.prepareThread(); 132c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet mLastResult = mScene.acquire(SceneParams.DEFAULT_TIMEOUT); 133c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet if (mLastResult.isSuccess()) { 134c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet mLastResult = mScene.moveChild((ViewGroup) parentView, (View) childView, index, 13501811aa86279af1b341a4fff344d66c0ebdd63daXavier Ducrohet layoutParams, listener); 136c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 137c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } finally { 138c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet mScene.release(); 1399eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.cleanupThread(); 140c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 141c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 142c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet return mLastResult; 143c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 144c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 145c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet @Override 146c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet public SceneResult removeChild(Object childView, IAnimationListener listener) { 147c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet if (childView instanceof View == false) { 148c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet throw new IllegalArgumentException("childView is not a View"); 149c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 150c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 151c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet try { 1529eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.prepareThread(); 153c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet mLastResult = mScene.acquire(SceneParams.DEFAULT_TIMEOUT); 154c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet if (mLastResult.isSuccess()) { 155c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet mLastResult = mScene.removeChild((View) childView, listener); 156c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 157c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } finally { 158c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet mScene.release(); 1599eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.cleanupThread(); 160c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 161c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 162c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet return mLastResult; 163c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 164c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 165c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet @Override 166c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet public void dispose() { 167c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 168c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 1692eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet /*package*/ BridgeLayoutScene(LayoutSceneImpl scene, SceneResult lastResult) { 170c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet mScene = scene; 171c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet mScene.setScene(this); 172c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet mLastResult = lastResult; 173c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 174c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet} 175