package com.psddev.cms.tool.page;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import com.psddev.cms.db.ToolUserAction;
import com.psddev.cms.db.ToolUserDevice;
import com.psddev.cms.tool.ToolPageContext;
import com.psddev.dari.db.Query;
import com.psddev.dari.util.CompactMap;
import com.psddev.dari.util.JspUtils;
public class LookingGlassTab extends ProfilePanelTab {
@Override
public void writeHtml(ToolPageContext page) throws IOException, ServletException {
Map<String, List<ToolUserDevice>> devicesByUserAgent = new CompactMap<String, List<ToolUserDevice>>();
for (ToolUserDevice device : Query
.from(ToolUserDevice.class)
.where("user = ?", page.getUser())
.selectAll()) {
String userAgent = device.getUserAgentDisplay();
List<ToolUserDevice> devices = devicesByUserAgent.get(userAgent);
if (devices == null) {
devices = new ArrayList<ToolUserDevice>();
devicesByUserAgent.put(userAgent, devices);
}
devices.add(device);
}
final Map<ToolUserDevice, List<ToolUserAction>> actionsByDevice = new CompactMap<ToolUserDevice, List<ToolUserAction>>();
for (Map.Entry<String, List<ToolUserDevice>> entry : devicesByUserAgent.entrySet()) {
ToolUserDevice device = null;
List<ToolUserAction> actions = null;
long lastTime = 0;
for (ToolUserDevice d : entry.getValue()) {
List<ToolUserAction> a = Query
.from(ToolUserAction.class)
.where("device = ?", d)
.sortDescending("time")
.selectAll();
if (!a.isEmpty()) {
long time = a.get(0).getTime();
if (lastTime < time) {
lastTime = time;
device = d;
actions = a;
}
}
}
if (device != null) {
actionsByDevice.put(device, actions);
}
}
List<ToolUserDevice> recentDevices = new ArrayList<ToolUserDevice>(actionsByDevice.keySet());
recentDevices.sort((x, y) -> {
long xTime = actionsByDevice.get(x).get(0).getTime();
long yTime = actionsByDevice.get(y).get(0).getTime();
return xTime < yTime ? 1 : (xTime > yTime ? -1 : 0);
});
page.writeStart("div",
"class", "p-tud-lg tabbed",
"data-tab", "Looking Glass");
for (ToolUserDevice device : recentDevices) {
List<ToolUserAction> actions = actionsByDevice.get(device);
String lookingGlassUrl = JspUtils.getHostUrl(page.getRequest()) + page.cmsUrl("/lookingGlass", "id", device.getOrCreateLookingGlassId());
page.writeStart("div", "data-tab", device.getUserAgentDisplay());
page.writeStart("div", "class", "p-tud-lg-url");
page.writeStart("p");
page.writeHtml("Mirror your activities in this browser to another device or share them with another user by using the link or the QR code below:");
page.writeEnd();
page.writeElement("input",
"type", "text",
"value", lookingGlassUrl);
page.writeElement("img",
"width", 200,
"height", 200,
"src", page.cmsUrl("qrCode",
"data", lookingGlassUrl,
"size", 200));
page.writeEnd();
page.writeStart("div", "class", "p-tud-lg-recent");
page.writeStart("h2");
page.writeHtml("Recent Activity");
page.writeEnd();
page.writeStart("ul", "class", "links");
for (ToolUserAction action : actions) {
Object actionContent = action.getContent();
if (actionContent == null) {
continue;
}
page.writeStart("li");
page.writeStart("a",
"target", "_top",
"href", page.objectUrl("/content/edit.jsp", actionContent));
page.writeTypeObjectLabel(actionContent);
page.writeEnd();
page.writeEnd();
}
page.writeEnd();
page.writeEnd();
page.writeEnd();
}
page.writeEnd();
}
}