package com.antfortune.freeline.idea.actions;
import com.android.tools.idea.gradle.parser.GradleBuildFile;
import com.antfortune.freeline.idea.icons.PluginIcons;
import com.antfortune.freeline.idea.utils.GradleUtil;
import com.antfortune.freeline.idea.utils.NotificationUtils;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogBuilder;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.PsiFile;
import org.jetbrains.android.dom.manifest.Manifest;
import org.jetbrains.android.facet.AndroidFacet;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
/**
* Created by huangyong on 17/2/14.
*/
public class UsingReportAction extends AnAction implements OnRequestCallback {
public UsingReportAction() {
super(PluginIcons.FreelineIcon);
}
@Override
public void actionPerformed(AnActionEvent event) {
final Project project = event.getProject();
Module[] modules = ModuleManager.getInstance(project).getModules();
List<Pair<Module, PsiFile>> selectModulesList = new ArrayList<Pair<Module, PsiFile>>();
for (Module module : modules) {
GradleBuildFile file = GradleBuildFile.get(module);
if (file != null && !GradleUtil.isLibrary(file)) {
selectModulesList.add(Pair.create(module, file.getPsiFile()));
}
}
if (selectModulesList.size() > 1) {
final DialogBuilder builder = new DialogBuilder();
builder.setTitle("Freeline Reporter");
builder.resizable(false);
builder.setCenterPanel(new JLabel("There are multiple application modules, Please select the exact one.",
Messages.getInformationIcon(), SwingConstants.CENTER));
builder.addOkAction().setText("Cancel");
for (final Pair<Module, PsiFile> pair : selectModulesList) {
builder.addAction(new AbstractAction(":" + pair.first.getName()) {
@Override
public void actionPerformed(ActionEvent e) {
builder.getDialogWrapper().close(DialogWrapper.CANCEL_EXIT_CODE);
report(project, pair.getSecond());
}
});
}
if (builder.show() > -1) {
//return false;
}
} else if (selectModulesList.size() == 1) {
report(project, selectModulesList.get(0).getSecond());
}
}
private void report(Project project, PsiFile psiFile) {
Module module = ModuleUtilCore.findModuleForFile(psiFile.getVirtualFile(), project);
assert module != null;
AndroidFacet facet = AndroidFacet.getInstance(module);
assert facet != null;
Manifest manifest = facet.getManifest();
if (manifest == null) {
NotificationUtils.errorNotification("manifest file is null.");
return;
}
String packageName = manifest.getPackage().getValue();
if (packageName != null && packageName.length() > 0) {
UsingReportAsync task = new UsingReportAsync(packageName, this);
ApplicationManager.getApplication().executeOnPooledThread(task);
}
}
@Override
public void onSuccess() {
NotificationUtils.infoNotification("Enjoy your coding time with freeline!");
}
@Override
public void onFailure(Exception e) {
}
private static class UsingReportAsync implements Runnable {
private String packageName;
private OnRequestCallback callback;
public UsingReportAsync(String packageName, OnRequestCallback callback) {
this.packageName = packageName;
this.callback = callback;
}
@Override
public void run() {
try {
URL url = new URL("https://www.freelinebuild.com/api/feedback/app");
// URL url = new URL("http://localhost:3000/api/feedback/app");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
StringBuilder builder = new StringBuilder();
builder.append(URLEncoder.encode("pkg", "UTF-8"));
builder.append("=");
builder.append(URLEncoder.encode(packageName, "UTF-8"));
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
writer.write(builder.toString());
writer.flush();
writer.close();
os.close();
int responseCode = conn.getResponseCode();
if (responseCode >= 400) {
this.callback.onFailure(new Exception(conn.getResponseMessage()));
} else {
this.callback.onSuccess();
}
conn.disconnect();
} catch (IOException e) {
this.callback.onFailure(e);
}
}
}
}