From c72fa6e666da23434cd64fc45488aeb1d85c1d49 Mon Sep 17 00:00:00 2001 From: Nazmul Idris Date: Sat, 5 Sep 2020 19:56:15 -0700 Subject: [PATCH 1/2] Migrate plugin to be dynamic JetBrains has deprecated components to make IDE startup more performant. The commit migrates the DarkModeSync component into a service and post startup activity. Here are some links from JetBrains docs about dynamic plugin migrations. - https://www.jetbrains.org/intellij/sdk/docs/basics/plugin_structure/dynamic_plugins.html - https://jetbrains.org/intellij/sdk/docs/basics/plugin_structure/plugin_components.html --- .../github/gilday/darkmode/DarkModeSync.java | 28 ++++++++++++++----- src/main/resources/META-INF/plugin.xml | 5 ++-- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/github/gilday/darkmode/DarkModeSync.java b/src/main/java/com/github/gilday/darkmode/DarkModeSync.java index 64a0386..ecacbb0 100644 --- a/src/main/java/com/github/gilday/darkmode/DarkModeSync.java +++ b/src/main/java/com/github/gilday/darkmode/DarkModeSync.java @@ -9,6 +9,8 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.startup.StartupActivity; import com.intellij.openapi.util.SystemInfo; import com.intellij.util.Alarm; import com.intellij.util.Alarm.ThreadToUse; @@ -16,6 +18,7 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import javax.swing.UIManager.LookAndFeelInfo; +import org.jetbrains.annotations.NotNull; /** * Application component which sets IDEA's theme to Darcula when it detects that macOS is in Dark @@ -26,16 +29,27 @@ */ public final class DarkModeSync implements Disposable { - private final ScheduledFuture scheduledFuture; + private ScheduledFuture scheduledFuture; - private final LafManager lafManager; - private final DarkModeSyncThemes themes; - private final Alarm updateOnUIThreadAlarm; + private LafManager lafManager; + private DarkModeSyncThemes themes; + private Alarm updateOnUIThreadAlarm; - /** @param lafManager IDEA look-and-feel manager for getting and setting the current theme */ - public DarkModeSync(final LafManager lafManager) { + private static final class MyStartupActivity implements StartupActivity.DumbAware { + @Override + public void runActivity(@NotNull Project project) { + getInstance(project).onStartup(); + } + } + + public static DarkModeSync getInstance(@NotNull Project project) { + return project.getService(DarkModeSync.class); + } + + public void onStartup(){ themes = ServiceManager.getService(DarkModeSyncThemes.class); - this.lafManager = lafManager; + // lafManager IDEA look-and-feel manager for getting and setting the current theme + this.lafManager = LafManager.getInstance(); // Checks if OS is Windows or MacOS if (!(SystemInfo.isMacOSMojave || SystemInfo.isWin10OrNewer)) { logger.error("Plugin only supports macOS Mojave and greater or Windows 10 and greater"); diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index ee4fa85..f5df211 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -30,11 +30,10 @@ com.intellij.modules.platform - - com.github.gilday.darkmode.DarkModeSync - + + From 47323eb5c35c934e702e1e3180e96b9b38377491 Mon Sep 17 00:00:00 2001 From: Nazmul Idris Date: Wed, 9 Sep 2020 20:04:06 -0700 Subject: [PATCH 2/2] Migrate plugin to be dynamic Instead of using StartupActivity, use AppLifecycleListener and make the DarkModeSync class a singleton. --- .../github/gilday/darkmode/DarkModeSync.java | 29 +++++++++++++------ src/main/resources/META-INF/plugin.xml | 6 +++- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/github/gilday/darkmode/DarkModeSync.java b/src/main/java/com/github/gilday/darkmode/DarkModeSync.java index ecacbb0..7d9419f 100644 --- a/src/main/java/com/github/gilday/darkmode/DarkModeSync.java +++ b/src/main/java/com/github/gilday/darkmode/DarkModeSync.java @@ -4,6 +4,7 @@ import static com.github.gilday.darkmode.DarkModeDetector.isWindowsDarkMode; import com.intellij.concurrency.JobScheduler; +import com.intellij.ide.AppLifecycleListener; import com.intellij.ide.actions.QuickChangeLookAndFeel; import com.intellij.ide.ui.LafManager; import com.intellij.openapi.Disposable; @@ -19,6 +20,7 @@ import java.util.concurrent.TimeUnit; import javax.swing.UIManager.LookAndFeelInfo; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * Application component which sets IDEA's theme to Darcula when it detects that macOS is in Dark @@ -27,23 +29,32 @@ *

Schedules a background job for polling macOS Dark Mode configuration and updating IDEA * configuration accordingly. */ -public final class DarkModeSync implements Disposable { +public final class DarkModeSync { + private static DarkModeSync myInstance; private ScheduledFuture scheduledFuture; private LafManager lafManager; private DarkModeSyncThemes themes; private Alarm updateOnUIThreadAlarm; - private static final class MyStartupActivity implements StartupActivity.DumbAware { + public static final class MyLifecycleListener implements AppLifecycleListener { @Override - public void runActivity(@NotNull Project project) { - getInstance(project).onStartup(); + public void appStarting (@Nullable Project project) { + getInstance().onStartup(); + } + + @Override + public void appWillBeClosed(boolean isRestart) { + getInstance().onClose(); } } - public static DarkModeSync getInstance(@NotNull Project project) { - return project.getService(DarkModeSync.class); + public static DarkModeSync getInstance() { + if (myInstance != null) { + myInstance = new DarkModeSync(); + } + return myInstance; } public void onStartup(){ @@ -61,18 +72,18 @@ public void onStartup(){ scheduledFuture = executor.scheduleWithFixedDelay(this::updateLafIfNecessary, 0, 3, TimeUnit.SECONDS); // initialize this last because it publishes "this" - updateOnUIThreadAlarm = new Alarm(ThreadToUse.SWING_THREAD, this); + updateOnUIThreadAlarm = new Alarm(ThreadToUse.SWING_THREAD); } /** cancels the scheduled task if one exists */ - @Override - public void dispose() { + public void onClose() { if (scheduledFuture != null) { scheduledFuture.cancel(true); } if (updateOnUIThreadAlarm != null) { updateOnUIThreadAlarm.cancelAllRequests(); } + myInstance = null; } private void updateLafIfNecessary() { diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index f5df211..cc68259 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -32,9 +32,13 @@ - + + +