diff --git a/jadx-core/src/main/java/jadx/core/dex/attributes/AttributeStorage.java b/jadx-core/src/main/java/jadx/core/dex/attributes/AttributeStorage.java index dfdf5b54b06cf799b12b755da922a1f16de97d0d..1cf0f63a468b9f8b1bd90c2148d5d5ee48f85c23 100644 --- a/jadx-core/src/main/java/jadx/core/dex/attributes/AttributeStorage.java +++ b/jadx-core/src/main/java/jadx/core/dex/attributes/AttributeStorage.java @@ -2,7 +2,6 @@ package jadx.core.dex.attributes; import java.util.ArrayList; import java.util.Collections; -import java.util.Comparator; import java.util.EnumSet; import java.util.IdentityHashMap; import java.util.List; diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java index d182b73051669e36be4e946504101357fc7f1649..5c90d3c165475fda5000673e0ecdbba3184346da 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java @@ -32,7 +32,6 @@ import jadx.core.dex.nodes.parser.AnnotationsParser; import jadx.core.dex.nodes.parser.FieldInitAttr; import jadx.core.dex.nodes.parser.SignatureParser; import jadx.core.dex.nodes.parser.StaticValuesParser; -import jadx.core.utils.RegionUtils; import jadx.core.utils.exceptions.DecodeException; import jadx.core.utils.exceptions.JadxRuntimeException; diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/variables/ProcessVariables.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/variables/ProcessVariables.java index 6be30177e8c3e7b229d344f2a0206dc624b3bf78..ccf45bee268c74e19f900d312b3f3c8e68c90c51 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/variables/ProcessVariables.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/variables/ProcessVariables.java @@ -1,7 +1,6 @@ package jadx.core.dex.visitors.regions.variables; import java.util.ArrayList; -import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; diff --git a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass15.java b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass15.java index d49f19469ee4632109f953fed5ed214ef9077ce5..a31e964ed6e7c4718a89a448ed9b7f3a7433adc1 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass15.java +++ b/jadx-core/src/test/java/jadx/tests/integration/inner/TestAnonymousClass15.java @@ -2,7 +2,6 @@ package jadx.tests.integration.inner; import org.junit.jupiter.api.Test; -import jadx.NotYetImplemented; import jadx.core.dex.nodes.ClassNode; import jadx.tests.api.IntegrationTest; diff --git a/jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java b/jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java index 2f8c0cb53c70c06fb478fdb3342fcf205ecb0e96..90d75401f6838905575f9925fe0bf68cf2167920 100644 --- a/jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java +++ b/jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java @@ -1,6 +1,9 @@ package jadx.gui.settings; -import java.awt.*; +import java.awt.Font; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.Window; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; @@ -12,6 +15,8 @@ import java.util.Map; import java.util.Set; import java.util.function.Consumer; +import javax.swing.JFrame; + import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; @@ -19,6 +24,7 @@ import org.slf4j.LoggerFactory; import jadx.api.JadxArgs; import jadx.cli.JadxCLIArgs; +import jadx.gui.ui.MainWindow; import jadx.gui.ui.codearea.EditorTheme; import jadx.gui.utils.FontUtils; import jadx.gui.utils.LangLocale; @@ -51,9 +57,10 @@ public class JadxSettings extends JadxCLIArgs { private boolean showHeapUsageBar = true; - private int settingsVersion = 0; - private Map windowPos = new HashMap<>(); + private int mainWindowExtendedState = JFrame.NORMAL; + + private int settingsVersion = 0; public static JadxSettings makeDefault() { JadxSettings jadxSettings = new JadxSettings(); @@ -92,7 +99,7 @@ public class JadxSettings extends JadxCLIArgs { public void setLastOpenFilePath(Path lastOpenFilePath) { this.lastOpenFilePath = lastOpenFilePath; - partialSync(settings -> settings.lastOpenFilePath = JadxSettings.this.lastOpenFilePath); + partialSync(settings -> settings.lastOpenFilePath = lastOpenFilePath); } public Path getLastSaveProjectPath() { @@ -105,12 +112,12 @@ public class JadxSettings extends JadxCLIArgs { public void setLastSaveProjectPath(Path lastSaveProjectPath) { this.lastSaveProjectPath = lastSaveProjectPath; - partialSync(settings -> settings.lastSaveProjectPath = JadxSettings.this.lastSaveProjectPath); + partialSync(settings -> settings.lastSaveProjectPath = lastSaveProjectPath); } public void setLastSaveFilePath(Path lastSaveFilePath) { this.lastSaveFilePath = lastSaveFilePath; - partialSync(settings -> settings.lastSaveFilePath = JadxSettings.this.lastSaveFilePath); + partialSync(settings -> settings.lastSaveFilePath = lastSaveFilePath); } public boolean isFlattenPackage() { @@ -119,7 +126,7 @@ public class JadxSettings extends JadxCLIArgs { public void setFlattenPackage(boolean flattenPackage) { this.flattenPackage = flattenPackage; - partialSync(settings -> settings.flattenPackage = JadxSettings.this.flattenPackage); + partialSync(settings -> settings.flattenPackage = flattenPackage); } public boolean isCheckForUpdates() { @@ -146,29 +153,35 @@ public class JadxSettings extends JadxCLIArgs { } public void saveWindowPos(Window window) { - WindowLocation pos = new WindowLocation(window.getClass().getSimpleName(), - window.getX(), window.getY(), - window.getWidth(), window.getHeight() - ); + WindowLocation pos = new WindowLocation(window.getClass().getSimpleName(), window.getBounds()); windowPos.put(pos.getWindowId(), pos); partialSync(settings -> settings.windowPos = windowPos); } public boolean loadWindowPos(Window window) { WindowLocation pos = windowPos.get(window.getClass().getSimpleName()); - if (pos == null || !isContainedInAnyScreen(pos)) { + if (pos == null || pos.getBounds() == null) { return false; } + if (window instanceof MainWindow) { + int extendedState = getMainWindowExtendedState(); + if (extendedState != JFrame.NORMAL) { + ((JFrame) window).setExtendedState(extendedState); + return true; + } + } - window.setLocation(pos.getX(), pos.getY()); - window.setSize(pos.getWidth(), pos.getHeight()); + if (!isContainedInAnyScreen(pos)) { + return false; + } + + window.setBounds(pos.getBounds()); return true; } private static boolean isContainedInAnyScreen(WindowLocation pos) { for (GraphicsDevice gd : GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()) { - if (gd.getDefaultConfiguration().getBounds().contains( - pos.getX(), pos.getY(), pos.getWidth(), pos.getHeight())) { + if (gd.getDefaultConfiguration().getBounds().contains(pos.getBounds())) { return true; } } @@ -317,6 +330,15 @@ public class JadxSettings extends JadxCLIArgs { this.editorThemePath = editorThemePath; } + public int getMainWindowExtendedState() { + return mainWindowExtendedState; + } + + public void setMainWindowExtendedState(int mainWindowExtendedState) { + this.mainWindowExtendedState = mainWindowExtendedState; + partialSync(settings -> settings.mainWindowExtendedState = mainWindowExtendedState); + } + private void upgradeSettings(int fromVersion) { LOG.debug("upgrade settings from version: {} to {}", fromVersion, CURRENT_SETTINGS_VERSION); if (fromVersion == 0) { diff --git a/jadx-gui/src/main/java/jadx/gui/settings/JadxSettingsAdapter.java b/jadx-gui/src/main/java/jadx/gui/settings/JadxSettingsAdapter.java index 2f949e74457037621e817896e76c2a6dc7e1723d..f75f9a81155044aeaf5c99e74917fda27820961e 100644 --- a/jadx-gui/src/main/java/jadx/gui/settings/JadxSettingsAdapter.java +++ b/jadx-gui/src/main/java/jadx/gui/settings/JadxSettingsAdapter.java @@ -1,5 +1,6 @@ package jadx.gui.settings; +import java.awt.Rectangle; import java.lang.reflect.Modifier; import java.nio.file.Path; import java.util.prefs.Preferences; @@ -15,6 +16,7 @@ import com.google.gson.InstanceCreator; import jadx.gui.JadxGUI; import jadx.gui.utils.PathTypeAdapter; +import jadx.gui.utils.RectangleTypeAdapter; public class JadxSettingsAdapter { @@ -40,6 +42,7 @@ public class JadxSettingsAdapter { private static final GsonBuilder GSON_BUILDER = new GsonBuilder() .setExclusionStrategies(EXCLUDE_FIELDS) .registerTypeHierarchyAdapter(Path.class, PathTypeAdapter.singleton()) + .registerTypeHierarchyAdapter(Rectangle.class, RectangleTypeAdapter.singleton()) ; private static final Gson GSON = GSON_BUILDER.create(); diff --git a/jadx-gui/src/main/java/jadx/gui/settings/JadxSettingsWindow.java b/jadx-gui/src/main/java/jadx/gui/settings/JadxSettingsWindow.java index 3fe5ead62efdcb7f87933027d742121d7a32e389..1dc4c33432de52fd012a066d400751fb0359b3cc 100644 --- a/jadx-gui/src/main/java/jadx/gui/settings/JadxSettingsWindow.java +++ b/jadx-gui/src/main/java/jadx/gui/settings/JadxSettingsWindow.java @@ -17,7 +17,6 @@ import jadx.gui.ui.codearea.EditorTheme; import jadx.gui.utils.FontUtils; import jadx.gui.utils.LangLocale; import jadx.gui.utils.NLS; -import jadx.gui.utils.Utils; public class JadxSettingsWindow extends JDialog { private static final long serialVersionUID = -1804570470377354148L; diff --git a/jadx-gui/src/main/java/jadx/gui/settings/WindowLocation.java b/jadx-gui/src/main/java/jadx/gui/settings/WindowLocation.java index 53f5abc131bfd14f57d42b7a8e789039c502de9e..e05127686d69f069af47a3297fd253c6324e060e 100644 --- a/jadx-gui/src/main/java/jadx/gui/settings/WindowLocation.java +++ b/jadx-gui/src/main/java/jadx/gui/settings/WindowLocation.java @@ -1,50 +1,34 @@ package jadx.gui.settings; +import java.awt.Rectangle; + public class WindowLocation { private final String windowId; - private final int x; - private final int y; - private final int width; - private final int height; + private final Rectangle bounds; - public WindowLocation(String windowId, int x, int y, int width, int height) { + public WindowLocation(String windowId, Rectangle bounds) { this.windowId = windowId; - this.x = x; - this.y = y; - this.width = width; - this.height = height; + this.bounds = bounds; } public String getWindowId() { return windowId; } - public int getX() { - return x; - } - - public int getY() { - return y; - } - - public int getWidth() { - return width; - } - - public int getHeight() { - return height; + public Rectangle getBounds() { + return bounds; } @Override public String toString() { return "WindowLocation{" + "id='" + windowId + '\'' + - ", x=" + x + - ", y=" + y + - ", width=" + width + - ", height=" + height + + ", x=" + bounds.getX() + + ", y=" + bounds.getY() + + ", width=" + bounds.getWidth() + + ", height=" + bounds.getHeight() + '}'; } } diff --git a/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java b/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java index 85bebcf41216e51d7b091695c295e530aa296010..b7dac8c124d0202aaf1f99d4e1ae98cdc2eeff7e 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java @@ -8,12 +8,10 @@ import java.awt.DisplayMode; import java.awt.Font; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; -import java.awt.Toolkit; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTarget; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.InputEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; @@ -169,7 +167,6 @@ public class MainWindow extends JFrame { setLocationAndPosition(); heapUsageBar.setVisible(settings.isShowHeapUsageBar()); setVisible(true); - setLocationRelativeTo(null); setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override @@ -921,15 +918,16 @@ public class MainWindow extends JFrame { } public void setLocationAndPosition() { - if (this.settings.loadWindowPos(this)) { + if (settings.loadWindowPos(this)) { return; } GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); DisplayMode mode = gd.getDisplayMode(); int w = mode.getWidth(); int h = mode.getHeight(); - setLocation((int) (w * BORDER_RATIO), (int) (h * BORDER_RATIO)); - setSize((int) (w * WINDOW_RATIO), (int) (h * WINDOW_RATIO)); + setBounds((int) (w * BORDER_RATIO), (int) (h * BORDER_RATIO), + (int) (w * WINDOW_RATIO), (int) (h * WINDOW_RATIO)); + setLocationRelativeTo(null); } private void setEditorTheme(String editorThemePath) { @@ -966,6 +964,7 @@ public class MainWindow extends JFrame { return; } settings.saveWindowPos(this); + settings.setMainWindowExtendedState(getExtendedState()); cancelBackgroundJobs(); dispose(); } diff --git a/jadx-gui/src/main/java/jadx/gui/ui/codearea/CodePanel.java b/jadx-gui/src/main/java/jadx/gui/ui/codearea/CodePanel.java index ecd141ad2a582e29ea82ac5e11b553ceb4e1188a..24b5271f6ec8b1ae4f6bb68908227057e0e81e14 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/codearea/CodePanel.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/codearea/CodePanel.java @@ -3,7 +3,6 @@ package jadx.gui.ui.codearea; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; -import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import jadx.gui.treemodel.JClass; diff --git a/jadx-gui/src/main/java/jadx/gui/utils/RectangleTypeAdapter.java b/jadx-gui/src/main/java/jadx/gui/utils/RectangleTypeAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..6742f41a8a158d6722b68f849e483bb4473cebe1 --- /dev/null +++ b/jadx-gui/src/main/java/jadx/gui/utils/RectangleTypeAdapter.java @@ -0,0 +1,67 @@ +package jadx.gui.utils; + +import java.awt.Rectangle; +import java.io.IOException; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; +import com.google.gson.stream.JsonWriter; + +public class RectangleTypeAdapter { + + private static TypeAdapter SINGLETON; + + public static TypeAdapter singleton() { + if (SINGLETON == null) { + SINGLETON = new TypeAdapter() { + + @Override + public void write(JsonWriter out, Rectangle value) throws IOException { + if (value == null) { + out.nullValue(); + } else { + out.beginObject(); + out.name("x").value(value.getX()); + out.name("y").value(value.getY()); + out.name("width").value(value.getWidth()); + out.name("height").value(value.getHeight()); + out.endObject(); + } + } + + @Override + public Rectangle read(JsonReader in) throws IOException { + if (in.peek() == JsonToken.NULL) { + in.nextNull(); + return null; + } + in.beginObject(); + Rectangle rectangle = new Rectangle(); + while (in.hasNext()) { + String name = in.nextName(); + switch(name) { + case "x": + rectangle.x = in.nextInt(); + break; + case "y": + rectangle.y = in.nextInt(); + break; + case "width": + rectangle.width = in.nextInt(); + break; + case "height": + rectangle.height = in.nextInt(); + break; + } + } + in.endObject(); + return rectangle; + } + }; + } + return SINGLETON; + } + + private RectangleTypeAdapter() { + } +} diff --git a/jadx-gui/src/main/java/jadx/gui/utils/TextStandardActions.java b/jadx-gui/src/main/java/jadx/gui/utils/TextStandardActions.java index 208cbf11904d72d05592a3f35f88df3592c46e47..a5aa1e64a7749367715e99ed6f8c96eb6e8602c5 100644 --- a/jadx-gui/src/main/java/jadx/gui/utils/TextStandardActions.java +++ b/jadx-gui/src/main/java/jadx/gui/utils/TextStandardActions.java @@ -6,7 +6,6 @@ import javax.swing.undo.UndoManager; import java.awt.*; import java.awt.datatransfer.DataFlavor; import java.awt.event.ActionEvent; -import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; diff --git a/jadx-gui/src/main/java/jadx/gui/utils/Utils.java b/jadx-gui/src/main/java/jadx/gui/utils/Utils.java index e92eaafdfe613c0a40f66b435750fa4fe934791f..33506213aad0f8e003d74882bf95c641583e7bee 100644 --- a/jadx-gui/src/main/java/jadx/gui/utils/Utils.java +++ b/jadx-gui/src/main/java/jadx/gui/utils/Utils.java @@ -6,13 +6,10 @@ import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; import java.awt.event.InputEvent; -import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.List; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory;