fix reference

Signed-off-by: pengzhile <pengzhile@gmail.com>
pull/8/head
pengzhile 2020-11-12 20:43:04 +08:00
parent 8c0786f1e7
commit ba352d925b
11 changed files with 101 additions and 71 deletions

View File

@ -4,7 +4,7 @@ plugins {
} }
group 'io.zhile.research.intellij' group 'io.zhile.research.intellij'
version '2.1.3' version '2.1.4'
sourceCompatibility = 1.8 sourceCompatibility = 1.8
targetCompatibility = 1.8 targetCompatibility = 1.8
@ -29,6 +29,8 @@ intellij {
patchPluginXml { patchPluginXml {
changeNotes """<pre> changeNotes """<pre>
Release v2.1.4
1. fix reference
Release v2.1.3 Release v2.1.3
1. add version in UI 1. add version in UI
Release v2.1.2 Release v2.1.2

View File

@ -15,18 +15,20 @@ import com.intellij.openapi.wm.ex.ToolWindowManagerEx;
import io.zhile.research.intellij.ier.component.ResetTimer; import io.zhile.research.intellij.ier.component.ResetTimer;
import io.zhile.research.intellij.ier.helper.Constants; import io.zhile.research.intellij.ier.helper.Constants;
import io.zhile.research.intellij.ier.helper.CustomRepository; import io.zhile.research.intellij.ier.helper.CustomRepository;
import io.zhile.research.intellij.ier.helper.PluginHelper;
import io.zhile.research.intellij.ier.helper.ProjectHelper; import io.zhile.research.intellij.ier.helper.ProjectHelper;
import io.zhile.research.intellij.ier.tw.MainToolWindowFactory; import io.zhile.research.intellij.ier.tw.MainToolWindowFactory;
import io.zhile.research.intellij.ier.ui.dialog.MainDialog; import io.zhile.research.intellij.ier.ui.dialog.MainDialog;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.lang.ref.WeakReference;
public class ResetAction extends AnAction implements DumbAware { public class ResetAction extends AnAction implements DumbAware {
private static final String ACTION_NAME = "Eval Reset";
private static final DataKey<Notification> NOTIFICATION_KEY = DataKey.create("Notification"); private static final DataKey<Notification> NOTIFICATION_KEY = DataKey.create("Notification");
public ResetAction() { public ResetAction() {
super(ACTION_NAME, "Reset my IDE eval information", AllIcons.General.Reset); super(Constants.ACTION_NAME, "Reset my IDE eval information", AllIcons.General.Reset);
new ResetTimer().start(this); ResetTimer.start(new WeakReference<>(this));
CustomRepository.checkAndAdd(CustomRepository.DEFAULT_HOST); CustomRepository.checkAndAdd(CustomRepository.DEFAULT_HOST);
} }
@ -41,23 +43,23 @@ public class ResetAction extends AnAction implements DumbAware {
} }
if (project == null) { if (project == null) {
MainDialog mainDialog = new MainDialog(ACTION_NAME); MainDialog mainDialog = new MainDialog(Constants.ACTION_NAME);
mainDialog.show(); mainDialog.show();
return; return;
} }
ToolWindow toolWindow = ToolWindowManager.getInstance(project).getToolWindow(ACTION_NAME); ToolWindow toolWindow = ToolWindowManager.getInstance(project).getToolWindow(Constants.ACTION_NAME);
if (null == toolWindow) { if (null == toolWindow) {
ToolWindowEP ep = new ToolWindowEP(); ToolWindowEP ep = new ToolWindowEP();
ep.id = ACTION_NAME; ep.id = Constants.ACTION_NAME;
ep.anchor = ToolWindowAnchor.BOTTOM.toString(); ep.anchor = ToolWindowAnchor.BOTTOM.toString();
ep.icon = "AllIcons.General.Reset"; ep.icon = "AllIcons.General.Reset";
ep.factoryClass = MainToolWindowFactory.class.getName(); ep.factoryClass = MainToolWindowFactory.class.getName();
ep.setPluginDescriptor(Constants.PLUGIN_DESC); ep.setPluginDescriptor(PluginHelper.getPluginDescriptor());
ToolWindowManagerEx.getInstanceEx(project).initToolWindow(ep); ToolWindowManagerEx.getInstanceEx(project).initToolWindow(ep);
toolWindow = ToolWindowManager.getInstance(project).getToolWindow(ACTION_NAME); toolWindow = ToolWindowManager.getInstance(project).getToolWindow(Constants.ACTION_NAME);
} }
toolWindow.show(null); toolWindow.show(null);

View File

@ -7,7 +7,7 @@ import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.SystemInfo;
import io.zhile.research.intellij.ier.helper.Constants; import io.zhile.research.intellij.ier.helper.Constants;
import io.zhile.research.intellij.ier.helper.NotificationHelper; import io.zhile.research.intellij.ier.helper.NotificationHelper;
import io.zhile.research.intellij.ier.helper.Reflection; import io.zhile.research.intellij.ier.helper.ReflectionHelper;
import org.jdom.Element; import org.jdom.Element;
import java.io.File; import java.io.File;
@ -67,7 +67,7 @@ public class Resetter {
List<String> prefsList = new ArrayList<>(); List<String> prefsList = new ArrayList<>();
getAllPrefsKeys(Preferences.userRoot().node(IDE_EVAL_PREFIX), prefsList); getAllPrefsKeys(Preferences.userRoot().node(IDE_EVAL_PREFIX), prefsList);
Method methodGetProductCode = Reflection.getMethod(IdeaPluginDescriptor.class, "getProductCode"); Method methodGetProductCode = ReflectionHelper.getMethod(IdeaPluginDescriptor.class, "getProductCode");
if (null != methodGetProductCode) { if (null != methodGetProductCode) {
for (IdeaPluginDescriptor descriptor : PluginManager.getPlugins()) { for (IdeaPluginDescriptor descriptor : PluginManager.getPlugins()) {
String productCode = (String) methodGetProductCode.invoke(descriptor); String productCode = (String) methodGetProductCode.invoke(descriptor);

View File

@ -6,23 +6,22 @@ import com.intellij.notification.Notification;
import com.intellij.notification.NotificationType; import com.intellij.notification.NotificationType;
import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project; import com.intellij.util.concurrency.AppExecutorUtil;
import com.intellij.openapi.project.ProjectManager;
import io.zhile.research.intellij.ier.action.RestartAction; import io.zhile.research.intellij.ier.action.RestartAction;
import io.zhile.research.intellij.ier.common.Resetter; import io.zhile.research.intellij.ier.common.Resetter;
import io.zhile.research.intellij.ier.helper.Constants; import io.zhile.research.intellij.ier.helper.*;
import io.zhile.research.intellij.ier.helper.DateTime;
import io.zhile.research.intellij.ier.helper.NotificationHelper;
import io.zhile.research.intellij.ier.listener.AppEventListener; import io.zhile.research.intellij.ier.listener.AppEventListener;
import java.util.Arrays; import java.lang.ref.WeakReference;
import java.util.Timer; import java.util.concurrent.ScheduledFuture;
import java.util.TimerTask; import java.util.concurrent.TimeUnit;
public class ResetTimer { public class ResetTimer {
private static final long RESET_PERIOD = 2160000000L; // 25 days private static final long RESET_PERIOD = 2160000000L; // 25 days
private static final String RESET_KEY = Constants.PLUGIN_PREFS_PREFIX + "." + Constants.IDE_NAME_LOWER + "." + Constants.IDE_HASH; private static final String RESET_KEY = Constants.PLUGIN_PREFS_PREFIX + "." + Constants.IDE_NAME_LOWER + "." + Constants.IDE_HASH;
private static ScheduledFuture<?> scheduledFuture;
public static long getLastResetTime() { public static long getLastResetTime() {
return Prefs.getLong(RESET_KEY, 0L); return Prefs.getLong(RESET_KEY, 0L);
} }
@ -38,47 +37,39 @@ public class ResetTimer {
return lastResetTime > 0 ? DateTime.getStringFromTimestamp(lastResetTime) : "Not yet"; return lastResetTime > 0 ? DateTime.getStringFromTimestamp(lastResetTime) : "Not yet";
} }
public void start(final AnAction resetAction) { public synchronized static void start(final WeakReference<AnAction> weakResetAction) {
ApplicationManager.getApplication().getMessageBus().connect().subscribe(AppLifecycleListener.TOPIC, new AppEventListener()); if (scheduledFuture != null) {
return;
}
new Timer().schedule(new TimerTask() { ApplicationManager.getApplication().getMessageBus().connect().subscribe(AppLifecycleListener.TOPIC, new AppEventListener());
@Override scheduledFuture = AppExecutorUtil.getAppScheduledExecutorService().scheduleWithFixedDelay(() -> {
public void run() { if (System.currentTimeMillis() - getLastResetTime() <= RESET_PERIOD) {
new ResetTimerTask(getLastResetTime(), resetAction).run(); return;
} }
}, 3000);
stop();
AnAction resetAction = weakResetAction.get();
if (resetAction == null) {
return;
}
AnAction action = Resetter.isAutoReset() ? new RestartAction() : resetAction;
String message = "It has been a long time since the last reset!\nWould you like to reset it again?";
Notification notification = NotificationHelper.NOTIFICATION_GROUP.createNotification(PluginHelper.getPluginName(), null, message, NotificationType.INFORMATION);
notification.addAction(action);
notification.notify(ProjectHelper.getCurrentProject());
}, 3, 600, TimeUnit.SECONDS);
} }
protected static class ResetTimerTask extends TimerTask { public synchronized static void stop() {
private final long lastResetTime; if (scheduledFuture == null || scheduledFuture.isCancelled()) {
private final AnAction resetAction; return;
public ResetTimerTask(long lastResetTime, AnAction resetAction) {
this.lastResetTime = lastResetTime;
this.resetAction = resetAction;
} }
@Override scheduledFuture.cancel(false);
public void run() { scheduledFuture = null;
do {
if (System.currentTimeMillis() - lastResetTime <= RESET_PERIOD) {
break;
}
AnAction action = Resetter.isAutoReset() ? new RestartAction() : resetAction;
String message = "It has been a long time since the last reset!\nWould you like to reset it again?";
Notification notification = NotificationHelper.NOTIFICATION_GROUP.createNotification(Constants.PLUGIN_NAME, null, message, NotificationType.INFORMATION);
notification.addAction(action);
Project[] projects = ProjectManager.getInstance().getOpenProjects();
if (projects.length == 0) {
notification.notify(null);
} else {
Arrays.stream(projects).forEach(notification::notify);
}
} while (false);
new Timer().schedule(new ResetTimerTask(lastResetTime, resetAction), 600000); // 10 min
}
} }
} }

View File

@ -1,19 +1,12 @@
package io.zhile.research.intellij.ier.helper; package io.zhile.research.intellij.ier.helper;
import com.intellij.ide.plugins.IdeaPluginDescriptor;
import com.intellij.ide.plugins.PluginManager;
import com.intellij.ide.plugins.cl.PluginClassLoader;
import com.intellij.openapi.application.ApplicationNamesInfo; import com.intellij.openapi.application.ApplicationNamesInfo;
import com.intellij.openapi.application.PathManager; import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.extensions.PluginId;
import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.FileUtil;
public class Constants { public class Constants {
public static final PluginClassLoader CLASS_LOADER = (PluginClassLoader) Constants.class.getClassLoader(); public static final String ACTION_NAME = "Eval Reset";
public static final PluginId PLUGIN_ID = CLASS_LOADER.getPluginId(); public static final String PLUGIN_ID_STR = "io.zhile.research.ide-eval-resetter";
public static final IdeaPluginDescriptor PLUGIN_DESC = PluginManager.getPlugin(PLUGIN_ID);
public static final String PLUGIN_NAME = PLUGIN_DESC.getName();
public static final String PLUGIN_VERSION = PLUGIN_DESC.getVersion();
public static final String IDE_NAME = ApplicationNamesInfo.getInstance().getProductName(); public static final String IDE_NAME = ApplicationNamesInfo.getInstance().getProductName();
public static final String IDE_NAME_LOWER = IDE_NAME.toLowerCase(); public static final String IDE_NAME_LOWER = IDE_NAME.toLowerCase();
public static final String IDE_HASH = Integer.toHexString(FileUtil.pathHashCode(PathManager.getHomePath())); public static final String IDE_HASH = Integer.toHexString(FileUtil.pathHashCode(PathManager.getHomePath()));

View File

@ -17,7 +17,7 @@ public class CustomRepository {
hosts.add(host); hosts.add(host);
Method method = Reflection.getMethod(UpdateSettings.class, "setThirdPartyPluginsAllowed", boolean.class); Method method = ReflectionHelper.getMethod(UpdateSettings.class, "setThirdPartyPluginsAllowed", boolean.class);
if (method != null) { if (method != null) {
try { try {
method.invoke(UpdateSettings.getInstance(), true); method.invoke(UpdateSettings.getInstance(), true);

View File

@ -9,11 +9,11 @@ import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
public class NotificationHelper { public class NotificationHelper {
public static final NotificationGroup NOTIFICATION_GROUP = new NotificationGroup(Constants.PLUGIN_ID.getIdString(), NotificationDisplayType.BALLOON, true, null, AllIcons.General.Reset); public static final NotificationGroup NOTIFICATION_GROUP = new NotificationGroup(Constants.PLUGIN_ID_STR, NotificationDisplayType.BALLOON, true, null, AllIcons.General.Reset);
public static Notification show(@Nullable Project project, String title, String subtitle, String content, NotificationType type) { public static Notification show(@Nullable Project project, String title, String subtitle, String content, NotificationType type) {
if (title == null) { if (title == null) {
title = Constants.PLUGIN_NAME; title = PluginHelper.getPluginName();
} }
Notification notification = NOTIFICATION_GROUP.createNotification(title, subtitle, content, type); Notification notification = NOTIFICATION_GROUP.createNotification(title, subtitle, content, type);

View File

@ -0,0 +1,25 @@
package io.zhile.research.intellij.ier.helper;
import com.intellij.ide.plugins.IdeaPluginDescriptor;
import com.intellij.ide.plugins.PluginManager;
import com.intellij.openapi.extensions.PluginId;
public class PluginHelper {
private static final IdeaPluginDescriptor PLUGIN_DESCRIPTOR = PluginManager.getPlugin(getPluginId());
public static PluginId getPluginId() {
return PluginId.getId(Constants.PLUGIN_ID_STR);
}
public static IdeaPluginDescriptor getPluginDescriptor() {
return PLUGIN_DESCRIPTOR;
}
public static String getPluginName() {
return PLUGIN_DESCRIPTOR == null ? "UNKNOWN" : PLUGIN_DESCRIPTOR.getName();
}
public static String getPluginVersion() {
return PLUGIN_DESCRIPTOR == null ? "UNKNOWN" : PLUGIN_DESCRIPTOR.getVersion();
}
}

View File

@ -2,7 +2,7 @@ package io.zhile.research.intellij.ier.helper;
import java.lang.reflect.Method; import java.lang.reflect.Method;
public class Reflection { public class ReflectionHelper {
public static Method getMethod(Class<?> klass, String methodName, Class<?>... methodParameterTypes) { public static Method getMethod(Class<?> klass, String methodName, Class<?>... methodParameterTypes) {
try { try {
return klass.getMethod(methodName, methodParameterTypes); return klass.getMethod(methodName, methodParameterTypes);

View File

@ -3,7 +3,12 @@ package io.zhile.research.intellij.ier.listener;
import com.intellij.ide.plugins.DynamicPluginListener; import com.intellij.ide.plugins.DynamicPluginListener;
import com.intellij.ide.plugins.IdeaPluginDescriptor; import com.intellij.ide.plugins.IdeaPluginDescriptor;
import com.intellij.openapi.actionSystem.ActionManager; import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.wm.ToolWindowManager;
import io.zhile.research.intellij.ier.component.ResetTimer;
import io.zhile.research.intellij.ier.helper.Constants;
import io.zhile.research.intellij.ier.helper.NotificationHelper; import io.zhile.research.intellij.ier.helper.NotificationHelper;
import io.zhile.research.intellij.ier.helper.ProjectHelper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class PluginListener implements DynamicPluginListener { public class PluginListener implements DynamicPluginListener {
@ -13,4 +18,16 @@ public class PluginListener implements DynamicPluginListener {
NotificationHelper.showInfo(null, "Plugin installed successfully! Now enjoy it~"); NotificationHelper.showInfo(null, "Plugin installed successfully! Now enjoy it~");
} }
@Override
public void beforePluginUnload(@NotNull IdeaPluginDescriptor pluginDescriptor, boolean isUpdate) {
ResetTimer.stop();
Project project = ProjectHelper.getCurrentProject();
if (project == null) {
return;
}
ToolWindowManager.getInstance(project).unregisterToolWindow(Constants.ACTION_NAME);
}
} }

View File

@ -7,7 +7,7 @@ import com.intellij.openapi.ui.Messages;
import io.zhile.research.intellij.ier.common.EvalRecord; import io.zhile.research.intellij.ier.common.EvalRecord;
import io.zhile.research.intellij.ier.common.Resetter; import io.zhile.research.intellij.ier.common.Resetter;
import io.zhile.research.intellij.ier.component.ResetTimer; import io.zhile.research.intellij.ier.component.ResetTimer;
import io.zhile.research.intellij.ier.helper.Constants; import io.zhile.research.intellij.ier.helper.PluginHelper;
import io.zhile.research.intellij.ier.listener.AppEventListener; import io.zhile.research.intellij.ier.listener.AppEventListener;
import javax.swing.*; import javax.swing.*;
@ -38,7 +38,7 @@ public class MainForm {
boldFont(lblLastResetTimeLabel); boldFont(lblLastResetTimeLabel);
reloadLastResetTime(); reloadLastResetTime();
lblVersion.setText("v" + Constants.PLUGIN_VERSION); lblVersion.setText("v" + PluginHelper.getPluginVersion());
chkResetAuto.setSelected(Resetter.isAutoReset()); chkResetAuto.setSelected(Resetter.isAutoReset());
chkResetAuto.addActionListener(new AbstractAction() { chkResetAuto.addActionListener(new AbstractAction() {
@ -88,7 +88,7 @@ public class MainForm {
} }
private void resetEvalItems() { private void resetEvalItems() {
if (Messages.YES != Messages.showYesNoDialog("Your IDE will restart after reset!\nAre your sure to reset?", Constants.PLUGIN_NAME, AllIcons.General.Reset)) { if (Messages.YES != Messages.showYesNoDialog("Your IDE will restart after reset!\nAre your sure to reset?", PluginHelper.getPluginName(), AllIcons.General.Reset)) {
return; return;
} }