From dcbccbb01b16a1cea4722a1954f79f75fc3ad508 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Thu, 7 Jun 2018 10:36:28 +0200 Subject: [PATCH 1/7] Move rs-client related classes to own package To properly differentiate between client loading logic, move these classes to own package. Signed-off-by: Tomas Slusny --- .../java/net/runelite/client/RuneLite.java | 14 +++++++----- .../ClientConfigLoader.java} | 4 ++-- .../client/{ => rs}/ClientLoader.java | 22 +++++++++---------- .../ClientUpdateCheckMode.java} | 4 ++-- .../net/runelite/client/{ => rs}/RSStub.java | 10 ++++----- .../ClientConfigLoaderTest.java} | 7 +++--- 6 files changed, 32 insertions(+), 29 deletions(-) rename runelite-client/src/main/java/net/runelite/client/{ConfigLoader.java => rs/ClientConfigLoader.java} (98%) rename runelite-client/src/main/java/net/runelite/client/{ => rs}/ClientLoader.java (83%) rename runelite-client/src/main/java/net/runelite/client/{UpdateCheckMode.java => rs/ClientUpdateCheckMode.java} (95%) rename runelite-client/src/main/java/net/runelite/client/{ => rs}/RSStub.java (91%) rename runelite-client/src/test/java/net/runelite/client/{ConfigLoaderTest.java => rs/ClientConfigLoaderTest.java} (91%) diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index e50d087203..569b4661a1 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -52,6 +52,8 @@ import net.runelite.client.game.ClanManager; import net.runelite.client.game.ItemManager; import net.runelite.client.menus.MenuManager; import net.runelite.client.plugins.PluginManager; +import net.runelite.client.rs.ClientLoader; +import net.runelite.client.rs.ClientUpdateCheckMode; import net.runelite.client.ui.ClientUI; import net.runelite.client.ui.DrawManager; import net.runelite.client.ui.TitleToolbar; @@ -150,15 +152,15 @@ public class RuneLite parser.accepts("developer-mode", "Enable developer tools"); parser.accepts("debug", "Show extra debugging output"); - final ArgumentAcceptingOptionSpec updateMode = parser + final ArgumentAcceptingOptionSpec updateMode = parser .accepts("rs", "Select client type") .withRequiredArg() - .ofType(UpdateCheckMode.class) - .defaultsTo(UpdateCheckMode.AUTO) - .withValuesConvertedBy(new EnumConverter(UpdateCheckMode.class) + .ofType(ClientUpdateCheckMode.class) + .defaultsTo(ClientUpdateCheckMode.AUTO) + .withValuesConvertedBy(new EnumConverter(ClientUpdateCheckMode.class) { @Override - public UpdateCheckMode convert(String v) + public ClientUpdateCheckMode convert(String v) { return super.convert(v.toUpperCase()); } @@ -207,7 +209,7 @@ public class RuneLite injector.getInstance(RuneLite.class).start(getOptions().valueOf(updateMode)); } - public void start(UpdateCheckMode updateMode) throws Exception + public void start(ClientUpdateCheckMode updateMode) throws Exception { // Load RuneLite or Vanilla client final Applet client = new ClientLoader().loadRs(updateMode); diff --git a/runelite-client/src/main/java/net/runelite/client/ConfigLoader.java b/runelite-client/src/main/java/net/runelite/client/rs/ClientConfigLoader.java similarity index 98% rename from runelite-client/src/main/java/net/runelite/client/ConfigLoader.java rename to runelite-client/src/main/java/net/runelite/client/rs/ClientConfigLoader.java index e5581ad148..aa5b6a7d2f 100644 --- a/runelite-client/src/main/java/net/runelite/client/ConfigLoader.java +++ b/runelite-client/src/main/java/net/runelite/client/rs/ClientConfigLoader.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client; +package net.runelite.client.rs; import java.io.BufferedReader; import java.io.IOException; @@ -34,7 +34,7 @@ import okhttp3.HttpUrl; import okhttp3.Request; import okhttp3.Response; -public class ConfigLoader +public class ClientConfigLoader { private static final HttpUrl CONFIG_URL = HttpUrl.parse("http://oldschool.runescape.com/jav_config.ws"); // https redirects us to rs3 diff --git a/runelite-client/src/main/java/net/runelite/client/ClientLoader.java b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java similarity index 83% rename from runelite-client/src/main/java/net/runelite/client/ClientLoader.java rename to runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java index ef657e5bdf..34125a8aca 100644 --- a/runelite-client/src/main/java/net/runelite/client/ClientLoader.java +++ b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client; +package net.runelite.client.rs; import java.applet.Applet; import java.io.IOException; @@ -34,14 +34,14 @@ import net.runelite.http.api.updatecheck.UpdateCheckClient; @Slf4j public class ClientLoader { - public Applet loadRs(UpdateCheckMode updateMode) + public Applet loadRs(ClientUpdateCheckMode updateMode) { - if (updateMode == UpdateCheckMode.AUTO) + if (updateMode == ClientUpdateCheckMode.AUTO) { final UpdateCheckClient updateCheck = new UpdateCheckClient(); updateMode = updateCheck.isOutdated() ? - UpdateCheckMode.VANILLA : - UpdateCheckMode.RUNELITE; + ClientUpdateCheckMode.VANILLA : + ClientUpdateCheckMode.RUNELITE; } try @@ -74,11 +74,11 @@ public class ClientLoader private Applet loadRuneLite() throws ClassNotFoundException, IOException, InstantiationException, IllegalAccessException { - ConfigLoader config = new ConfigLoader(); + ClientConfigLoader config = new ClientConfigLoader(); config.fetch(); - String initialClass = config.getProperty(ConfigLoader.INITIAL_CLASS).replace(".class", ""); + String initialClass = config.getProperty(ClientConfigLoader.INITIAL_CLASS).replace(".class", ""); // the injected client is a runtime scoped dependency Class clientClass = this.getClass().getClassLoader().loadClass(initialClass); @@ -91,13 +91,13 @@ public class ClientLoader private Applet loadVanilla() throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException { - ConfigLoader config = new ConfigLoader(); + ClientConfigLoader config = new ClientConfigLoader(); config.fetch(); - String codebase = config.getProperty(ConfigLoader.CODEBASE); - String initialJar = config.getProperty(ConfigLoader.INITIAL_JAR); - String initialClass = config.getProperty(ConfigLoader.INITIAL_CLASS).replace(".class", ""); + String codebase = config.getProperty(ClientConfigLoader.CODEBASE); + String initialJar = config.getProperty(ClientConfigLoader.INITIAL_JAR); + String initialClass = config.getProperty(ClientConfigLoader.INITIAL_CLASS).replace(".class", ""); URL url = new URL(codebase + initialJar); diff --git a/runelite-client/src/main/java/net/runelite/client/UpdateCheckMode.java b/runelite-client/src/main/java/net/runelite/client/rs/ClientUpdateCheckMode.java similarity index 95% rename from runelite-client/src/main/java/net/runelite/client/UpdateCheckMode.java rename to runelite-client/src/main/java/net/runelite/client/rs/ClientUpdateCheckMode.java index 06abaaa07d..4957089162 100644 --- a/runelite-client/src/main/java/net/runelite/client/UpdateCheckMode.java +++ b/runelite-client/src/main/java/net/runelite/client/rs/ClientUpdateCheckMode.java @@ -22,9 +22,9 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client; +package net.runelite.client.rs; -public enum UpdateCheckMode +public enum ClientUpdateCheckMode { AUTO, NONE, diff --git a/runelite-client/src/main/java/net/runelite/client/RSStub.java b/runelite-client/src/main/java/net/runelite/client/rs/RSStub.java similarity index 91% rename from runelite-client/src/main/java/net/runelite/client/RSStub.java rename to runelite-client/src/main/java/net/runelite/client/rs/RSStub.java index 24bba2a05d..06076879a3 100644 --- a/runelite-client/src/main/java/net/runelite/client/RSStub.java +++ b/runelite-client/src/main/java/net/runelite/client/rs/RSStub.java @@ -23,7 +23,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client; +package net.runelite.client.rs; import java.applet.AppletContext; import java.applet.AppletStub; @@ -32,9 +32,9 @@ import java.net.URL; public class RSStub implements AppletStub { - private final ConfigLoader config; + private final ClientConfigLoader config; - public RSStub(ConfigLoader config) + public RSStub(ClientConfigLoader config) { this.config = config; } @@ -56,7 +56,7 @@ public class RSStub implements AppletStub { try { - return new URL(config.getProperty(ConfigLoader.CODEBASE)); + return new URL(config.getProperty(ClientConfigLoader.CODEBASE)); } catch (MalformedURLException ex) { @@ -81,5 +81,5 @@ public class RSStub implements AppletStub { } - + } diff --git a/runelite-client/src/test/java/net/runelite/client/ConfigLoaderTest.java b/runelite-client/src/test/java/net/runelite/client/rs/ClientConfigLoaderTest.java similarity index 91% rename from runelite-client/src/test/java/net/runelite/client/ConfigLoaderTest.java rename to runelite-client/src/test/java/net/runelite/client/rs/ClientConfigLoaderTest.java index 8c416dd370..f602822d40 100644 --- a/runelite-client/src/test/java/net/runelite/client/ConfigLoaderTest.java +++ b/runelite-client/src/test/java/net/runelite/client/rs/ClientConfigLoaderTest.java @@ -23,21 +23,22 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client; +package net.runelite.client.rs; import java.io.IOException; +import net.runelite.client.rs.ClientConfigLoader; import org.junit.Test; /** * * @author Adam */ -public class ConfigLoaderTest +public class ClientConfigLoaderTest { @Test public void test() throws IOException { - ConfigLoader loader = new ConfigLoader(); + ClientConfigLoader loader = new ClientConfigLoader(); loader.fetch(); for (String key : loader.getProperties().keySet()) From 0f0ac2ab641ebbe6d74e6a8630baff1cff1c75a7 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Thu, 7 Jun 2018 10:44:10 +0200 Subject: [PATCH 2/7] Allow RS loading classes to be used with Guice - Provide OkHttpClient through Guice instead of using it from static variable - Chain the RS classes with Guice and inject ClientLoader to RuneLite class - Cleanup RS loading classes a bit Signed-off-by: Tomas Slusny --- .../java/net/runelite/client/RuneLite.java | 6 +- .../net/runelite/client/RuneLiteModule.java | 3 + .../client/rs/ClientConfigLoader.java | 85 ++++++-------- .../net/runelite/client/rs/ClientLoader.java | 106 +++++++++--------- .../rs/{RSStub.java => RSAppletStub.java} | 21 ++-- .../java/net/runelite/client/rs/RSConfig.java | 52 +++++++++ .../client/rs/ClientConfigLoaderTest.java | 18 +-- 7 files changed, 166 insertions(+), 125 deletions(-) rename runelite-client/src/main/java/net/runelite/client/rs/{RSStub.java => RSAppletStub.java} (87%) create mode 100644 runelite-client/src/main/java/net/runelite/client/rs/RSConfig.java diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index 569b4661a1..5e215be011 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -130,6 +130,9 @@ public class RuneLite @Inject private InfoBoxManager infoBoxManager; + @Inject + private ClientLoader clientLoader; + @Inject private OverlayManager overlayManager; @@ -212,7 +215,8 @@ public class RuneLite public void start(ClientUpdateCheckMode updateMode) throws Exception { // Load RuneLite or Vanilla client - final Applet client = new ClientLoader().loadRs(updateMode); + clientLoader.setUpdateCheckMode(updateMode); + final Applet client = clientLoader.load(); final boolean isOutdated = !(client instanceof Client); diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java b/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java index 79ed0173d2..0960183ec4 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java @@ -49,6 +49,8 @@ import net.runelite.client.util.DeferredEventBus; import net.runelite.client.util.QueryRunner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import net.runelite.http.api.RuneLiteAPI; +import okhttp3.OkHttpClient; @Slf4j public class RuneLiteModule extends AbstractModule @@ -57,6 +59,7 @@ public class RuneLiteModule extends AbstractModule protected void configure() { bind(ScheduledExecutorService.class).toInstance(Executors.newSingleThreadScheduledExecutor()); + bind(OkHttpClient.class).toInstance(RuneLiteAPI.CLIENT); bind(QueryRunner.class); bind(MenuManager.class); bind(ChatMessageManager.class); diff --git a/runelite-client/src/main/java/net/runelite/client/rs/ClientConfigLoader.java b/runelite-client/src/main/java/net/runelite/client/rs/ClientConfigLoader.java index aa5b6a7d2f..9d3804ebab 100644 --- a/runelite-client/src/main/java/net/runelite/client/rs/ClientConfigLoader.java +++ b/runelite-client/src/main/java/net/runelite/client/rs/ClientConfigLoader.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2016-2017, Adam + * Copyright (c) 2018, Tomas Slusny * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -24,35 +25,39 @@ */ package net.runelite.client.rs; +import com.google.common.annotations.VisibleForTesting; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; -import java.util.HashMap; -import java.util.Map; -import net.runelite.http.api.RuneLiteAPI; -import okhttp3.HttpUrl; +import javax.inject.Inject; +import javax.inject.Singleton; +import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; -public class ClientConfigLoader +@Singleton +class ClientConfigLoader { - private static final HttpUrl CONFIG_URL = HttpUrl.parse("http://oldschool.runescape.com/jav_config.ws"); // https redirects us to rs3 + private static final String CONFIG_URL = "http://oldschool.runescape.com/jav_config.ws"; + private final OkHttpClient httpClient; - public static final String CODEBASE = "codebase"; - public static final String INITIAL_JAR = "initial_jar"; - public static final String INITIAL_CLASS = "initial_class"; - - private final Map properties = new HashMap<>(), - appletProperties = new HashMap<>(); - - public void fetch() throws IOException + @Inject + @VisibleForTesting + ClientConfigLoader(final OkHttpClient httpClient) { - Request request = new Request.Builder() + this.httpClient = httpClient; + } + + RSConfig fetch() throws IOException + { + final Request request = new Request.Builder() .url(CONFIG_URL) .build(); - try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute(); - BufferedReader in = new BufferedReader(new InputStreamReader(response.body().byteStream()))) + final RSConfig config = new RSConfig(); + + try (final Response response = httpClient.newCall(request).execute(); final BufferedReader in = new BufferedReader( + new InputStreamReader(response.body().byteStream()))) { String str; @@ -67,43 +72,25 @@ public class ClientConfigLoader String s = str.substring(0, idx); - if (s.equals("param")) + switch (s) { - str = str.substring(idx + 1); - idx = str.indexOf('='); - s = str.substring(0, idx); + case "param": + str = str.substring(idx + 1); + idx = str.indexOf('='); + s = str.substring(0, idx); - appletProperties.put(s, str.substring(idx + 1)); - } - else if (s.equals("msg")) - { - // ignore - } - else - { - properties.put(s, str.substring(idx + 1)); + config.getAppletProperties().put(s, str.substring(idx + 1)); + break; + case "msg": + // ignore + break; + default: + config.getClassLoaderProperties().put(s, str.substring(idx + 1)); + break; } } } - } - public String getProperty(String name) - { - return properties.get(name); - } - - public Map getProperties() - { - return properties; - } - - public String getAppletProperty(String name) - { - return appletProperties.get(name); - } - - public Map getAppletProperties() - { - return appletProperties; + return config; } } diff --git a/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java index 34125a8aca..066a1a733f 100644 --- a/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java +++ b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2016-2017, Adam + * Copyright (c) 2018, Tomas Slusny * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -28,31 +29,70 @@ import java.applet.Applet; import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; +import javax.inject.Inject; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import net.runelite.http.api.updatecheck.UpdateCheckClient; @Slf4j public class ClientLoader { - public Applet loadRs(ClientUpdateCheckMode updateMode) - { - if (updateMode == ClientUpdateCheckMode.AUTO) - { - final UpdateCheckClient updateCheck = new UpdateCheckClient(); - updateMode = updateCheck.isOutdated() ? - ClientUpdateCheckMode.VANILLA : - ClientUpdateCheckMode.RUNELITE; - } + private final UpdateCheckClient updateCheckClient = new UpdateCheckClient(); + private final ClientConfigLoader clientConfigLoader; + @Setter + private ClientUpdateCheckMode updateCheckMode = ClientUpdateCheckMode.AUTO; + + @Inject + private ClientLoader(final ClientConfigLoader clientConfigLoader) + { + this.clientConfigLoader = clientConfigLoader; + } + + private static Applet loadRuneLite(final RSConfig config) throws ClassNotFoundException, InstantiationException, IllegalAccessException + { + // the injected client is a runtime scoped dependency + final Class clientClass = ClientLoader.class.getClassLoader().loadClass(config.getInitialClass()); + return loadFromClass(config, clientClass); + } + + private static Applet loadVanilla(final RSConfig config) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException + { + final String codebase = config.getCodeBase(); + final String initialJar = config.getInitialJar(); + final String initialClass = config.getInitialClass(); + final URL url = new URL(codebase + initialJar); + + // Must set parent classloader to null, or it will pull from + // this class's classloader first + final URLClassLoader classloader = new URLClassLoader(new URL[]{url}, null); + final Class clientClass = classloader.loadClass(initialClass); + return loadFromClass(config, clientClass); + } + + private static Applet loadFromClass(final RSConfig config, final Class clientClass) throws IllegalAccessException, InstantiationException + { + final Applet rs = (Applet) clientClass.newInstance(); + rs.setStub(new RSAppletStub(config)); + return rs; + } + + public Applet load() + { try { + final RSConfig config = clientConfigLoader.fetch(); + final ClientUpdateCheckMode updateMode = updateCheckMode == ClientUpdateCheckMode.AUTO + ? updateCheckClient.isOutdated() ? ClientUpdateCheckMode.VANILLA : ClientUpdateCheckMode.RUNELITE + : updateCheckMode; + switch (updateMode) { case RUNELITE: - return loadRuneLite(); + return loadRuneLite(config); default: case VANILLA: - return loadVanilla(); + return loadVanilla(config); case NONE: return null; } @@ -71,48 +111,4 @@ public class ClientLoader return null; } } - - private Applet loadRuneLite() throws ClassNotFoundException, IOException, InstantiationException, IllegalAccessException - { - ClientConfigLoader config = new ClientConfigLoader(); - - config.fetch(); - - String initialClass = config.getProperty(ClientConfigLoader.INITIAL_CLASS).replace(".class", ""); - - // the injected client is a runtime scoped dependency - Class clientClass = this.getClass().getClassLoader().loadClass(initialClass); - Applet rs = (Applet) clientClass.newInstance(); - - rs.setStub(new RSStub(config)); - - return rs; - } - - private Applet loadVanilla() throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException - { - ClientConfigLoader config = new ClientConfigLoader(); - - config.fetch(); - - String codebase = config.getProperty(ClientConfigLoader.CODEBASE); - String initialJar = config.getProperty(ClientConfigLoader.INITIAL_JAR); - String initialClass = config.getProperty(ClientConfigLoader.INITIAL_CLASS).replace(".class", ""); - - URL url = new URL(codebase + initialJar); - - // Must set parent classloader to null, or it will pull from - // this class's classloader first - URLClassLoader classloader = new URLClassLoader(new URL[] - { - url - }, null); - - Class clientClass = classloader.loadClass(initialClass); - Applet rs = (Applet) clientClass.newInstance(); - - rs.setStub(new RSStub(config)); - - return rs; - } } diff --git a/runelite-client/src/main/java/net/runelite/client/rs/RSStub.java b/runelite-client/src/main/java/net/runelite/client/rs/RSAppletStub.java similarity index 87% rename from runelite-client/src/main/java/net/runelite/client/rs/RSStub.java rename to runelite-client/src/main/java/net/runelite/client/rs/RSAppletStub.java index 06076879a3..a3a2a0f14a 100644 --- a/runelite-client/src/main/java/net/runelite/client/rs/RSStub.java +++ b/runelite-client/src/main/java/net/runelite/client/rs/RSAppletStub.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2016-2017, Adam + * Copyright (c) 2018, Tomas Slusny * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,22 +23,18 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - package net.runelite.client.rs; import java.applet.AppletContext; import java.applet.AppletStub; import java.net.MalformedURLException; import java.net.URL; +import lombok.RequiredArgsConstructor; -public class RSStub implements AppletStub +@RequiredArgsConstructor +class RSAppletStub implements AppletStub { - private final ClientConfigLoader config; - - public RSStub(ClientConfigLoader config) - { - this.config = config; - } + private final RSConfig config; @Override public boolean isActive() @@ -56,7 +53,7 @@ public class RSStub implements AppletStub { try { - return new URL(config.getProperty(ClientConfigLoader.CODEBASE)); + return new URL(config.getCodeBase()); } catch (MalformedURLException ex) { @@ -67,7 +64,7 @@ public class RSStub implements AppletStub @Override public String getParameter(String name) { - return config.getAppletProperty(name); + return config.getAppletProperties().get(name); } @Override @@ -79,7 +76,5 @@ public class RSStub implements AppletStub @Override public void appletResize(int width, int height) { - } - -} +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/rs/RSConfig.java b/runelite-client/src/main/java/net/runelite/client/rs/RSConfig.java new file mode 100644 index 0000000000..e0c5539323 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/rs/RSConfig.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2016-2017, Adam + * Copyright (c) 2018, Tomas Slusny + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.rs; + +import java.util.HashMap; +import java.util.Map; +import lombok.Getter; + +@Getter +class RSConfig +{ + private final Map appletProperties = new HashMap<>(); + private final Map classLoaderProperties = new HashMap<>(); + + String getCodeBase() + { + return classLoaderProperties.get("codebase"); + } + + String getInitialJar() + { + return classLoaderProperties.get("initial_jar"); + } + + String getInitialClass() + { + return classLoaderProperties.get("initial_class").replace(".class", ""); + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/rs/ClientConfigLoaderTest.java b/runelite-client/src/test/java/net/runelite/client/rs/ClientConfigLoaderTest.java index f602822d40..719998d407 100644 --- a/runelite-client/src/test/java/net/runelite/client/rs/ClientConfigLoaderTest.java +++ b/runelite-client/src/test/java/net/runelite/client/rs/ClientConfigLoaderTest.java @@ -26,7 +26,7 @@ package net.runelite.client.rs; import java.io.IOException; -import net.runelite.client.rs.ClientConfigLoader; +import okhttp3.OkHttpClient; import org.junit.Test; /** @@ -38,16 +38,20 @@ public class ClientConfigLoaderTest @Test public void test() throws IOException { - ClientConfigLoader loader = new ClientConfigLoader(); - loader.fetch(); + final ClientConfigLoader loader = new ClientConfigLoader(new OkHttpClient()); + final RSConfig config = loader.fetch(); - for (String key : loader.getProperties().keySet()) - System.out.println(key + ": " + loader.getProperty(key)); + for (String key : config.getClassLoaderProperties().keySet()) + { + System.out.println(key + ": " + config.getClassLoaderProperties().get(key)); + } System.out.println("Applet properties:"); - for (String key : loader.getAppletProperties().keySet()) - System.out.println(key + ": " + loader.getAppletProperty(key)); + for (String key : config.getAppletProperties().keySet()) + { + System.out.println(key + ": " + config.getAppletProperties().get(key)); + } } } From 8909871554ad49e694127bccab60e9f2595dc693 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Thu, 7 Jun 2018 11:08:39 +0200 Subject: [PATCH 3/7] Inject and load RS client and applet through Guice Instead of requiring to create client from RuneLite just use Guice for it and separate applet provider. Signed-off-by: Tomas Slusny --- .../java/net/runelite/client/RuneLite.java | 36 ++++++++----------- .../net/runelite/client/RuneLiteModule.java | 15 ++++++-- .../net/runelite/client/rs/ClientLoader.java | 2 ++ .../client/plugins/PluginManagerTest.java | 20 +++++------ 4 files changed, 40 insertions(+), 33 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index 5e215be011..8415661130 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -31,10 +31,11 @@ import com.google.common.eventbus.EventBus; import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.Injector; -import com.google.inject.Provider; import java.applet.Applet; import java.io.File; import java.util.Locale; +import javax.annotation.Nullable; +import javax.inject.Provider; import javax.inject.Singleton; import joptsimple.ArgumentAcceptingOptionSpec; import joptsimple.OptionParser; @@ -130,9 +131,6 @@ public class RuneLite @Inject private InfoBoxManager infoBoxManager; - @Inject - private ClientLoader clientLoader; - @Inject private OverlayManager overlayManager; @@ -145,7 +143,13 @@ public class RuneLite @Inject private WorldMapOverlay worldMapOverlay; - Client client; + @Inject + @Nullable + private Applet applet; + + @Inject + @Nullable + private Client client; public static void main(String[] args) throws Exception { @@ -209,27 +213,23 @@ public class RuneLite }); injector = Guice.createInjector(new RuneLiteModule()); - injector.getInstance(RuneLite.class).start(getOptions().valueOf(updateMode)); + injector.getInstance(ClientLoader.class).setUpdateCheckMode(getOptions().valueOf(updateMode)); + injector.getInstance(RuneLite.class).start(); } - public void start(ClientUpdateCheckMode updateMode) throws Exception + public void start() throws Exception { // Load RuneLite or Vanilla client - clientLoader.setUpdateCheckMode(updateMode); - final Applet client = clientLoader.load(); - - final boolean isOutdated = !(client instanceof Client); + final boolean isOutdated = client == null; if (!isOutdated) { - this.client = (Client) client; - // Inject members into client injector.injectMembers(client); } // Initialize UI - clientUI.init(client); + clientUI.init(applet); // Initialize Discord service discordService.init(); @@ -246,7 +246,7 @@ public class RuneLite eventBus.register(clanManager); eventBus.register(infoBoxManager); - if (this.client != null) + if (!isOutdated) { eventBus.register(itemManager.get()); } @@ -304,10 +304,4 @@ public class RuneLite { RuneLite.options = options; } - - @VisibleForTesting - public void setClient(Client client) - { - this.client = client; - } } diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java b/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java index 0960183ec4..0d1eb79b5a 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java @@ -29,8 +29,10 @@ import com.google.common.eventbus.SubscriberExceptionContext; import com.google.inject.AbstractModule; import com.google.inject.Provides; import com.google.inject.name.Names; +import java.applet.Applet; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; +import javax.annotation.Nullable; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; @@ -44,6 +46,7 @@ import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.game.ItemManager; import net.runelite.client.menus.MenuManager; import net.runelite.client.plugins.PluginManager; +import net.runelite.client.rs.ClientLoader; import net.runelite.client.task.Scheduler; import net.runelite.client.util.DeferredEventBus; import net.runelite.client.util.QueryRunner; @@ -81,9 +84,17 @@ public class RuneLiteModule extends AbstractModule } @Provides - Client provideClient(RuneLite runeLite) + @Singleton + Applet provideApplet(ClientLoader clientLoader) { - return runeLite.client; + return clientLoader.load(); + } + + @Provides + @Singleton + Client provideClient(@Nullable Applet applet) + { + return applet instanceof Client ? (Client) applet : null; } @Provides diff --git a/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java index 066a1a733f..cc63eb6e9d 100644 --- a/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java +++ b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java @@ -30,11 +30,13 @@ import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; import javax.inject.Inject; +import javax.inject.Singleton; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import net.runelite.http.api.updatecheck.UpdateCheckClient; @Slf4j +@Singleton public class ClientLoader { private final UpdateCheckClient updateCheckClient = new UpdateCheckClient(); diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java index efd2ce9f24..0742113eb5 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java @@ -31,7 +31,9 @@ import com.google.inject.Injector; import com.google.inject.Module; import com.google.inject.grapher.graphviz.GraphvizGrapher; import com.google.inject.grapher.graphviz.GraphvizModule; +import com.google.inject.testing.fieldbinder.Bind; import com.google.inject.testing.fieldbinder.BoundFieldModule; +import java.applet.Applet; import java.io.File; import java.io.IOException; import java.io.PrintWriter; @@ -63,11 +65,15 @@ public class PluginManagerTest @Rule public TemporaryFolder folder = new TemporaryFolder(); - private RuneLite runelite; - private Set pluginClasses; + @Mock + @Bind + public Applet applet; @Mock - Client client; + @Bind + public Client client; + + private Set pluginClasses; @Before public void before() throws IOException @@ -78,8 +84,6 @@ public class PluginManagerTest BoundFieldModule.of(this)); RuneLite.setInjector(injector); - runelite = injector.getInstance(RuneLite.class); - // Find plugins we expect to have pluginClasses = new HashSet<>(); Set classes = ClassPath.from(getClass().getClassLoader()).getTopLevelClassesRecursive(PLUGIN_PACKAGE); @@ -105,12 +109,10 @@ public class PluginManagerTest long expected = pluginClasses.stream() .map(cl -> (PluginDescriptor) cl.getAnnotation(PluginDescriptor.class)) .filter(Objects::nonNull) - .filter(pd -> pd.loadWhenOutdated()) + .filter(PluginDescriptor::loadWhenOutdated) .count(); assertEquals(expected, plugins.size()); - runelite.setClient(client); - pluginManager = new PluginManager(); pluginManager.loadCorePlugins(); plugins = pluginManager.getPlugins(); @@ -130,8 +132,6 @@ public class PluginManagerTest modules.add(new GraphvizModule()); modules.add(new RuneLiteModule()); - runelite.setClient(client); - PluginManager pluginManager = new PluginManager(); pluginManager.loadCorePlugins(); for (Plugin p : pluginManager.getPlugins()) From 66bfbc5648d28591145252677789de8930743f09 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Fri, 6 Jul 2018 11:19:11 +0200 Subject: [PATCH 4/7] Send launch properties around as bound constants Instead of exposing static variable provide launch properties to dependant classes as bound constants in RuneLiteModule. Signed-off-by: Tomas Slusny --- .../java/net/runelite/client/RuneLite.java | 24 +- .../net/runelite/client/RuneLiteModule.java | 12 + .../client/plugins/PluginManager.java | 53 +-- .../net/runelite/client/rs/ClientLoader.java | 11 +- .../runelite/client/RuneLiteModuleTest.java | 5 +- .../client/plugins/PluginManagerTest.java | 306 +++++++++--------- 6 files changed, 213 insertions(+), 198 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index 8415661130..512a3b34a4 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -53,7 +53,6 @@ import net.runelite.client.game.ClanManager; import net.runelite.client.game.ItemManager; import net.runelite.client.menus.MenuManager; import net.runelite.client.plugins.PluginManager; -import net.runelite.client.rs.ClientLoader; import net.runelite.client.rs.ClientUpdateCheckMode; import net.runelite.client.ui.ClientUI; import net.runelite.client.ui.DrawManager; @@ -80,9 +79,6 @@ public class RuneLite @Getter private static Injector injector; - @Getter - private static OptionSet options; - @Inject private PluginManager pluginManager; @@ -174,15 +170,17 @@ public class RuneLite }); parser.accepts("help", "Show this text").forHelp(); - options = parser.parse(args); + OptionSet options = parser.parse(args); - if (getOptions().has("help")) + if (options.has("help")) { parser.printHelpOn(System.out); System.exit(0); } - if (RuneLite.getOptions().has("developer-mode") && RuneLiteProperties.getLauncherVersion() == null) + final boolean developerMode = options.has("developer-mode"); + + if (developerMode && RuneLiteProperties.getLauncherVersion() == null) { boolean assertions = false; assert assertions = true; @@ -212,8 +210,10 @@ public class RuneLite } }); - injector = Guice.createInjector(new RuneLiteModule()); - injector.getInstance(ClientLoader.class).setUpdateCheckMode(getOptions().valueOf(updateMode)); + injector = Guice.createInjector(new RuneLiteModule( + options.valueOf(updateMode), + developerMode)); + injector.getInstance(RuneLite.class).start(); } @@ -298,10 +298,4 @@ public class RuneLite { RuneLite.injector = injector; } - - @VisibleForTesting - public static void setOptions(OptionSet options) - { - RuneLite.options = options; - } } diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java b/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java index 0d1eb79b5a..39d587163b 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java @@ -46,6 +46,7 @@ import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.game.ItemManager; import net.runelite.client.menus.MenuManager; import net.runelite.client.plugins.PluginManager; +import net.runelite.client.rs.ClientUpdateCheckMode; import net.runelite.client.rs.ClientLoader; import net.runelite.client.task.Scheduler; import net.runelite.client.util.DeferredEventBus; @@ -58,9 +59,20 @@ import okhttp3.OkHttpClient; @Slf4j public class RuneLiteModule extends AbstractModule { + private final ClientUpdateCheckMode updateCheckMode; + private final boolean developerMode; + + public RuneLiteModule(final ClientUpdateCheckMode updateCheckMode, final boolean developerMode) + { + this.updateCheckMode = updateCheckMode; + this.developerMode = developerMode; + } + @Override protected void configure() { + bindConstant().annotatedWith(Names.named("updateCheckMode")).to(updateCheckMode); + bindConstant().annotatedWith(Names.named("developerMode")).to(developerMode); bind(ScheduledExecutorService.class).toInstance(Executors.newSingleThreadScheduledExecutor()); bind(OkHttpClient.class).toInstance(RuneLiteAPI.CLIENT); bind(QueryRunner.class); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java index 362bdd290e..a8cd67a04b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java @@ -24,6 +24,7 @@ */ package net.runelite.client.plugins; +import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import com.google.common.eventbus.EventBus; @@ -36,7 +37,6 @@ import com.google.common.reflect.ClassPath; import com.google.common.reflect.ClassPath.ClassInfo; import com.google.inject.Binder; import com.google.inject.CreationException; -import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.Module; @@ -52,6 +52,8 @@ import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.ScheduledExecutorService; import java.util.stream.Collectors; +import javax.inject.Inject; +import javax.inject.Named; import javax.inject.Singleton; import javax.swing.SwingUtilities; import lombok.Setter; @@ -78,29 +80,38 @@ public class PluginManager */ private static final String PLUGIN_PACKAGE = "net.runelite.client.plugins"; - @Inject - EventBus eventBus; - - @Inject - Scheduler scheduler; - - @Inject - ConfigManager configManager; - - @Inject - ScheduledExecutorService executor; - - @Inject - SceneTileManager sceneTileManager; - - @Setter - boolean isOutdated; - + private final boolean developerMode; + private final EventBus eventBus; + private final Scheduler scheduler; + private final ConfigManager configManager; + private final ScheduledExecutorService executor; + private final SceneTileManager sceneTileManager; private final List plugins = new CopyOnWriteArrayList<>(); private final List activePlugins = new CopyOnWriteArrayList<>(); private final String runeliteGroupName = RuneLiteConfig.class .getAnnotation(ConfigGroup.class).value(); + @Setter + boolean isOutdated; + + @Inject + @VisibleForTesting + PluginManager( + @Named("developerMode") final boolean developerMode, + final EventBus eventBus, + final Scheduler scheduler, + final ConfigManager configManager, + final ScheduledExecutorService executor, + final SceneTileManager sceneTileManager) + { + this.developerMode = developerMode; + this.eventBus = eventBus; + this.scheduler = scheduler; + this.configManager = configManager; + this.executor = executor; + this.sceneTileManager = sceneTileManager; + } + @Subscribe public void onSessionOpen(SessionOpen event) { @@ -204,8 +215,6 @@ public class PluginManager List scanAndInstantiate(ClassLoader classLoader, String packageName) throws IOException { - boolean developerPlugins = RuneLite.getOptions().has("developer-mode"); - MutableGraph> graph = GraphBuilder .directed() .build(); @@ -242,7 +251,7 @@ public class PluginManager continue; } - if (pluginDescriptor.developerPlugin() && !developerPlugins) + if (pluginDescriptor.developerPlugin() && !developerMode) { continue; } diff --git a/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java index cc63eb6e9d..bbd8ec4439 100644 --- a/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java +++ b/runelite-client/src/main/java/net/runelite/client/rs/ClientLoader.java @@ -30,8 +30,8 @@ import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; import javax.inject.Inject; +import javax.inject.Named; import javax.inject.Singleton; -import lombok.Setter; import lombok.extern.slf4j.Slf4j; import net.runelite.http.api.updatecheck.UpdateCheckClient; @@ -41,13 +41,14 @@ public class ClientLoader { private final UpdateCheckClient updateCheckClient = new UpdateCheckClient(); private final ClientConfigLoader clientConfigLoader; - - @Setter - private ClientUpdateCheckMode updateCheckMode = ClientUpdateCheckMode.AUTO; + private final ClientUpdateCheckMode updateCheckMode; @Inject - private ClientLoader(final ClientConfigLoader clientConfigLoader) + private ClientLoader( + @Named("updateCheckMode") final ClientUpdateCheckMode updateCheckMode, + final ClientConfigLoader clientConfigLoader) { + this.updateCheckMode = updateCheckMode; this.clientConfigLoader = clientConfigLoader; } diff --git a/runelite-client/src/test/java/net/runelite/client/RuneLiteModuleTest.java b/runelite-client/src/test/java/net/runelite/client/RuneLiteModuleTest.java index 044209c5e4..fbfdf9fbac 100644 --- a/runelite-client/src/test/java/net/runelite/client/RuneLiteModuleTest.java +++ b/runelite-client/src/test/java/net/runelite/client/RuneLiteModuleTest.java @@ -25,6 +25,7 @@ package net.runelite.client; import com.google.inject.Guice; +import net.runelite.client.rs.ClientUpdateCheckMode; import org.junit.Test; public class RuneLiteModuleTest @@ -32,8 +33,6 @@ public class RuneLiteModuleTest @Test public void testConfigure() { - Guice.createInjector(new RuneLiteModule()); + Guice.createInjector(new RuneLiteModule(ClientUpdateCheckMode.AUTO, true)); } - - } diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java index 0742113eb5..0981299754 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java @@ -1,153 +1,153 @@ -/* - * Copyright (c) 2016-2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins; - -import com.google.common.reflect.ClassPath; -import com.google.common.reflect.ClassPath.ClassInfo; -import com.google.inject.Guice; -import com.google.inject.Injector; -import com.google.inject.Module; -import com.google.inject.grapher.graphviz.GraphvizGrapher; -import com.google.inject.grapher.graphviz.GraphvizModule; -import com.google.inject.testing.fieldbinder.Bind; -import com.google.inject.testing.fieldbinder.BoundFieldModule; -import java.applet.Applet; -import java.io.File; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; -import java.util.Set; -import joptsimple.OptionSet; -import net.runelite.api.Client; -import net.runelite.client.RuneLite; -import net.runelite.client.RuneLiteModule; -import static org.junit.Assert.assertEquals; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import static org.mockito.Mockito.mock; -import org.mockito.runners.MockitoJUnitRunner; - -@RunWith(MockitoJUnitRunner.class) -public class PluginManagerTest -{ - private static final String PLUGIN_PACKAGE = "net.runelite.client.plugins"; - - @Rule - public TemporaryFolder folder = new TemporaryFolder(); - - @Mock - @Bind - public Applet applet; - - @Mock - @Bind - public Client client; - - private Set pluginClasses; - - @Before - public void before() throws IOException - { - RuneLite.setOptions(mock(OptionSet.class)); - - Injector injector = Guice.createInjector(new RuneLiteModule(), - BoundFieldModule.of(this)); - RuneLite.setInjector(injector); - - // Find plugins we expect to have - pluginClasses = new HashSet<>(); - Set classes = ClassPath.from(getClass().getClassLoader()).getTopLevelClassesRecursive(PLUGIN_PACKAGE); - for (ClassInfo classInfo : classes) - { - Class clazz = classInfo.load(); - PluginDescriptor pluginDescriptor = clazz.getAnnotation(PluginDescriptor.class); - if (pluginDescriptor != null) - { - pluginClasses.add(clazz); - } - } - - } - - @Test - public void testLoadPlugins() throws Exception - { - PluginManager pluginManager = new PluginManager(); - pluginManager.setOutdated(true); - pluginManager.loadCorePlugins(); - Collection plugins = pluginManager.getPlugins(); - long expected = pluginClasses.stream() - .map(cl -> (PluginDescriptor) cl.getAnnotation(PluginDescriptor.class)) - .filter(Objects::nonNull) - .filter(PluginDescriptor::loadWhenOutdated) - .count(); - assertEquals(expected, plugins.size()); - - pluginManager = new PluginManager(); - pluginManager.loadCorePlugins(); - plugins = pluginManager.getPlugins(); - - expected = pluginClasses.stream() - .map(cl -> (PluginDescriptor) cl.getAnnotation(PluginDescriptor.class)) - .filter(Objects::nonNull) - .filter(pd -> !pd.developerPlugin()) - .count(); - assertEquals(expected, plugins.size()); - } - - @Test - public void dumpGraph() throws Exception - { - List modules = new ArrayList<>(); - modules.add(new GraphvizModule()); - modules.add(new RuneLiteModule()); - - PluginManager pluginManager = new PluginManager(); - pluginManager.loadCorePlugins(); - for (Plugin p : pluginManager.getPlugins()) - { - modules.add(p); - } - - File file = folder.newFile(); - try (PrintWriter out = new PrintWriter(file, "UTF-8")) - { - Injector injector = Guice.createInjector(modules); - GraphvizGrapher grapher = injector.getInstance(GraphvizGrapher.class); - grapher.setOut(out); - grapher.setRankdir("TB"); - grapher.graph(injector); - } - } - -} +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins; + +import com.google.common.reflect.ClassPath; +import com.google.common.reflect.ClassPath.ClassInfo; +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.Module; +import com.google.inject.grapher.graphviz.GraphvizGrapher; +import com.google.inject.grapher.graphviz.GraphvizModule; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import com.google.inject.util.Modules; +import java.applet.Applet; +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import net.runelite.api.Client; +import net.runelite.client.RuneLite; +import net.runelite.client.RuneLiteModule; +import net.runelite.client.rs.ClientUpdateCheckMode; +import static org.junit.Assert.assertEquals; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class PluginManagerTest +{ + private static final String PLUGIN_PACKAGE = "net.runelite.client.plugins"; + + @Rule + public TemporaryFolder folder = new TemporaryFolder(); + + @Mock + @Bind + public Applet applet; + + @Mock + @Bind + public Client client; + + private Set pluginClasses; + + @Before + public void before() throws IOException + { + Injector injector = Guice.createInjector(Modules + .override(new RuneLiteModule(ClientUpdateCheckMode.AUTO, true)) + .with(BoundFieldModule.of(this))); + + RuneLite.setInjector(injector); + + // Find plugins we expect to have + pluginClasses = new HashSet<>(); + Set classes = ClassPath.from(getClass().getClassLoader()).getTopLevelClassesRecursive(PLUGIN_PACKAGE); + for (ClassInfo classInfo : classes) + { + Class clazz = classInfo.load(); + PluginDescriptor pluginDescriptor = clazz.getAnnotation(PluginDescriptor.class); + if (pluginDescriptor != null) + { + pluginClasses.add(clazz); + } + } + + } + + @Test + public void testLoadPlugins() throws Exception + { + PluginManager pluginManager = new PluginManager(false, null, null, null, null, null); + pluginManager.setOutdated(true); + pluginManager.loadCorePlugins(); + Collection plugins = pluginManager.getPlugins(); + long expected = pluginClasses.stream() + .map(cl -> (PluginDescriptor) cl.getAnnotation(PluginDescriptor.class)) + .filter(Objects::nonNull) + .filter(PluginDescriptor::loadWhenOutdated) + .count(); + assertEquals(expected, plugins.size()); + + pluginManager = new PluginManager(false, null, null, null, null, null); + pluginManager.loadCorePlugins(); + plugins = pluginManager.getPlugins(); + + expected = pluginClasses.stream() + .map(cl -> (PluginDescriptor) cl.getAnnotation(PluginDescriptor.class)) + .filter(Objects::nonNull) + .filter(pd -> !pd.developerPlugin()) + .count(); + assertEquals(expected, plugins.size()); + } + + @Test + public void dumpGraph() throws Exception + { + List modules = new ArrayList<>(); + modules.add(new GraphvizModule()); + modules.add(new RuneLiteModule(ClientUpdateCheckMode.AUTO, true)); + + PluginManager pluginManager = new PluginManager(true, null, null, null, null, null); + pluginManager.loadCorePlugins(); + for (Plugin p : pluginManager.getPlugins()) + { + modules.add(p); + } + + File file = folder.newFile(); + try (PrintWriter out = new PrintWriter(file, "UTF-8")) + { + Injector injector = Guice.createInjector(modules); + GraphvizGrapher grapher = injector.getInstance(GraphvizGrapher.class); + grapher.setOut(out); + grapher.setRankdir("TB"); + grapher.graph(injector); + } + } + +} From 53148d0cdd9dd6bd9590da8f7fcf1ebdb8aac996 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Thu, 7 Jun 2018 11:27:30 +0200 Subject: [PATCH 5/7] Remove recursive dependency on RuneLite - Merge ClientUI.show and ClientUI.init as now applet can be properly injected - Change RuneLite to be autocloseable and send it when opening ClientUI Signed-off-by: Tomas Slusny --- .../java/net/runelite/client/RuneLite.java | 21 ++----------- .../java/net/runelite/client/ui/ClientUI.java | 31 +++++++++---------- .../net/runelite/client/ui/TitleToolbar.java | 18 ----------- 3 files changed, 17 insertions(+), 53 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index 512a3b34a4..ba0e54b720 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -31,7 +31,6 @@ import com.google.common.eventbus.EventBus; import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.Injector; -import java.applet.Applet; import java.io.File; import java.util.Locale; import javax.annotation.Nullable; @@ -56,7 +55,6 @@ import net.runelite.client.plugins.PluginManager; import net.runelite.client.rs.ClientUpdateCheckMode; import net.runelite.client.ui.ClientUI; import net.runelite.client.ui.DrawManager; -import net.runelite.client.ui.TitleToolbar; import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.ui.overlay.OverlayRenderer; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; @@ -115,9 +113,6 @@ public class RuneLite @Inject private ClientUI clientUI; - @Inject - private TitleToolbar titleToolbar; - @Inject private Provider itemManager; @@ -139,10 +134,6 @@ public class RuneLite @Inject private WorldMapOverlay worldMapOverlay; - @Inject - @Nullable - private Applet applet; - @Inject @Nullable private Client client; @@ -228,9 +219,6 @@ public class RuneLite injector.injectMembers(client); } - // Initialize UI - clientUI.init(applet); - // Initialize Discord service discordService.init(); @@ -271,6 +259,9 @@ public class RuneLite // Load the session, including saved configuration sessionManager.loadSession(); + // Initialize UI + clientUI.open(this); + // Add core overlays after configuration has been loaded so their properties will be // loaded properly overlayManager.add(infoBoxOverlay); @@ -279,12 +270,6 @@ public class RuneLite // Start plugins pluginManager.startCorePlugins(); - - // Refresh title toolbar - titleToolbar.refresh(); - - // Show UI after all plugins are loaded - clientUI.show(); } public void shutdown() diff --git a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java index 02f4e180f7..682078016a 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java @@ -125,13 +125,13 @@ public class ClientUI @Getter private TrayIcon trayIcon; - private final RuneLite runelite; private final RuneLiteProperties properties; private final RuneLiteConfig config; private final EventBus eventBus; private final KeyManager keyManager; + private final Applet client; + private final ConfigManager configManager; private final CardLayout cardLayout = new CardLayout(); - private Applet client; private ContainableFrame frame; private JPanel navContainer; private PluginPanel pluginPanel; @@ -144,22 +144,21 @@ public class ClientUI private NavigationButton sidebarNavigationButton; private JButton sidebarNavigationJButton; - @Inject - private ConfigManager configManager; - @Inject private ClientUI( - RuneLite runelite, RuneLiteProperties properties, RuneLiteConfig config, EventBus eventBus, - KeyManager keyManager) + KeyManager keyManager, + @Nullable Applet client, + ConfigManager configManager) { - this.runelite = runelite; this.properties = properties; this.config = config; this.eventBus = eventBus; this.keyManager = keyManager; + this.client = client; + this.configManager = configManager; } @Subscribe @@ -337,13 +336,11 @@ public class ClientUI /** * Initialize UI. * - * @param client the client + * @param runelite runelite instance that will be shut down on exit * @throws Exception exception that can occur during creation of the UI */ - public void init(@Nullable final Applet client) throws Exception + public void open(final RuneLite runelite) throws Exception { - this.client = client; - SwingUtilities.invokeAndWait(() -> { // Set some sensible swing defaults @@ -373,9 +370,7 @@ public class ClientUI saveClientBoundsConfig(); runelite.shutdown(); }, - () -> client != null - && client instanceof Client - && showWarningOnExit() + this::showWarningOnExit ); container = new JPanel(); @@ -401,6 +396,8 @@ public class ClientUI frame.addKeyListener(uiKeyListener); keyManager.registerKeyListener(uiKeyListener); }); + + show(); } private boolean showWarningOnExit() @@ -410,7 +407,7 @@ public class ClientUI return true; } - if (config.warningOnExit() == WarningOnExit.LOGGED_IN) + if (config.warningOnExit() == WarningOnExit.LOGGED_IN && client instanceof Client) { return ((Client) client).getGameState() != GameState.LOGIN_SCREEN; } @@ -423,7 +420,7 @@ public class ClientUI * * @throws Exception exception that can occur during modification of the UI */ - public void show() throws Exception + private void show() throws Exception { final boolean withTitleBar = config.enableCustomChrome(); diff --git a/runelite-client/src/main/java/net/runelite/client/ui/TitleToolbar.java b/runelite-client/src/main/java/net/runelite/client/ui/TitleToolbar.java index 80333c2da6..cf9821002a 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/TitleToolbar.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/TitleToolbar.java @@ -27,7 +27,6 @@ package net.runelite.client.ui; import com.google.common.eventbus.EventBus; import java.util.Comparator; -import java.util.Iterator; import java.util.TreeSet; import javax.inject.Inject; import javax.inject.Singleton; @@ -82,21 +81,4 @@ public class TitleToolbar eventBus.post(new TitleToolbarButtonRemoved(button, index)); } } - - /** - * Refresh all buttons - */ - public void refresh() - { - final Iterator iterator = buttons.iterator(); - int index = 0; - - while (iterator.hasNext()) - { - final NavigationButton button = iterator.next(); - eventBus.post(new TitleToolbarButtonRemoved(button, index)); - eventBus.post(new TitleToolbarButtonAdded(button, index)); - index++; - } - } } From af34aa0e535d15d9a77fc1e299f47b81caa18c17 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Fri, 6 Jul 2018 10:50:02 +0200 Subject: [PATCH 6/7] Properly load configuration when showing ClientUI - Properly load configuration when first showing ClientUI instead of waiting for ConfigChanged events. - Merge open and show to 1 method - Remove ClientUILoaded as it is no longer necessary Signed-off-by: Tomas Slusny --- .../client/events/ClientUILoaded.java | 32 ---- .../java/net/runelite/client/ui/ClientUI.java | 179 ++++++++---------- 2 files changed, 78 insertions(+), 133 deletions(-) delete mode 100644 runelite-client/src/main/java/net/runelite/client/events/ClientUILoaded.java diff --git a/runelite-client/src/main/java/net/runelite/client/events/ClientUILoaded.java b/runelite-client/src/main/java/net/runelite/client/events/ClientUILoaded.java deleted file mode 100644 index dcff604949..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/events/ClientUILoaded.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2018, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.events; - -import lombok.Data; - -@Data -public class ClientUILoaded -{ -} diff --git a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java index 682078016a..03477df538 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java @@ -24,7 +24,6 @@ */ package net.runelite.client.ui; -import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; import java.applet.Applet; import java.awt.Canvas; @@ -67,7 +66,6 @@ import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ExpandResizeType; import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.config.WarningOnExit; -import net.runelite.client.events.ClientUILoaded; import net.runelite.client.events.PluginToolbarButtonAdded; import net.runelite.client.events.PluginToolbarButtonRemoved; import net.runelite.client.events.TitleToolbarButtonAdded; @@ -127,7 +125,6 @@ public class ClientUI private final RuneLiteProperties properties; private final RuneLiteConfig config; - private final EventBus eventBus; private final KeyManager keyManager; private final Applet client; private final ConfigManager configManager; @@ -143,19 +140,18 @@ public class ClientUI private JPanel container; private NavigationButton sidebarNavigationButton; private JButton sidebarNavigationJButton; + private Dimension lastClientSize; @Inject private ClientUI( RuneLiteProperties properties, RuneLiteConfig config, - EventBus eventBus, KeyManager keyManager, @Nullable Applet client, ConfigManager configManager) { this.properties = properties; this.config = config; - this.eventBus = eventBus; this.keyManager = keyManager; this.client = client; this.configManager = configManager; @@ -164,69 +160,14 @@ public class ClientUI @Subscribe public void onConfigChanged(ConfigChanged event) { - if (!event.getGroup().equals("runelite")) + if (!event.getGroup().equals("runelite") || + event.getKey().equals(CONFIG_CLIENT_MAXIMIZED) || + event.getKey().equals(CONFIG_CLIENT_BOUNDS)) { return; } - SwingUtilities.invokeLater(() -> - { - if (event.getKey().equals("gameAlwaysOnTop")) - { - if (frame.isAlwaysOnTopSupported()) - { - frame.setAlwaysOnTop(config.gameAlwaysOnTop()); - } - } - - if (event.getKey().equals("lockWindowSize")) - { - frame.setResizable(!config.lockWindowSize()); - } - - if (event.getKey().equals("automaticResizeType")) - { - frame.setExpandResizeType(config.automaticResizeType()); - } - - if (event.getKey().equals("containInScreen") || - event.getKey().equals("uiEnableCustomChrome")) - { - frame.setContainedInScreen(config.containInScreen() && config.enableCustomChrome()); - } - - if (event.getKey().equals("rememberScreenBounds") && event.getNewValue().equals("false")) - { - configManager.unsetConfiguration(CONFIG_GROUP, CONFIG_CLIENT_MAXIMIZED); - configManager.unsetConfiguration(CONFIG_GROUP, CONFIG_CLIENT_BOUNDS); - } - - if (!event.getKey().equals("gameSize")) - { - return; - } - - if (client == null) - { - return; - } - - // The upper bounds are defined by the applet's max size - // The lower bounds are defined by the client's fixed size - int width = Math.max(Math.min(config.gameSize().width, 7680), Constants.GAME_FIXED_WIDTH); - int height = Math.max(Math.min(config.gameSize().height, 2160), Constants.GAME_FIXED_HEIGHT); - final Dimension size = new Dimension(width, height); - - client.setSize(size); - client.setPreferredSize(size); - client.getParent().setPreferredSize(size); - client.getParent().setSize(size); - - if (frame.isVisible()) - { - frame.pack(); - } - }); + SwingUtilities.invokeLater(this::updateFrameConfig); } @Subscribe @@ -395,37 +336,12 @@ public class ClientUI final UiKeyListener uiKeyListener = new UiKeyListener(this); frame.addKeyListener(uiKeyListener); keyManager.registerKeyListener(uiKeyListener); - }); - show(); - } + // Update config + updateFrameConfig(); - private boolean showWarningOnExit() - { - if (config.warningOnExit() == WarningOnExit.ALWAYS) - { - return true; - } - - if (config.warningOnExit() == WarningOnExit.LOGGED_IN && client instanceof Client) - { - return ((Client) client).getGameState() != GameState.LOGIN_SCREEN; - } - - return false; - } - - /** - * Show client UI after everything else is done. - * - * @throws Exception exception that can occur during modification of the UI - */ - private void show() throws Exception - { - final boolean withTitleBar = config.enableCustomChrome(); - - SwingUtilities.invokeAndWait(() -> - { + // Decorate window with custom chrome and titlebar if needed + final boolean withTitleBar = config.enableCustomChrome(); frame.setUndecorated(withTitleBar); if (withTitleBar) @@ -544,22 +460,35 @@ public class ClientUI titleToolbar.addComponent(sidebarNavigationButton, sidebarNavigationJButton); toggleSidebar(); + log.info("Showing frame {}", frame); }); - eventBus.post(new ClientUILoaded()); - + // Show out of date dialog if needed final boolean isOutdated = !(client instanceof Client); if (isOutdated) { - SwingUtilities.invokeLater(() -> - { - JOptionPane.showMessageDialog(frame, "RuneLite has not yet been updated to work with the latest\n" - + "game update, it will work with reduced functionality until then.", - "RuneLite is outdated", INFORMATION_MESSAGE); - }); + SwingUtilities.invokeLater(() -> JOptionPane.showMessageDialog(frame, + "RuneLite has not yet been updated to work with the latest\n" + + "game update, it will work with reduced functionality until then.", + "RuneLite is outdated", INFORMATION_MESSAGE)); } } + private boolean showWarningOnExit() + { + if (config.warningOnExit() == WarningOnExit.ALWAYS) + { + return true; + } + + if (config.warningOnExit() == WarningOnExit.LOGGED_IN && client instanceof Client) + { + return ((Client) client).getGameState() != GameState.LOGIN_SCREEN; + } + + return false; + } + /** * Paint this component to target graphics * @@ -763,6 +692,54 @@ public class ClientUI } } + private void updateFrameConfig() + { + if (frame == null) + { + return; + } + + if (frame.isAlwaysOnTopSupported()) + { + frame.setAlwaysOnTop(config.gameAlwaysOnTop()); + } + + frame.setResizable(!config.lockWindowSize()); + frame.setExpandResizeType(config.automaticResizeType()); + frame.setContainedInScreen(config.containInScreen() && config.enableCustomChrome()); + + if (!config.rememberScreenBounds()) + { + configManager.unsetConfiguration(CONFIG_GROUP, CONFIG_CLIENT_MAXIMIZED); + configManager.unsetConfiguration(CONFIG_GROUP, CONFIG_CLIENT_BOUNDS); + } + + if (client == null) + { + return; + } + + // The upper bounds are defined by the applet's max size + // The lower bounds are defined by the client's fixed size + int width = Math.max(Math.min(config.gameSize().width, 7680), Constants.GAME_FIXED_WIDTH); + int height = Math.max(Math.min(config.gameSize().height, 2160), Constants.GAME_FIXED_HEIGHT); + final Dimension size = new Dimension(width, height); + + if (!size.equals(lastClientSize)) + { + lastClientSize = size; + client.setSize(size); + client.setPreferredSize(size); + client.getParent().setPreferredSize(size); + client.getParent().setSize(size); + + if (frame.isVisible()) + { + frame.pack(); + } + } + } + private void saveClientBoundsConfig() { if ((frame.getExtendedState() & JFrame.MAXIMIZED_BOTH) != 0) From cda98fc50e2490f3c124a0b3cbff109ae01b60ee Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Sat, 21 Jul 2018 22:37:52 +0200 Subject: [PATCH 7/7] Move Discord and EventBus after ClientUI Move initialization of Discord service and EventBus after ClientUI startup to display the ClientUI sooner Signed-off-by: Tomas Slusny --- .../java/net/runelite/client/RuneLite.java | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index ba0e54b720..1dd7603ba2 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -219,26 +219,6 @@ public class RuneLite injector.injectMembers(client); } - // Initialize Discord service - discordService.init(); - - // Register event listeners - eventBus.register(clientUI); - eventBus.register(overlayRenderer); - eventBus.register(overlayManager); - eventBus.register(drawManager); - eventBus.register(menuManager); - eventBus.register(chatMessageManager); - eventBus.register(commandManager); - eventBus.register(pluginManager); - eventBus.register(clanManager); - eventBus.register(infoBoxManager); - - if (!isOutdated) - { - eventBus.register(itemManager.get()); - } - // Load user configuration configManager.load(); @@ -262,6 +242,26 @@ public class RuneLite // Initialize UI clientUI.open(this); + // Initialize Discord service + discordService.init(); + + // Register event listeners + eventBus.register(clientUI); + eventBus.register(pluginManager); + eventBus.register(overlayRenderer); + eventBus.register(overlayManager); + eventBus.register(drawManager); + eventBus.register(menuManager); + eventBus.register(chatMessageManager); + eventBus.register(commandManager); + eventBus.register(clanManager); + eventBus.register(infoBoxManager); + + if (!isOutdated) + { + eventBus.register(itemManager.get()); + } + // Add core overlays after configuration has been loaded so their properties will be // loaded properly overlayManager.add(infoBoxOverlay);