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