1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.ide.common.rendering.api; 18 19 import static com.android.ide.common.rendering.api.Result.Status.NOT_IMPLEMENTED; 20 21 import com.android.ide.common.rendering.api.Result.Status; 22 23 import java.awt.image.BufferedImage; 24 import java.util.List; 25 import java.util.Map; 26 27 /** 28 * An object allowing interaction with an Android layout. 29 * 30 * This is returned by {@link Bridge#createScene(RenderParams)}. 31 * and can then be used for subsequent actions on the layout. 32 * 33 * @since 5 34 * 35 */ 36 public class RenderSession { 37 38 /** 39 * Returns the last operation result. 40 */ getResult()41 public Result getResult() { 42 return NOT_IMPLEMENTED.createResult(); 43 } 44 45 /** 46 * Returns the {@link ViewInfo} objects for the top level views. 47 * <p/> 48 * In most case the list will only contain one item. If the top level node is {@code merge} 49 * though then it will contain all the items under the {@code merge} tag. 50 * <p/> 51 * This is reset to a new instance every time {@link #render()} is called and can be 52 * <code>null</code> if the call failed (and the method returned a {@link Result} with 53 * {@link Status#ERROR_UNKNOWN} or {@link Status#NOT_IMPLEMENTED}. 54 * <p/> 55 * This can be safely modified by the caller. 56 * 57 * @return the list of {@link ViewInfo} or null if there aren't any. 58 */ getRootViews()59 public List<ViewInfo> getRootViews() { 60 return null; 61 } 62 63 /** 64 * Returns the rendering of the full layout. 65 * <p> 66 * This is reset to a new instance every time {@link #render()} is called and can be 67 * <code>null</code> if the call failed (and the method returned a {@link Result} with 68 * {@link Status#ERROR_UNKNOWN} or {@link Status#NOT_IMPLEMENTED}. 69 * <p/> 70 * This can be safely modified by the caller. 71 */ getImage()72 public BufferedImage getImage() { 73 return null; 74 } 75 76 /** 77 * Returns true if the current image alpha channel is relevant. 78 * 79 * @return whether the image alpha channel is relevant. 80 */ isAlphaChannelImage()81 public boolean isAlphaChannelImage() { 82 return true; 83 } 84 85 /** 86 * Returns a map of (XML attribute name, attribute value) containing only default attribute 87 * values, for the given view Object. 88 * @param viewObject the view object. 89 * @return a map of the default property values or null. 90 */ getDefaultProperties(Object viewObject)91 public Map<String, String> getDefaultProperties(Object viewObject) { 92 return null; 93 } 94 95 /** 96 * Re-renders the layout as-is. 97 * In case of success, this should be followed by calls to {@link #getRootView()} and 98 * {@link #getImage()} to access the result of the rendering. 99 * 100 * This is equivalent to calling <code>render(SceneParams.DEFAULT_TIMEOUT)</code> 101 * 102 * @return a {@link Result} indicating the status of the action. 103 */ render()104 public Result render() { 105 return render(RenderParams.DEFAULT_TIMEOUT); 106 } 107 108 /** 109 * Re-renders the layout as-is, with a given timeout in case other renderings are being done. 110 * In case of success, this should be followed by calls to {@link #getRootView()} and 111 * {@link #getImage()} to access the result of the rendering. 112 * 113 * The {@link Bridge} is only able to inflate or render one layout at a time. There 114 * is an internal lock object whenever such an action occurs. The timeout parameter is used 115 * when attempting to acquire the lock. If the timeout expires, the method will return 116 * {@link Status#ERROR_TIMEOUT}. 117 * 118 * @param timeout timeout for the rendering, in milliseconds. 119 * 120 * @return a {@link Result} indicating the status of the action. 121 */ render(long timeout)122 public Result render(long timeout) { 123 return NOT_IMPLEMENTED.createResult(); 124 } 125 126 /** 127 * Sets the value of a given property on a given object. 128 * <p/> 129 * This does nothing more than change the property. To render the scene in its new state, a 130 * call to {@link #render()} is required. 131 * <p/> 132 * Any amount of actions can be taken on the scene before {@link #render()} is called. 133 * 134 * @param objectView 135 * @param propertyName 136 * @param propertyValue 137 * 138 * @return a {@link Result} indicating the status of the action. 139 * 140 * @throws IllegalArgumentException if the view object is not an android.view.View 141 */ setProperty(Object objectView, String propertyName, String propertyValue)142 public Result setProperty(Object objectView, String propertyName, String propertyValue) { 143 return NOT_IMPLEMENTED.createResult(); 144 } 145 146 /** 147 * returns the value of a given property on a given object. 148 * <p/> 149 * This returns a {@link Result} object. If the operation of querying the object for its 150 * property was successful (check {@link Result#isSuccess()}), then the property value 151 * is set in the result and can be accessed through {@link Result#getData()}. 152 * 153 * @param objectView 154 * @param propertyName 155 * 156 * @return a {@link Result} indicating the status of the action. 157 * 158 * @throws IllegalArgumentException if the view object is not an android.view.View 159 */ getProperty(Object objectView, String propertyName)160 public Result getProperty(Object objectView, String propertyName) { 161 return NOT_IMPLEMENTED.createResult(); 162 } 163 164 /** 165 * Inserts a new child in a ViewGroup object, and renders the result. 166 * <p/> 167 * The child is first inflated and then added to its new parent, at the given <var>index<var> 168 * position. If the <var>index</var> is -1 then the child is added at the end of the parent. 169 * <p/> 170 * If an animation listener is passed then the rendering is done asynchronously and the 171 * result is sent to the listener. 172 * If the listener is null, then the rendering is done synchronously. 173 * <p/> 174 * The child stays in the view hierarchy after the rendering is done. To remove it call 175 * {@link #removeChild(Object, IAnimationListener)} 176 * <p/> 177 * The returned {@link Result} object will contain the android.view.View object for 178 * the newly inflated child. It is accessible through {@link Result#getData()}. 179 * 180 * @param parentView the parent View object to receive the new child. 181 * @param childXml an {@link ILayoutPullParser} containing the content of the new child, 182 * including ViewGroup.LayoutParams attributes. 183 * @param index the index at which position to add the new child into the parent. -1 means at 184 * the end. 185 * @param listener an optional {@link IAnimationListener}. 186 * 187 * @return a {@link Result} indicating the status of the action. 188 */ insertChild(Object parentView, ILayoutPullParser childXml, int index, IAnimationListener listener)189 public Result insertChild(Object parentView, ILayoutPullParser childXml, int index, 190 IAnimationListener listener) { 191 return NOT_IMPLEMENTED.createResult(); 192 } 193 194 /** 195 * Move a new child to a different ViewGroup object. 196 * <p/> 197 * The child is first removed from its current parent, and then added to its new parent, at the 198 * given <var>index<var> position. In case the <var>parentView</var> is the current parent of 199 * <var>childView</var> then the index must be the value with the <var>childView</var> removed 200 * from its parent. If the <var>index</var> is -1 then the child is added at the end of 201 * the parent. 202 * <p/> 203 * If an animation listener is passed then the rendering is done asynchronously and the 204 * result is sent to the listener. 205 * If the listener is null, then the rendering is done synchronously. 206 * <p/> 207 * The child stays in the view hierarchy after the rendering is done. To remove it call 208 * {@link #removeChild(Object, IAnimationListener)} 209 * <p/> 210 * The returned {@link Result} object will contain the android.view.ViewGroup.LayoutParams 211 * object created from the <var>layoutParams</var> map if it was non <code>null</code>. 212 * 213 * @param parentView the parent View object to receive the child. Can be the current parent 214 * already. 215 * @param childView the view to move. 216 * @param index the index at which position to add the new child into the parent. -1 means at 217 * the end. 218 * @param layoutParams an optional map of new ViewGroup.LayoutParams attribute. If non null, 219 * then the current layout params of the view will be removed and a new one will 220 * be inflated and set with the content of the map. 221 * @param listener an optional {@link IAnimationListener}. 222 * 223 * @return a {@link Result} indicating the status of the action. 224 */ moveChild(Object parentView, Object childView, int index, Map<String, String> layoutParams, IAnimationListener listener)225 public Result moveChild(Object parentView, Object childView, int index, 226 Map<String, String> layoutParams, IAnimationListener listener) { 227 return NOT_IMPLEMENTED.createResult(); 228 } 229 230 /** 231 * Removes a child from a ViewGroup object. 232 * <p/> 233 * This does nothing more than change the layout. To render the scene in its new state, a 234 * call to {@link #render()} is required. 235 * <p/> 236 * Any amount of actions can be taken on the scene before {@link #render()} is called. 237 * 238 * @param childView the view object to remove from its parent 239 * @param listener an optional {@link IAnimationListener}. 240 * 241 * @return a {@link Result} indicating the status of the action. 242 */ removeChild(Object childView, IAnimationListener listener)243 public Result removeChild(Object childView, IAnimationListener listener) { 244 return NOT_IMPLEMENTED.createResult(); 245 } 246 247 /** 248 * Starts playing an given animation on a given object. 249 * <p/> 250 * The animation playback is asynchronous and the rendered frame is sent vi the 251 * <var>listener</var>. 252 * 253 * @param targetObject the view object to animate 254 * @param animationName the name of the animation (res/anim) to play. 255 * @param listener the listener callback. 256 * 257 * @return a {@link Result} indicating the status of the action. 258 */ animate(Object targetObject, String animationName, boolean isFrameworkAnimation, IAnimationListener listener)259 public Result animate(Object targetObject, String animationName, 260 boolean isFrameworkAnimation, IAnimationListener listener) { 261 return NOT_IMPLEMENTED.createResult(); 262 } 263 264 /** 265 * Discards the layout. No more actions can be called on this object. 266 */ dispose()267 public void dispose() { 268 } 269 } 270