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;
21bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohetimport com.android.ide.common.rendering.api.RenderParams;
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;
317d7016e72431ad7ee595d857a19231c69efeb6deXavier Ducrohetimport java.util.List;
32cf52390eee4c9ae792ef63af1528b2e71b33a04fXavier Ducrohetimport java.util.Map;
33c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet
34c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet/**
3519a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet * An implementation of {@link RenderSession}.
36c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet *
37c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet * This is a pretty basic class that does almost nothing. All of the work is done in
3819a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet * {@link RenderSessionImpl}.
39c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet *
40c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet */
4119a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohetpublic class BridgeRenderSession extends RenderSession {
42c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet
4319a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet    private final RenderSessionImpl mSession;
4419a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet    private Result mLastResult;
45c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet
46c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet    @Override
4719a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet    public Result getResult() {
48c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet        return mLastResult;
49c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet    }
50c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet
51c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet    @Override
52c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet    public BufferedImage getImage() {
5319a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet        return mSession.getImage();
54c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet    }
55c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet
56c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet    @Override
5716584225125acba18b74920b902c798dfead0328Xavier Ducrohet    public boolean isAlphaChannelImage() {
5816584225125acba18b74920b902c798dfead0328Xavier Ducrohet        return mSession.isAlphaChannelImage();
5916584225125acba18b74920b902c798dfead0328Xavier Ducrohet    }
6016584225125acba18b74920b902c798dfead0328Xavier Ducrohet
6116584225125acba18b74920b902c798dfead0328Xavier Ducrohet    @Override
627d7016e72431ad7ee595d857a19231c69efeb6deXavier Ducrohet    public List<ViewInfo> getRootViews() {
637d7016e72431ad7ee595d857a19231c69efeb6deXavier Ducrohet        return mSession.getViewInfos();
64c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet    }
65c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet
66c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet    @Override
6719a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet    public Map<String, String> getDefaultProperties(Object viewObject) {
6819a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet        return mSession.getDefaultProperties(viewObject);
69cf52390eee4c9ae792ef63af1528b2e71b33a04fXavier Ducrohet    }
70cf52390eee4c9ae792ef63af1528b2e71b33a04fXavier Ducrohet
71cf52390eee4c9ae792ef63af1528b2e71b33a04fXavier Ducrohet    @Override
72162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet    public Result getProperty(Object objectView, String propertyName) {
73162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet        // TODO Auto-generated method stub
74162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet        return super.getProperty(objectView, propertyName);
75162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet    }
76162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet
77162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet    @Override
78162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet    public Result setProperty(Object objectView, String propertyName, String propertyValue) {
79162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet        // TODO Auto-generated method stub
80162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet        return super.setProperty(objectView, propertyName, propertyValue);
81162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet    }
82162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet
83162ee1ed3d6c8a1e6d9347136e623e3429f6f3f8Xavier Ducrohet    @Override
8419a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet    public Result render(long timeout) {
852eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet        try {
869eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet            Bridge.prepareThread();
8719a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet            mLastResult = mSession.acquire(timeout);
88c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet            if (mLastResult.isSuccess()) {
895a82d8c58bf91c357c37a82b9f5e5c26f676d847Xavier Ducrohet                mLastResult = mSession.render(false /*freshRender*/);
90c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet            }
912eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet        } finally {
9219a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet            mSession.release();
939eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet            Bridge.cleanupThread();
942eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet        }
952eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet
962eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet        return mLastResult;
972eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet    }
982eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet
992eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet    @Override
10019a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet    public Result animate(Object targetObject, String animationName,
1012eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet            boolean isFrameworkAnimation, IAnimationListener listener) {
1022eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet        try {
1039eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet            Bridge.prepareThread();
104bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet            mLastResult = mSession.acquire(RenderParams.DEFAULT_TIMEOUT);
105c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet            if (mLastResult.isSuccess()) {
10619a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet                mLastResult = mSession.animate(targetObject, animationName, isFrameworkAnimation,
1072eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet                        listener);
1082eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet            }
1092eea6fab1cbb0a5c8f913491c2d622c904759893Xavier Ducrohet        } finally {
11019a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet            mSession.release();
1119eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet            Bridge.cleanupThread();
112c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet        }
113c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet
114c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet        return mLastResult;
115c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet    }
116c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet
117c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet    @Override
11819a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet    public Result insertChild(Object parentView, ILayoutPullParser childXml, int index,
119c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet            IAnimationListener listener) {
120c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet        if (parentView instanceof ViewGroup == false) {
121c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet            throw new IllegalArgumentException("parentView is not a ViewGroup");
122c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet        }
123c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet
124c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet        try {
1259eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet            Bridge.prepareThread();
126bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet            mLastResult = mSession.acquire(RenderParams.DEFAULT_TIMEOUT);
127c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet            if (mLastResult.isSuccess()) {
128d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet                mLastResult = mSession.insertChild((ViewGroup) parentView, childXml, index,
129d38e776a3cc8cb53945cbebafbe6f6c2e3501fa5Xavier Ducrohet                        listener);
130c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet            }
131c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet        } finally {
13219a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet            mSession.release();
1339eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet            Bridge.cleanupThread();
134c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet        }
135c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet
136c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet        return mLastResult;
137c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet    }
138c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet
139c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet
140c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet    @Override
14119a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet    public Result moveChild(Object parentView, Object childView, int index,
1423c78f2de353df3e287444dd9f9fbab3bd4456217Xavier Ducrohet            Map<String, String> layoutParams, IAnimationListener listener) {
143c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet        if (parentView instanceof ViewGroup == false) {
144c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet            throw new IllegalArgumentException("parentView is not a ViewGroup");
145c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet        }
146c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet        if (childView instanceof View == false) {
147c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet            throw new IllegalArgumentException("childView is not a View");
148c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet        }
149c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet
150c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet        try {
1519eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet            Bridge.prepareThread();
152bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet            mLastResult = mSession.acquire(RenderParams.DEFAULT_TIMEOUT);
153c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet            if (mLastResult.isSuccess()) {
15419a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet                mLastResult = mSession.moveChild((ViewGroup) parentView, (View) childView, index,
15501811aa86279af1b341a4fff344d66c0ebdd63daXavier Ducrohet                        layoutParams, listener);
156c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet            }
157c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet        } finally {
15819a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet            mSession.release();
1599eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet            Bridge.cleanupThread();
160c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet        }
161c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet
162c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet        return mLastResult;
163c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet    }
164c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet
165c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet    @Override
16619a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet    public Result removeChild(Object childView, IAnimationListener listener) {
167c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet        if (childView instanceof View == false) {
168c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet            throw new IllegalArgumentException("childView is not a View");
169c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet        }
170c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet
171c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet        try {
1729eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet            Bridge.prepareThread();
173bbbb8326020368958a3f1d248878329e9d6b10c0Xavier Ducrohet            mLastResult = mSession.acquire(RenderParams.DEFAULT_TIMEOUT);
174c8aec064f9f304c88f61c8c1aa3d60521b92177aXavier Ducrohet            if (mLastResult.isSuccess()) {
17519a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet                mLastResult = mSession.removeChild((View) childView, listener);
176c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet            }
177c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet        } finally {
17819a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet            mSession.release();
1799eb6d412af6859b6c0bb969c76bbfc48eec8fd4bXavier Ducrohet            Bridge.cleanupThread();
180c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet        }
181c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet
182c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet        return mLastResult;
183c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet    }
184c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet
185c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet    @Override
186c14e7dd8ba15f517a5402ad802377b1d60784416Xavier Ducrohet    public void dispose() {
187c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet    }
188c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet
18919a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet    /*package*/ BridgeRenderSession(RenderSessionImpl scene, Result lastResult) {
19019a021038f2f4683dddef651543d7298f5bd7218Xavier Ducrohet        mSession = scene;
191639e1bd35231a8f71e7acc95fedaf13ace9b65a9Xavier Ducrohet        if (scene != null) {
192639e1bd35231a8f71e7acc95fedaf13ace9b65a9Xavier Ducrohet            mSession.setScene(this);
193639e1bd35231a8f71e7acc95fedaf13ace9b65a9Xavier Ducrohet        }
194c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet        mLastResult = lastResult;
195c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet    }
196c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohet}
197