• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

jiangxincode / ApkToolBoxGUI / #734

19 May 2024 01:23PM UTC coverage: 3.151%. Remained the same
#734

push

jiangxincode
merge some menu to settings menu

0 of 127 new or added lines in 11 files covered. (0.0%)

229 existing lines in 9 files now uncovered.

236 of 7489 relevant lines covered (3.15%)

0.03 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/main/java/edu/jiangxin/apktoolbox/main/MainFrame.java
1
package edu.jiangxin.apktoolbox.main;
2

3
import edu.jiangxin.apktoolbox.Version;
4
import edu.jiangxin.apktoolbox.convert.base.BaseConvertPanel;
5
import edu.jiangxin.apktoolbox.convert.color.ColorConvertPanel;
6
import edu.jiangxin.apktoolbox.convert.color.ColorPickerPanel;
7
import edu.jiangxin.apktoolbox.convert.protobuf.unsupervised.ProtobufConvertPanel;
8
import edu.jiangxin.apktoolbox.convert.relationship.RelationShipConvertPanel;
9
import edu.jiangxin.apktoolbox.convert.time.TimeConvertPanel;
10
import edu.jiangxin.apktoolbox.convert.zh2unicode.Zh2UnicodeConvertPanel;
11
import edu.jiangxin.apktoolbox.android.dumpsys.alarm.DumpsysAlarmPanel;
12
import edu.jiangxin.apktoolbox.file.batchrename.BatchRenamePanel;
13
import edu.jiangxin.apktoolbox.file.EncodeConvertPanel;
14
import edu.jiangxin.apktoolbox.file.OsConvertPanel;
15
import edu.jiangxin.apktoolbox.file.checksum.ChecksumPanel;
16
import edu.jiangxin.apktoolbox.file.password.recovery.RecoveryPanel;
17
import edu.jiangxin.apktoolbox.file.duplicate.DuplicateSearchPanel;
18
import edu.jiangxin.apktoolbox.file.zhconvert.ZhConvertPanel;
19
import edu.jiangxin.apktoolbox.help.*;
20
import edu.jiangxin.apktoolbox.android.i18n.I18nAddPanel;
21
import edu.jiangxin.apktoolbox.android.i18n.I18nFindLongestPanel;
22
import edu.jiangxin.apktoolbox.android.i18n.I18nRemovePanel;
23
import edu.jiangxin.apktoolbox.android.monkey.MonkeyPanel;
24
import edu.jiangxin.apktoolbox.help.settings.SettingsPanel;
25
import edu.jiangxin.apktoolbox.reverse.*;
26
import edu.jiangxin.apktoolbox.android.screenshot.ScreenShotPanel;
27
import edu.jiangxin.apktoolbox.reverse.ApktoolPanel;
28
import edu.jiangxin.apktoolbox.swing.extend.EasyFrame;
29
import edu.jiangxin.apktoolbox.swing.extend.EasyPanel;
30
import edu.jiangxin.apktoolbox.swing.extend.listener.ChangeMenuListener;
31
import edu.jiangxin.apktoolbox.swing.extend.listener.ChangeMenuToUrlListener;
32
import edu.jiangxin.apktoolbox.swing.extend.listener.IPreChangeMenuCallBack;
33
import edu.jiangxin.apktoolbox.swing.extend.plugin.ChangeMenuPreparePluginController;
34
import edu.jiangxin.apktoolbox.swing.extend.plugin.PluginPanel;
35
import edu.jiangxin.apktoolbox.utils.Utils;
36
import org.apache.commons.configuration2.Configuration;
37
import org.apache.commons.lang3.StringUtils;
38
import org.apache.logging.log4j.LogManager;
39
import org.apache.logging.log4j.Logger;
40

41
import javax.swing.*;
42
import javax.swing.border.EmptyBorder;
43
import java.awt.*;
44
import java.awt.event.*;
45
import java.io.Serial;
46
import java.lang.reflect.InvocationTargetException;
47
import java.text.MessageFormat;
48
import java.util.Locale;
49
import java.util.Objects;
50

