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