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

jiangxincode / ApkToolBoxGUI / #1114

26 Jul 2025 12:05PM UTC coverage: 3.079% (+0.002%) from 3.077%
#1114

push

jiangxincode
fix #543: add error tips

0 of 23 new or added lines in 8 files covered. (0.0%)

1 existing line in 1 file now uncovered.

236 of 7664 relevant lines covered (3.08%)

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/android/screenshot/ScreenShotPanel.java
1
package edu.jiangxin.apktoolbox.android.screenshot;
2

3
import edu.jiangxin.apktoolbox.swing.extend.EasyPanel;
4
import edu.jiangxin.apktoolbox.utils.Constants;
5
import edu.jiangxin.apktoolbox.utils.DateUtils;
6
import edu.jiangxin.apktoolbox.utils.Utils;
7
import org.apache.commons.lang3.StringUtils;
8

9
import javax.imageio.ImageIO;
10
import javax.swing.*;
11
import java.awt.*;
12
import java.awt.datatransfer.DataFlavor;
13
import java.awt.datatransfer.Transferable;
14
import java.awt.datatransfer.UnsupportedFlavorException;
15
import java.awt.event.ActionEvent;
16
import java.awt.event.ActionListener;
17
import java.io.File;
18
import java.io.IOException;
19

20
/**
21
 * @author jiangxin
22
 * @author 2019-04-12
23
 *
24
 */
25
public class ScreenShotPanel extends EasyPanel {
26
    private static final long serialVersionUID = 1L;
27

28
    private JTextField directoryTextField;
29

30
    private JTextField fileNameTextField;
31

32
    private JCheckBox openCheckBox;
33

34
    private JCheckBox copyCheckBox;
35

36
    public ScreenShotPanel() throws HeadlessException {
37
        super();
×
38
    }
×
39

40
    @Override
41
    public void initUI() {
42
        BoxLayout boxLayout = new BoxLayout(this, BoxLayout.Y_AXIS);
×
43
        setLayout(boxLayout);
×
44

45
        createDirectoryPanel();
×
46
        add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
×
47
        createFileNamePanel();
×
48
        add(Box.createVerticalStrut(Constants.DEFAULT_Y_BORDER));
×
49
        createScreenshotPanel();
×
50
    }
×
51

52
    private void createScreenshotPanel() {
53
        JPanel screenshotPanel = new JPanel();
×
54
        screenshotPanel.setLayout(new BoxLayout(screenshotPanel, BoxLayout.X_AXIS));
×
55
        add(screenshotPanel);
×
56

57
        openCheckBox = new JCheckBox("Open Dir");
×
58
        openCheckBox.setSelected(false);
×
59

60
        copyCheckBox = new JCheckBox("Copy Pic");
×
61
        copyCheckBox.setSelected(false);
×
62

63
        JButton screenshotButton = new JButton("Sceenshot");
×
64
        screenshotButton.addActionListener(new ScreenshotButtonActionListener());
×
65

66
        JButton getExistButton = new JButton("Get Exist");
×
67
        getExistButton.addActionListener(new GetExistButtonActionListener());
×
68

69
        screenshotPanel.add(openCheckBox);
×
70
        screenshotPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
×
71
        screenshotPanel.add(copyCheckBox);
×
72
        screenshotPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
×
73
        screenshotPanel.add(screenshotButton);
×
74
        screenshotPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
×
75
        screenshotPanel.add(getExistButton);
×
76
    }
×
77

78
    private void createFileNamePanel() {
79
        JPanel fileNamePanel = new JPanel();
×
80
        fileNamePanel.setLayout(new BoxLayout(fileNamePanel, BoxLayout.X_AXIS));
×
81
        add(fileNamePanel);
×
82

83
        fileNameTextField = new JTextField();
×
84
        fileNameTextField.setToolTipText("timestamp default(for example: 20180101122345.png)");
×
85

86
        JButton fileNameButton = new JButton("File name");
×
87

88
        fileNamePanel.add(fileNameTextField);
×
89
        fileNamePanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
×
90
        fileNamePanel.add(fileNameButton);
×
91
    }
×
92

93
    private void createDirectoryPanel() {
94
        JPanel directoryPanel = new JPanel();
×
95
        directoryPanel.setLayout(new BoxLayout(directoryPanel, BoxLayout.X_AXIS));
×
96
        add(directoryPanel);
×
97

98
        directoryTextField = new JTextField();
×
99
        directoryTextField.setText(conf.getString("screenshot.save.dir", System.getenv("USERPROFILE")));
×
100
        directoryTextField.setTransferHandler(new DirectoryTextFieldTransferHandler());
×
101

102
        JButton directoryButton = new JButton("Save Directory");
×
103
        directoryButton.addActionListener(new DirectoryButtonActionListener());
×
104

105
        directoryPanel.add(directoryTextField);
×
106
        directoryPanel.add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
×
107
        directoryPanel.add(directoryButton);
×
108
    }
×
109

110
    private final class DirectoryButtonActionListener implements ActionListener {
×
111
        @Override
112
        public void actionPerformed(ActionEvent e) {
113
            JFileChooser jfc = new JFileChooser(directoryTextField.getText());
×
114
            jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
×
115
            jfc.setDialogTitle("select a directory");
×
116
            int ret = jfc.showDialog(new JLabel(), null);
×
117
            switch (ret) {
×
118
                case JFileChooser.APPROVE_OPTION:
119
                    File file = jfc.getSelectedFile();
×
120
                    directoryTextField.setText(file.getAbsolutePath());
×
121
                    conf.setProperty("screenshot.save.dir", file.getAbsolutePath());
×
122
                    break;
×
123

124
                default:
125
                    break;
126
            }
127

128
        }
×
129
    }
130

131
    private final class GetExistButtonActionListener implements ActionListener {
×
132
        @Override
133
        public void actionPerformed(ActionEvent e) {
134
            System.out.println("Get Exist");
×
135
        }
×
136
    }
137

138
    private final class ScreenshotButtonActionListener implements ActionListener {
×
139
        @Override
140
        public void actionPerformed(ActionEvent e) {
141
            String title = Utils.getFrameTitle(ScreenShotPanel.this);
×
142
            Utils.setFrameTitle(ScreenShotPanel.this, title + "    [Processing]");
×
143
            String dirName = fileNameTextField.getText();
×
144
            if (StringUtils.isEmpty(dirName)) {
×
145
                String defaultDir = System.getenv("USERPROFILE");
×
146
                dirName = conf.getString("screenshot.save.dir", defaultDir);
×
147
                logger.info("dirName: " + dirName);
×
148
            }
149
            String fileName = fileNameTextField.getText();
×
150
            if (StringUtils.isEmpty(fileName)) {
×
151
                fileName = DateUtils.getCurrentDateString() + ".png";
×
152
            }
153
            File file = new File(dirName, fileName);
×
154
            try {
NEW
155
                Utils.executor("adb shell /system/bin/screencap -p /sdcard/screenshot.png", true);
×
156
                logger.info("screencap finish");
×
NEW
157
                Utils.executor("adb pull /sdcard/screenshot.png " + file.getCanonicalPath(), true);
×
158
                logger.info("pull finish");
×
159
                if (openCheckBox.isSelected()) {
×
NEW
160
                    Utils.executor("explorer /e,/select, " + file.getCanonicalPath(), true);
×
161
                    logger.info("open dir finish");
×
162
                }
163
                if (copyCheckBox.isSelected()) {
×
164
                    logger.info("copy the snapshot");
×
165
                    Image image = ImageIO.read(file);
×
166
                    setClipboardImage(ScreenShotPanel.this, image);
×
167
                    logger.info("copy finish");
×
168
                }
169
            } catch (IOException e1) {
×
170
                logger.error("screenshot fail", e1);
×
171
            } finally {
172
                Utils.setFrameTitle(ScreenShotPanel.this, title);
×
173
            }
174
        }
×
175
    }
176

177
    private final class DirectoryTextFieldTransferHandler extends TransferHandler {
×
178
        private static final long serialVersionUID = 1L;
179

180
        @Override
181
        public boolean importData(JComponent comp, Transferable t) {
182
            try {
183
                Object o = t.getTransferData(DataFlavor.javaFileListFlavor);
×
184
                String filepath = o.toString();
×
185
                filepath = filepath.substring(1, filepath.length() - 1);
×
186
                directoryTextField.setText(filepath);
×
187
                return true;
×
188
            } catch (Exception e) {
×
189
                logger.error("import data excetion", e);
×
190
            }
191
            return false;
×
192
        }
193

194
        @Override
195
        public boolean canImport(JComponent jComponent, DataFlavor[] dataFlavors) {
196
            for (int i = 0; i < dataFlavors.length; i++) {
×
197
                if (DataFlavor.javaFileListFlavor.equals(dataFlavors[i])) {
×
198
                    return true;
×
199
                }
200
            }
201
            return false;
×
202
        }
203
    }
204

205
    private static void setClipboardImage(JPanel frame, final Image image) {
206
        Transferable trans = new Transferable() {
×
207
            @Override
208
            public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
209
                if (isDataFlavorSupported(flavor)) {
×
210
                    return image;
×
211
                }
212
                throw new UnsupportedFlavorException(flavor);
×
213
            }
214

215
            @Override
216
            public DataFlavor[] getTransferDataFlavors() {
217
                return new DataFlavor[] { DataFlavor.imageFlavor };
×
218
            }
219

220
            @Override
221
            public boolean isDataFlavorSupported(DataFlavor flavor) {
222
                return DataFlavor.imageFlavor.equals(flavor);
×
223
            }
224
        };
225

226
        frame.getToolkit().getSystemClipboard().setContents(trans, null);
×
227
    }
×
228
}
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