-
Notifications
You must be signed in to change notification settings - Fork 35
Expand file tree
/
Copy pathAndroidServlet.java
More file actions
126 lines (111 loc) · 4.81 KB
/
Copy pathAndroidServlet.java
File metadata and controls
126 lines (111 loc) · 4.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// -*- mode: java; c-basic-offset: 2; -*-
// Copyright 2009-2011 Google, All Rights reserved
// Copyright 2011-2012 MIT, All rights reserved
// Released under the MIT License https://raw.github.com/mit-cml/app-inventor/master/mitlicense.txt
package com.google.appinventor.server;
import com.google.appinventor.server.storage.StorageIo;
import com.google.appinventor.server.storage.StorageIoInstanceHolder;
import com.google.appinventor.server.util.CacheHeaders;
import com.google.appinventor.server.util.CacheHeadersImpl;
import com.google.appinventor.shared.rpc.ServerLayout;
import com.google.appinventor.shared.rpc.project.youngandroid.YoungAndroidProjectNode;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet for creating a page for downloading project output on an Android
* device.
*
*/
public class AndroidServlet extends OdeServlet {
// Object used to safely set cache headers in responses
private static final CacheHeaders CACHE_HEADERS = new CacheHeadersImpl();
// Content type for response header (to avoid security vulnerabilities)
private static final String CONTENT_TYPE = "text/html; charset=utf-8";
private final StorageIo storageIo = StorageIoInstanceHolder.INSTANCE;
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
setDefaultHeader(resp);
PrintWriter out = resp.getWriter();
String logo = "images/logo_ya.png";
StringBuilder htmlString = new StringBuilder();
htmlString
.append("<!-- Copyright 2009 Google Inc. All Rights Reserved. -->\n")
.append("<html>\n")
.append("<head>\n")
.append("<title>App Inventor for Android Downloads</title>\n")
.append("<link type=\"text/css\" rel=\"stylesheet\" href=\"Ode.css\">\n")
.append("</head>\n")
.append("<body>\n")
.append("<table width=\"100%\"><tr><td height=\"16\" align=\"left\">\n")
.append("<img src=\"\n")
.append(logo)
.append("\"></td>\n")
.append("<td class=\"ode-Android-banner\">Downloads</td>\n")
.append("</tr></table><hr>\n")
.append("<table width=\"100%\"><tr><td height=\"16\" align=\"left\">\n")
.append("<div class=\"ode-Android-header\">\n")
.append("<b>\n")
.append(userInfoProvider.getUserEmail())
.append("</b> | <a href='\n")
.append(ServerLayout.ODE_LOGOUT_URL)
.append("'>Sign Out</a>\n")
.append("</div>\n")
.append("</td></tr></table>\n")
.append("<table width=\"100%\"><tr><td height=\"16\" align=\"left\">\n")
.append("<div class=\"ode-Android-caption\">\n")
.append("Projects\n")
.append("</div>\n")
.append("</td></tr></table>\n");
out.println(htmlString.toString());
out.println("<table class=\"ode-Android-body\">");
String userId = userInfoProvider.getUserId();
List<Long> projectIds = storageIo.getProjects(userId);
for (long projectId : projectIds) {
String projectType = storageIo.getProjectType(userId, projectId);
String projectName = storageIo.getProjectName(userId, projectId);
if (projectType.equals(YoungAndroidProjectNode.YOUNG_ANDROID_PROJECT_TYPE)) {
String target = YoungAndroidProjectNode.YOUNG_ANDROID_TARGET_ANDROID;
// TODO(lizlooney) - we need a 16x16 image for young android.
String icon = "images/simple.png";
if (containsAndroidTarget(storageIo.getProjectOutputFiles(userId, projectId), target)) {
out.println(makeAndroidTargetRow(projectId, projectName, target, icon));
}
}
}
out.println("</table>");
out.println("<table width=\"100%\"><tr><td height=\"12\" align=\"left\">" +
"<div class=\"ode-Android-footer\">" +
"©2009 Google" +
"</div>" +
"</td></tr></table>" +
"</body>" +
"</html>");
}
/*
* Indicates whether the project contains any project output files for Android.
*/
private static boolean containsAndroidTarget(List<String> outputFiles, String target) {
for (String outputFile : outputFiles) {
if (outputFile.startsWith("build/" + target + '/')) {
return true;
}
}
return false;
}
private static String makeAndroidTargetRow(long projectId, String projectName,
String target, String image) {
String projectUrl = ServerLayout.genFullDownloadPath(projectId, target);
return "<tr><td><img src=\"" + image + "\"> <a href=\"" + projectUrl + "\">" +
projectName + "</a></td></tr>";
}
/*
* Set a default http header to avoid security vulnerabilities.
*/
private static void setDefaultHeader(HttpServletResponse resp) {
CACHE_HEADERS.setNotCacheable(resp);
resp.setContentType(CONTENT_TYPE);
}
}