51
/**
52
 * @author jiangxin
53
 * @author 2018-08-19
54
 */
55
public class MainFrame extends EasyFrame {
56

57
    @Serial
58
    private static final long serialVersionUID = 1L;
59

60
    private JPanel contentPane;
61
    private JMenuBar menuBar;
62

63
    public static void main(String[] args) {
64
        final Logger logger = LogManager.getLogger(MainFrame.class.getSimpleName());
×
65
        boolean isEnvironmentOk = Utils.checkAndInitEnvironment();
×
66
        if (!isEnvironmentOk) {
×
67
            logger.error("Environment is not ready, exit");
×
68
            return;
×
69
        }
70
        EventQueue.invokeLater(() -> {
×
71
            Configuration conf = Utils.getConfiguration();
×
72
            String lookAndFeelClassName = conf.getString("look.and.feel.class.name");
×
73
            if (StringUtils.isEmpty(lookAndFeelClassName)) {
×
74
                lookAndFeelClassName = "com.formdev.flatlaf.FlatDarculaLaf";
×
75
                conf.setProperty("look.and.feel.class.name", lookAndFeelClassName);
×
76
            }
77
            try {
78
                UIManager.setLookAndFeel(lookAndFeelClassName);
×
79
            } catch (UnsupportedLookAndFeelException | ClassNotFoundException | InstantiationException | IllegalAccessException e) {
×
80
                logger.error("setLookAndFeel failed, use default instead", e);
×
81
            }
×
82

83
            String currentLocaleLanguage = conf.getString("locale.language");
×
84
            if (StringUtils.isEmpty(currentLocaleLanguage)) {
×
85
                currentLocaleLanguage = Locale.ENGLISH.getLanguage();
×
86
                conf.setProperty("locale.language", currentLocaleLanguage);
×
87
            }
88
            Locale.setDefault(new Locale(currentLocaleLanguage));
×
89

90
            MainFrame frame = new MainFrame();
×
91
            frame.setVisible(true);
×
92
        });
×
93
    }
×
94

95
    public MainFrame() {
96
        super();
×
97
        if (SystemTray.isSupported()) {
×
98
            configSystemTray();
×
99
        }
100

101
        setTitle(MessageFormat.format(bundle.getString("main.title"), Version.VERSION));
×
102
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
×
103
        setMenuBar();
×
104
        contentPane = new JPanel();
×
105
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
×
106
        contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
×
107
        contentPane.add(Box.createVerticalGlue());
×
108
        EasyPanel initPanel = new AboutPanel();
×
109
        initPanel.init();
×
110
        initPanel.setBorder(BorderFactory.createTitledBorder(bundle.getString("help.about.title")));
×
111
        contentPane.add(initPanel);
×
112
        contentPane.add(Box.createVerticalGlue());
×
113
        setContentPane(contentPane);
×
114
        refreshSizeAndLocation();
×
115
    }
×
116

117
    private void configSystemTray() {
118
        SystemTray systemTray = SystemTray.getSystemTray();
×
119
        PopupMenu popupMenu = new PopupMenu();
×
120
        final MenuItem show = new MenuItem("Open");
×
121
        final MenuItem exit = new MenuItem("Close");
×
122
        ActionListener actionListener = e -> {
×
123
            if (e.getSource() == show) {
×
124
                setExtendedState(JFrame.NORMAL);
×
125
                setVisible(true);
×
126
            }
127
            if (e.getSource() == exit) {
×
128
                dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
×
129
            }
130
        };
×
131
        exit.addActionListener(actionListener);
×
132
        show.addActionListener(actionListener);
×
133
        popupMenu.add(show);
×
134
        popupMenu.add(exit);
×
135
        TrayIcon trayIcon = new TrayIcon(image, "系统托盘", popupMenu);
×
136
        trayIcon.setImageAutoSize(true);
×
137
        try {
138
            systemTray.add(trayIcon);
×
139
        } catch (AWTException e) {
×
140
            logger.error("add icon to tray failed");
×
141
        }
×
142
        trayIcon.addMouseListener(new MouseAdapter() {
×
143
            @Override
144
            public void mouseClicked(MouseEvent e) {
145
                if (e.getClickCount() == 2) {
×
146
                    setExtendedState(JFrame.NORMAL);
×
147
                    setVisible(true);
×
148
                }
149
            }
×
150
        });
151
    }
×
152

153
    private void setMenuBar() {
154
        menuBar = new JMenuBar();
×
155
        setJMenuBar(menuBar);
×
156

157
        createReverseMenu();
×
158

159
        createAndroidMenu();
×
160

161
        createFileMenu();
×
162

163
        createConvertMenu();
×
164

UNCOV
165
        createHelpMenu();
×
UNCOV
166
    }
×
167

168
    private void createHelpMenu() {
UNCOV
169
        JMenu helpMenu = new JMenu(bundle.getString("help.title"));
×
170
        menuBar.add(helpMenu);
×
171

NEW
172
        JMenuItem settingsMenuItem = new JMenuItem(bundle.getString("help.settings.title"));
×
NEW
173
        settingsMenuItem.addActionListener(new ChangeMenuToPanelListener(SettingsPanel.class, settingsMenuItem.getText()));
×
NEW
174
        helpMenu.add(settingsMenuItem);
×
175

176
        JMenuItem feedbackMenuItem = new JMenuItem(bundle.getString("help.feedback.title"));
×
UNCOV
177
        feedbackMenuItem.addActionListener(new ChangeMenuToUrlListener(Constant.URL_FEEDBACK));
×
178
        helpMenu.add(feedbackMenuItem);
×
179

180
        JMenuItem checkUpdateMenuItem = new JMenuItem(bundle.getString("help.checkupdate.title"));
×
UNCOV
181
        checkUpdateMenuItem.addActionListener(new CheckUpdateActionListener(this));
×
182
        helpMenu.add(checkUpdateMenuItem);
×
183

184
        JMenuItem contributeMenuItem = new JMenuItem(bundle.getString("help.contribute.title"));
×
185
        contributeMenuItem.addActionListener(new ChangeMenuToUrlListener(Constant.URL_CONTRIBUTE));
×
UNCOV
186
        helpMenu.add(contributeMenuItem);
×
187

188
        JMenuItem aboutMenuItem = new JMenuItem(bundle.getString("help.about.title"));
×
189
        aboutMenuItem.addActionListener(new ChangeMenuToPanelListener(AboutPanel.class, aboutMenuItem.getText()));
×
UNCOV
190
        helpMenu.add(aboutMenuItem);
×
191
    }
×
192

193
    private void createFileMenu() {
UNCOV
194
        JMenu fileMenu = new JMenu(bundle.getString("file.title"));
×
195
        menuBar.add(fileMenu);
×
196

197
        JMenuItem osConvertMenuItem = new JMenuItem(bundle.getString("file.os.convert.title"));
×
UNCOV
198
        osConvertMenuItem.addActionListener(new ChangeMenuToPanelListener(OsConvertPanel.class, osConvertMenuItem.getText()));
×
199
        fileMenu.add(osConvertMenuItem);
×
200

201
        JMenuItem encodeConvertMenuItem = new JMenuItem(bundle.getString("file.encode.convert.title"));
×
UNCOV
202
        encodeConvertMenuItem.addActionListener(new ChangeMenuToPanelListener(EncodeConvertPanel.class, encodeConvertMenuItem.getText()));
×
203
        fileMenu.add(encodeConvertMenuItem);
×
204

205
        JMenuItem zhConvertMenuItem = new JMenuItem(bundle.getString("file.zh.convert.title"));
×
UNCOV
206
        zhConvertMenuItem.addActionListener(new ChangeMenuToPanelListener(ZhConvertPanel.class, zhConvertMenuItem.getText()));
×
207
        fileMenu.add(zhConvertMenuItem);
×
208

209
        JMenuItem duplicateFindMenuItem = new JMenuItem(bundle.getString("file.duplicate.title"));
×
UNCOV
210
        duplicateFindMenuItem.addActionListener(new ChangeMenuToPanelListener(DuplicateSearchPanel.class, duplicateFindMenuItem.getText()));
×
211
        fileMenu.add(duplicateFindMenuItem);
×
212

213
        JMenuItem batchRenameMenuItem = new JMenuItem(bundle.getString("file.batch.rename.title"));
×
UNCOV
214
        batchRenameMenuItem.addActionListener(new ChangeMenuToPanelListener(BatchRenamePanel.class, batchRenameMenuItem.getText()));
×
215
        fileMenu.add(batchRenameMenuItem);
×
216

217
        JMenuItem checkSumMenuItem = new JMenuItem(bundle.getString("file.check.summary.title"));
×
218
        checkSumMenuItem.addActionListener(new ChangeMenuToPanelListener(ChecksumPanel.class, checkSumMenuItem.getText()));
×
UNCOV
219
        fileMenu.add(checkSumMenuItem);
×
220

221
        JMenuItem recoveryMenuItem = new JMenuItem(bundle.getString("file.password.recovery.title"));
×
222
        recoveryMenuItem.addActionListener(new ChangeMenuToPanelListener(RecoveryPanel.class, recoveryMenuItem.getText()));
×
UNCOV
223
        fileMenu.add(recoveryMenuItem);
×
224
    }
×
225

226
    private void createConvertMenu() {
UNCOV
227
        JMenu convertMenu = new JMenu(bundle.getString("convert.title"));
×
228
        menuBar.add(convertMenu);
×
229

230
        JMenuItem timeConvertMenuItem = new JMenuItem(bundle.getString("convert.time.title"));
×
UNCOV
231
        timeConvertMenuItem.addActionListener(new ChangeMenuToPanelListener(TimeConvertPanel.class, timeConvertMenuItem.getText()));
×
232
        convertMenu.add(timeConvertMenuItem);
×
233

234
        JMenuItem colorConvertMenuItem = new JMenuItem(bundle.getString("convert.color.title"));
×
UNCOV
235
        colorConvertMenuItem.addActionListener(new ChangeMenuToPanelListener(ColorConvertPanel.class, colorConvertMenuItem.getText()));
×
236
        convertMenu.add(colorConvertMenuItem);
×
237

238
        JMenuItem colorPickerMenuItem = new JMenuItem(bundle.getString("picker.color.title"));
×
UNCOV
239
        colorPickerMenuItem.addActionListener(new ChangeMenuToPanelListener(ColorPickerPanel.class, colorPickerMenuItem.getText()));
×
240
        convertMenu.add(colorPickerMenuItem);
×
241

242
        JMenuItem baseConvertMenuItem = new JMenuItem(bundle.getString("convert.base.title"));
×
UNCOV
243
        baseConvertMenuItem.addActionListener(new ChangeMenuToPanelListener(BaseConvertPanel.class, baseConvertMenuItem.getText()));
×
244
        convertMenu.add(baseConvertMenuItem);
×
245

246
        JMenuItem unicodeConvertMenuItem = new JMenuItem(bundle.getString("convert.unicode.title"));
×
UNCOV
247
        unicodeConvertMenuItem.addActionListener(new ChangeMenuToPanelListener(Zh2UnicodeConvertPanel.class, unicodeConvertMenuItem.getText()));
×
248
        convertMenu.add(unicodeConvertMenuItem);
×
249

250
        JMenuItem relationShipConvertMenuItem = new JMenuItem(bundle.getString("convert.relationship.title"));
×
251
        relationShipConvertMenuItem.addActionListener(new ChangeMenuToPanelListener(RelationShipConvertPanel.class, relationShipConvertMenuItem.getText()));
×
UNCOV
252
        convertMenu.add(relationShipConvertMenuItem);
×
253

254
        JMenuItem protobufConvertMenuItem = new JMenuItem(bundle.getString("convert.protobuf.title"));
×
255
        protobufConvertMenuItem.addActionListener(new ChangeMenuToPanelListener(ProtobufConvertPanel.class, protobufConvertMenuItem.getText()));
×
UNCOV
256
        convertMenu.add(protobufConvertMenuItem);
×
257
    }
×
258

259
    private void createAndroidMenu() {
UNCOV
260
        JMenu androidMenu = new JMenu(bundle.getString("android.title"));
×
261
        menuBar.add(androidMenu);
×
262

263
        JMenuItem i18nAddMenuItem = new JMenuItem(bundle.getString("android.i18n.add.title"));
×
UNCOV
264
        i18nAddMenuItem.addActionListener(new ChangeMenuToPanelListener(I18nAddPanel.class, i18nAddMenuItem.getText()));
×
265
        androidMenu.add(i18nAddMenuItem);
×
266

267
        JMenuItem i18nFindLongestMenuItem = new JMenuItem(bundle.getString("android.i18n.longest.title"));
×
UNCOV
268
        i18nFindLongestMenuItem.addActionListener(new ChangeMenuToPanelListener(I18nFindLongestPanel.class, i18nFindLongestMenuItem.getText()));
×
269
        androidMenu.add(i18nFindLongestMenuItem);
×
270

271
        JMenuItem i18nRemoveMenuItem = new JMenuItem(bundle.getString("android.i18n.remove.title"));
×
272
        i18nRemoveMenuItem.addActionListener(new ChangeMenuToPanelListener(I18nRemovePanel.class, i18nRemoveMenuItem.getText()));
×
UNCOV
273
        androidMenu.add(i18nRemoveMenuItem);
×
274

275
        JMenuItem screenShotMenuItem = new JMenuItem(bundle.getString("android.screenshot.title"));
×
276
        screenShotMenuItem.addActionListener(new ChangeMenuToPanelListener(ScreenShotPanel.class, screenShotMenuItem.getText()));
×
UNCOV
277
        screenShotMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK));
