BridgeRenderSession.java revision d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5
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; 2119a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohetimport com.android.ide.common.rendering.api.Params; 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; 31cf52390eee4c9ae792ef63af1528b2e71b33a04fXavier Ducrohetimport java.util.Map; 32c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 33c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet/** 3419a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet * An implementation of {@link RenderSession}. 35c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * 36c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * This is a pretty basic class that does almost nothing. All of the work is done in 3719a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet * {@link RenderSessionImpl}. 38c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * 39c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet */ 4019a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohetpublic class BridgeRenderSession extends RenderSession { 41c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 4219a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet private final RenderSessionImpl mSession; 4319a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet private Result mLastResult; 44c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 45c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet @Override 4619a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet public Result getResult() { 47c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet return mLastResult; 48c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 49c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 50c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet @Override 51c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet public BufferedImage getImage() { 5219a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet return mSession.getImage(); 53c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 54c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 55c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet @Override 56c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet public ViewInfo getRootView() { 5719a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet return mSession.getViewInfo(); 58c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 59c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 60c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet @Override 6119a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet public Map<String, String> getDefaultProperties(Object viewObject) { 6219a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet return mSession.getDefaultProperties(viewObject); 63cf52390eee4c9ae792ef63af1528b2e71b33a04fXavier Ducrohet } 64cf52390eee4c9ae792ef63af1528b2e71b33a04fXavier Ducrohet 65cf52390eee4c9ae792ef63af1528b2e71b33a04fXavier Ducrohet @Override 6619a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet public Result render(long timeout) { 672eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet try { 689eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.prepareThread(); 6919a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mLastResult = mSession.acquire(timeout); 70c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet if (mLastResult.isSuccess()) { 7119a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mLastResult = mSession.render(); 72c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 732eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet } finally { 7419a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mSession.release(); 759eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.cleanupThread(); 762eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet } 772eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet 782eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet return mLastResult; 792eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet } 802eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet 812eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet @Override 8219a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet public Result animate(Object targetObject, String animationName, 832eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet boolean isFrameworkAnimation, IAnimationListener listener) { 842eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet try { 859eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.prepareThread(); 8619a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mLastResult = mSession.acquire(Params.DEFAULT_TIMEOUT); 87c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet if (mLastResult.isSuccess()) { 8819a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mLastResult = mSession.animate(targetObject, animationName, isFrameworkAnimation, 892eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet listener); 902eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet } 912eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet } finally { 9219a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mSession.release(); 939eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.cleanupThread(); 94c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 95c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 96c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet return mLastResult; 97c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 98c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 99c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet @Override 10019a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet public Result insertChild(Object parentView, ILayoutPullParser childXml, int index, 101c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet IAnimationListener listener) { 102c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet if (parentView instanceof ViewGroup == false) { 103c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet throw new IllegalArgumentException("parentView is not a ViewGroup"); 104c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 105c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 106c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet try { 1079eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.prepareThread(); 10819a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mLastResult = mSession.acquire(Params.DEFAULT_TIMEOUT); 109c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet if (mLastResult.isSuccess()) { 110d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet mLastResult = mSession.insertChild((ViewGroup) parentView, childXml, index, 111d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet listener); 112c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 113c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } finally { 11419a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mSession.release(); 1159eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.cleanupThread(); 116c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 117c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 118c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet return mLastResult; 119c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 120c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 121c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 122c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet @Override 12319a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet public Result moveChild(Object parentView, Object childView, int index, 1243c78f2de353df3e287444dd9f9fbab3bd4456217Xavier Ducrohet Map<String, String> layoutParams, IAnimationListener listener) { 125c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet if (parentView instanceof ViewGroup == false) { 126c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet throw new IllegalArgumentException("parentView is not a ViewGroup"); 127c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 128c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet if (childView instanceof View == false) { 129c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet throw new IllegalArgumentException("childView is not a View"); 130c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 131c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 132c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet try { 1339eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.prepareThread(); 13419a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mLastResult = mSession.acquire(Params.DEFAULT_TIMEOUT); 135c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet if (mLastResult.isSuccess()) { 13619a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mLastResult = mSession.moveChild((ViewGroup) parentView, (View) childView, index, 13701811aa86279af1b341a4fff344d66c0ebdd63daXavier Ducrohet layoutParams, listener); 138c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 139c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } finally { 14019a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mSession.release(); 1419eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.cleanupThread(); 142c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 143c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 144c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet return mLastResult; 145c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 146c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 147c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet @Override 14819a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet public Result removeChild(Object childView, IAnimationListener listener) { 149c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet if (childView instanceof View == false) { 150c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet throw new IllegalArgumentException("childView is not a View"); 151c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 152c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 153c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet try { 1549eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.prepareThread(); 15519a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mLastResult = mSession.acquire(Params.DEFAULT_TIMEOUT); 156c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet if (mLastResult.isSuccess()) { 15719a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mLastResult = mSession.removeChild((View) childView, listener); 158c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 159c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } finally { 16019a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mSession.release(); 1619eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet Bridge.cleanupThread(); 162c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 163c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 164c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet return mLastResult; 165c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet } 166c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet 167c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet @Override 168c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet public void dispose() { 169c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 170c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet 17119a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet /*package*/ BridgeRenderSession(RenderSessionImpl scene, Result lastResult) { 17219a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mSession = scene; 17319a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet mSession.setScene(this); 174c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet mLastResult = lastResult; 175c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet } 176c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet} 177