• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 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.example.android.render;
18 
19 import com.android.ide.common.rendering.api.RenderSession;
20 import com.android.ide.common.rendering.api.Result;
21 import com.android.ide.common.rendering.api.ViewInfo;
22 import com.android.ide.common.resources.ResourceItem;
23 import com.android.ide.common.resources.ResourceRepository;
24 import com.android.ide.common.resources.ResourceResolver;
25 import com.android.ide.common.resources.configuration.FolderConfiguration;
26 import com.android.io.FolderWrapper;
27 import com.android.resources.Density;
28 import com.android.resources.Keyboard;
29 import com.android.resources.KeyboardState;
30 import com.android.resources.Navigation;
31 import com.android.resources.NavigationState;
32 import com.android.resources.ScreenOrientation;
33 import com.android.resources.ScreenRatio;
34 import com.android.resources.ScreenSize;
35 import com.android.resources.TouchScreen;
36 
37 import org.xmlpull.v1.XmlPullParserException;
38 
39 import java.awt.image.BufferedImage;
40 import java.io.File;
41 import java.io.FileNotFoundException;
42 import java.io.IOException;
43 import java.util.List;
44 
45 import javax.imageio.ImageIO;
46 
47 /**
48  * Sample code showing how to use the different API used to achieve a layout rendering.
49  * This requires the following jar: layoutlib_api.jar, common.jar, sdk_common.jar, sdklib.jar (altho
50  * we should get rid of this one) and a full SDK (or at leas the platform component).
51  *
52  */
53 public class Main {
54 
55     // path to the SDK and the project to render
56     private final static String SDK = "...<insert>...";
57     private final static String PROJECT = "...<insert>...";
58 
59     /**
60      * @param args
61      */
main(String[] args)62     public static void main(String[] args) {
63         // load the factory for a given platform
64         File f = new File(SDK + "/platforms/android-3.1");
65         RenderServiceFactory factory = RenderServiceFactory.create(f);
66 
67         if (factory == null) {
68             System.err.println("Failed to load platform rendering library");
69             System.exit(1);
70         }
71 
72         // load the project resources
73         ResourceRepository projectRes = new ResourceRepository(false /*isFramework*/) {
74 
75             @Override
76             protected ResourceItem createResourceItem(String name) {
77                 return new ResourceItem(name);
78             }
79         };
80         try {
81             projectRes.loadResources(new FolderWrapper(PROJECT + "/res"));
82         } catch (IOException e) {
83             e.printStackTrace();
84             System.exit(1);
85         }
86 
87         // create the rendering config
88         FolderConfiguration config = RenderServiceFactory.createConfig(
89                 1280, 800, // size 1 and 2. order doesn't matter.
90                            // Orientation will drive which is w and h
91                 ScreenSize.XLARGE,
92                 ScreenRatio.LONG,
93                 ScreenOrientation.LANDSCAPE,
94                 Density.MEDIUM,
95                 TouchScreen.FINGER,
96                 KeyboardState.SOFT,
97                 Keyboard.QWERTY,
98                 NavigationState.EXPOSED,
99                 Navigation.NONAV,
100                 12); // api level
101 
102         // create the resource resolver once for the given config.
103         ResourceResolver resources = factory.createResourceResolver(
104                 config, projectRes,
105                 "Theme", false /*isProjectTheme*/);
106 
107         // create the render service
108         RenderService renderService = factory.createService(
109                 resources, config, new ProjectCallback());
110 
111         try {
112             RenderSession session = renderService
113                     .setLog(new StdOutLogger())
114                     .setAppInfo("foo", "icon") // optional
115                     .createRenderSession("main" /*layoutName*/);
116 
117             // get the status of the render
118             Result result = session.getResult();
119             if (result.isSuccess() == false) {
120                 System.err.println(result.getErrorMessage());
121                 System.exit(1);
122             }
123 
124             // get the image and save it somewhere.
125             BufferedImage image = session.getImage();
126             ImageIO.write(image, "png", new File("/path/to/test.png"));
127 
128             // read the views
129             displayViewObjects(session.getRootViews());
130 
131             return;
132         } catch (FileNotFoundException e) {
133             e.printStackTrace();
134         } catch (XmlPullParserException e) {
135             e.printStackTrace();
136         } catch (IOException e) {
137             e.printStackTrace();
138         }
139 
140         System.exit(1);
141     }
142 
displayViewObjects(List<ViewInfo> rootViews)143     private static void displayViewObjects(List<ViewInfo> rootViews) {
144         for (ViewInfo info : rootViews) {
145             displayView(info, "");
146         }
147     }
148 
displayView(ViewInfo info, String indent)149     private static void displayView(ViewInfo info, String indent) {
150         // display info data
151         System.out.println(indent + info.getClassName() +
152                 " [" + info.getLeft() + ", " + info.getTop() + ", " +
153                 info.getRight() + ", " + info.getBottom() + "]");
154 
155         // display the children
156         List<ViewInfo> children = info.getChildren();
157         if (children != null) {
158             indent += "\t";
159             for (ViewInfo child : children) {
160                 displayView(child, indent);
161             }
162         }
163     }
164 }
165