×
278
        androidMenu.add(screenShotMenuItem);
×
279

280
        JMenuItem monkeyMenuItem = new JMenuItem(bundle.getString("android.monkey.title"));
×
281
        monkeyMenuItem.addActionListener(new ChangeMenuToPanelListener(MonkeyPanel.class, monkeyMenuItem.getText()));
×
UNCOV
282
        androidMenu.add(monkeyMenuItem);
×
283

284
        JMenuItem dumpsysAlarmMenuItem = new JMenuItem(bundle.getString("android.dumpsys.alarm.title"));
×
285
        dumpsysAlarmMenuItem.addActionListener(new ChangeMenuToPanelListener(DumpsysAlarmPanel.class, dumpsysAlarmMenuItem.getText()));
×
286
        androidMenu.add(dumpsysAlarmMenuItem);
×
UNCOV
287
    }
×
288

289
    private void createReverseMenu() {
290
        JMenu reverseMenu = new JMenu(bundle.getString("reverse.title"));
×
291
        reverseMenu.setMnemonic(KeyEvent.VK_R);
×
292
        menuBar.add(reverseMenu);
×
293

UNCOV
294
        JMenuItem apktoolMenuItem = new JMenuItem(bundle.getString("reverse.apktool.title"), KeyEvent.VK_D);
×
295
        apktoolMenuItem.addActionListener(new ChangeMenuToPanelListener(ApktoolPanel.class, apktoolMenuItem.getText()));
×
296
        reverseMenu.add(apktoolMenuItem);
×
297

UNCOV
298
        JMenuItem apkSignMenuItem = new JMenuItem(bundle.getString("reverse.apksigner.title"));
×
299
        apkSignMenuItem.addActionListener(new ChangeMenuToPanelListener(ApkSignerPanel.class, apkSignMenuItem.getText()));
×
300
        reverseMenu.add(apkSignMenuItem);
×
301

UNCOV
302
        JMenuItem jDMenuItem = new JMenuItem(bundle.getString("reverse.jd.gui.title"));
×
303
        jDMenuItem.addActionListener(new ChangeMenToPluginJdListener());
×
304
        reverseMenu.add(jDMenuItem);
×
305

306
        JMenuItem luytenMenuItem = new JMenuItem(bundle.getString("reverse.luyten.title"));
×
UNCOV
307
        luytenMenuItem.addActionListener(new ChangeMenuToPluginLuytenListener());
×
UNCOV
308
        reverseMenu.add(luytenMenuItem);
×
309

UNCOV
310
        JMenuItem jdDuoMenuItem = new JMenuItem(bundle.getString("reverse.jd.duo.title"));
×
UNCOV
311
        jdDuoMenuItem.addActionListener(new ChangeMenuToPluginJdDuoListener());
×
312
        reverseMenu.add(jdDuoMenuItem);
×
313

UNCOV
314
        JMenuItem jADXMenuItem = new JMenuItem(bundle.getString("reverse.jadx.title"));
×
UNCOV
315
        jADXMenuItem.addActionListener(new ChangeMenuToPluginJadxListener());
×
316
        reverseMenu.add(jADXMenuItem);
×
317

318
        JMenuItem aXMLPrinter = new JMenuItem(bundle.getString("reverse.axmlprinter.title"));
×
319
        aXMLPrinter.addActionListener(new ChangeMenuToPanelListener(AxmlPrinterPanel.class, aXMLPrinter.getText()));
×
320
        reverseMenu.add(aXMLPrinter);
×
UNCOV
321
    }
