1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*
2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Copyright (C) 2010 The Android Open Source Project
3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * you may not use this file except in compliance with the License.
6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * You may obtain a copy of the License at
7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Unless required by applicable law or agreed to in writing, software
11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * See the License for the specific language governing permissions and
14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * limitations under the License.
15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */
16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipackage com.android.layoutlib.bridge;
18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.IAnimationListener;
20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.ILayoutPullParser;
21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.RenderParams;
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.RenderSession;
23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.Result;
24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.ViewInfo;
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.impl.RenderSessionImpl;
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.View;
28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.ViewGroup;
29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.awt.image.BufferedImage;
31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.List;
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.Map;
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/**
35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * An implementation of {@link RenderSession}.
36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * This is a pretty basic class that does almost nothing. All of the work is done in
38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * {@link RenderSessionImpl}.
39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic class BridgeRenderSession extends RenderSession {
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private final RenderSessionImpl mSession;
44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    private Result mLastResult;
45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Result getResult() {
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mLastResult;
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public BufferedImage getImage() {
53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mSession.getImage();
54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public boolean isAlphaChannelImage() {
58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mSession.isAlphaChannelImage();
59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public List<ViewInfo> getRootViews() {
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mSession.getViewInfos();
64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
6714bf0cef7eeed572a67c29a328581afac4decc20Deepanshu Gupta    public List<ViewInfo> getSystemRootViews() {
6814bf0cef7eeed572a67c29a328581afac4decc20Deepanshu Gupta        return mSession.getSystemViewInfos();
6914bf0cef7eeed572a67c29a328581afac4decc20Deepanshu Gupta    }
7014bf0cef7eeed572a67c29a328581afac4decc20Deepanshu Gupta
7114bf0cef7eeed572a67c29a328581afac4decc20Deepanshu Gupta    @Override
72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Map<String, String> getDefaultProperties(Object viewObject) {
73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mSession.getDefaultProperties(viewObject);
74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Result getProperty(Object objectView, String propertyName) {
78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return super.getProperty(objectView, propertyName);
80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Result setProperty(Object objectView, String propertyName, String propertyValue) {
84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // pass
85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return super.setProperty(objectView, propertyName, propertyValue);
86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Result render(long timeout) {
90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        try {
91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Bridge.prepareThread();
92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mLastResult = mSession.acquire(timeout);
93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (mLastResult.isSuccess()) {
94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                mLastResult = mSession.render(false /*freshRender*/);
95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } finally {
97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mSession.release();
98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Bridge.cleanupThread();
99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mLastResult;
102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Result animate(Object targetObject, String animationName,
106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            boolean isFrameworkAnimation, IAnimationListener listener) {
107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        try {
108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Bridge.prepareThread();
109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mLastResult = mSession.acquire(RenderParams.DEFAULT_TIMEOUT);
110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (mLastResult.isSuccess()) {
111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                mLastResult = mSession.animate(targetObject, animationName, isFrameworkAnimation,
112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        listener);
113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } finally {
115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mSession.release();
116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Bridge.cleanupThread();
117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mLastResult;
120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Result insertChild(Object parentView, ILayoutPullParser childXml, int index,
124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            IAnimationListener listener) {
125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (parentView instanceof ViewGroup == false) {
126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            throw new IllegalArgumentException("parentView is not a ViewGroup");
127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        try {
130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Bridge.prepareThread();
131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mLastResult = mSession.acquire(RenderParams.DEFAULT_TIMEOUT);
132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (mLastResult.isSuccess()) {
133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                mLastResult = mSession.insertChild((ViewGroup) parentView, childXml, index,
134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        listener);
135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } finally {
137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mSession.release();
138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Bridge.cleanupThread();
139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mLastResult;
142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Result moveChild(Object parentView, Object childView, int index,
147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Map<String, String> layoutParams, IAnimationListener listener) {
148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (parentView instanceof ViewGroup == false) {
149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            throw new IllegalArgumentException("parentView is not a ViewGroup");
150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (childView instanceof View == false) {
152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            throw new IllegalArgumentException("childView is not a View");
153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        try {
156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Bridge.prepareThread();
157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mLastResult = mSession.acquire(RenderParams.DEFAULT_TIMEOUT);
158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (mLastResult.isSuccess()) {
159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                mLastResult = mSession.moveChild((ViewGroup) parentView, (View) childView, index,
160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                        layoutParams, listener);
161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } finally {
163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mSession.release();
164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Bridge.cleanupThread();
165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mLastResult;
168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public Result removeChild(Object childView, IAnimationListener listener) {
172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (childView instanceof View == false) {
173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            throw new IllegalArgumentException("childView is not a View");
174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        try {
177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Bridge.prepareThread();
178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mLastResult = mSession.acquire(RenderParams.DEFAULT_TIMEOUT);
179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (mLastResult.isSuccess()) {
180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                mLastResult = mSession.removeChild((View) childView, listener);
181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } finally {
183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mSession.release();
184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Bridge.cleanupThread();
185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mLastResult;
188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
190282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    @Override
191282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public void dispose() {
192282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
193282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*package*/ BridgeRenderSession(RenderSessionImpl scene, Result lastResult) {
195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mSession = scene;
196282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (scene != null) {
197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mSession.setScene(this);
198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mLastResult = lastResult;
200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
201282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
202