×
322

323
    class ChangeMenuToPanelListener implements ChangeMenuListener {
324

325
        Class<? extends EasyPanel> easyPanelClass;
326

UNCOV
327
        EasyPanel panel = null;
×
328

329
        String title;
330

UNCOV
331
        public ChangeMenuToPanelListener(Class<? extends EasyPanel> easyPanelClass, String title) {
×
332
            this.easyPanelClass = easyPanelClass;
×
UNCOV
333
            this.title = title;
×
334
            panel = createEasyPanel();
×
UNCOV
335
        }
×
336

337
        @Override
338
        public boolean isNeedPreChangeMenu() {
339
            return panel.isNeedPreChangeMenu();
×
340
        }
341

342
        @Override
343
        public void onPreChangeMenu(IPreChangeMenuCallBack callBack) {
344
            if (panel instanceof PluginPanel pluginPanel) {
×
345
                pluginPanel.preparePlugin(
×
346
                        new ChangeMenuPreparePluginController(
347
                                pluginPanel.getPluginFilename(), pluginPanel.isPluginNeedUnzip(), callBack));
×
348
            }
UNCOV
349
        }
×
350

351
        @Override
352
        public void onChangeMenu() {
UNCOV
353
            contentPane.removeAll();
×
354
            contentPane.add(Box.createVerticalGlue());
×
UNCOV
355
            panel.init();
×
356
            panel.setBorder(BorderFactory.createTitledBorder(title));
×
357
            contentPane.add(panel);
×
UNCOV
358
            logger.info("Panel changed: " + panel.getClass().getSimpleName());
×
359
            contentPane.add(Box.createVerticalGlue());
×
360
            contentPane.revalidate();
×
361
            contentPane.repaint();
×
UNCOV
362
            refreshSizeAndLocation();
×
UNCOV
363
        }
×
364

365
        private EasyPanel createEasyPanel() {
UNCOV
366
            if (easyPanelClass == null) {
×
UNCOV
367
                return new EasyPanel();
×
368
            }
UNCOV
369
            EasyPanel retEasyPanel = null;
×
370
            try {
UNCOV
371
                retEasyPanel = easyPanelClass.getDeclaredConstructor().newInstance();
×
UNCOV
372
            } catch (InstantiationException | IllegalAccessException | InvocationTargetException |
×
373
                     NoSuchMethodException e) {
UNCOV
374
                logger.info("createEasyPanel failed: {}", e.getMessage());
×
UNCOV
375
            }
×
UNCOV
376
            return Objects.requireNonNullElseGet(retEasyPanel, EasyPanel::new);
×
377
        }
378
    }
379
}
380

381

STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc