Skip to content

Commit cd92e96

Browse files
author
pdroidandroid@gmail.com
committed
Added 2018 updated code
1 parent d9377cd commit cd92e96

24 files changed

+1257
-1148
lines changed
Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
package com.majeur.ars;
2+
3+
import com.majeur.ars.adb.AdbHelper;
4+
5+
import javax.imageio.IIOException;
6+
import javax.swing.*;
7+
import java.awt.*;
8+
import java.awt.event.*;
9+
import java.awt.image.BufferedImage;
10+
import java.io.IOException;
11+
12+
public class AdbDeviceScreenComponent extends JComponent implements MouseListener, KeyListener {
13+
14+
private static final long MIN_SCREEN_REFRESH_INTERVAL = 250;
15+
private static final Dimension DEFAULT_SCREEN_SIZE = new Dimension(720, 1080);
16+
17+
private AdbHelper mAdbHelper;
18+
private volatile BufferedImage mImage;
19+
private int mDownX, mDownY;
20+
private long mSwipeStartTime;
21+
22+
protected volatile Thread mUpdateThread;
23+
24+
public AdbDeviceScreenComponent(AdbHelper helper) {
25+
mAdbHelper = helper;
26+
addMouseListener(this);
27+
addKeyListener(this);
28+
29+
setPreferredSize(new Dimension((int) (DEFAULT_SCREEN_SIZE.getWidth() * 0.5),
30+
(int) (DEFAULT_SCREEN_SIZE.getHeight() * 0.5)));
31+
32+
addComponentListener(new ComponentAdapter() {
33+
@Override
34+
public void componentHidden(ComponentEvent e) {
35+
if (isRendering())
36+
stopUpdate();
37+
}
38+
39+
@Override
40+
public void componentResized(ComponentEvent e) {
41+
requestFocus();
42+
requestFocusInWindow();
43+
}
44+
});
45+
}
46+
47+
boolean isRendering() {
48+
return mUpdateThread != null && !mUpdateThread.isInterrupted();
49+
}
50+
51+
public void startUpdate() {
52+
if (isRendering())
53+
throw new IllegalStateException("Already started");
54+
55+
Logger.i("Start rendering device screen");
56+
mUpdateThread = new UpdateThread();
57+
mUpdateThread.start();
58+
}
59+
60+
public void stopUpdate() {
61+
if (!isRendering())
62+
throw new IllegalStateException("Already stoped");
63+
64+
Logger.i("Stop rendering device screen");
65+
mUpdateThread.interrupt();
66+
mUpdateThread = null;
67+
mImage = null;
68+
repaint();
69+
}
70+
71+
public void setScale(double scale) {
72+
Dimension d;
73+
if (mImage == null)
74+
d = new Dimension((int) (DEFAULT_SCREEN_SIZE.getWidth() * scale),
75+
(int) (DEFAULT_SCREEN_SIZE.getHeight() * scale));
76+
else
77+
d = new Dimension((int) (mImage.getWidth() * scale), (int) (mImage.getHeight() * scale));
78+
79+
if (!getPreferredSize().equals(d)) {
80+
setPreferredSize(d);
81+
((JFrame) getTopLevelAncestor()).pack();
82+
}
83+
}
84+
85+
@Override
86+
protected void paintComponent(Graphics g) {
87+
super.paintComponent(g);
88+
89+
if (mImage != null) {
90+
double dRatio = mImage.getWidth() / (double) mImage.getHeight();
91+
double fRatio = getWidth() / (double) getHeight();
92+
if (!Double.valueOf(dRatio).equals(fRatio))
93+
setScale(0.5);
94+
95+
g.drawImage(mImage, 0, 0, getWidth(), getHeight(), null);
96+
97+
} else {
98+
g.setColor(Color.BLACK);
99+
g.fillRect(0, 0, getWidth(), getHeight());
100+
101+
String text = "Nothing to show";
102+
g.setColor(Color.WHITE);
103+
int textWidth = g.getFontMetrics().stringWidth(text);
104+
g.drawString(text, (getWidth() - textWidth) / 2, getHeight() / 2);
105+
}
106+
}
107+
108+
private double computeTransformValue() {
109+
return (mImage == null ? DEFAULT_SCREEN_SIZE.getWidth() : mImage.getWidth()) / (double) getWidth();
110+
}
111+
112+
@Override
113+
public void keyTyped(KeyEvent e) {
114+
// TODO Auto-generated method stub
115+
116+
}
117+
118+
@Override
119+
public void keyPressed(KeyEvent e) {
120+
// TODO Auto-generated method stub
121+
122+
}
123+
124+
@Override
125+
public void keyReleased(KeyEvent e) {
126+
// TODO Auto-generated method stub
127+
128+
}
129+
130+
@Override
131+
public void mouseClicked(MouseEvent e) {
132+
double transform = computeTransformValue();
133+
mAdbHelper.performClick(e.getX() * transform, e.getY() * transform);
134+
}
135+
136+
@Override
137+
public void mousePressed(MouseEvent e) {
138+
mDownX = e.getX();
139+
mDownY = e.getY();
140+
mSwipeStartTime = System.currentTimeMillis();
141+
}
142+
143+
@Override
144+
public void mouseReleased(MouseEvent e) {
145+
int upX = e.getX(), upY = e.getY();
146+
147+
int dx = Math.abs(mDownX - upX);
148+
int dy = Math.abs(mDownY - upY);
149+
150+
if (dx > 5 && dy > 5) {
151+
double transform = computeTransformValue();
152+
long duration = System.currentTimeMillis() - mSwipeStartTime;
153+
mAdbHelper.performSwipe(mDownX * transform, mDownY * transform, upX * transform, upY * transform, duration);
154+
}
155+
}
156+
157+
@Override
158+
public void mouseEntered(MouseEvent e) {
159+
// TODO Auto-generated method stub
160+
161+
}
162+
163+
@Override
164+
public void mouseExited(MouseEvent e) {
165+
// TODO Auto-generated method stub
166+
167+
}
168+
169+
private class UpdateThread extends Thread {
170+
171+
@Override
172+
public void run() {
173+
super.run();
174+
long previousFrameTime = System.currentTimeMillis();
175+
176+
while (!Thread.interrupted()) {
177+
long currentFrameTime = System.currentTimeMillis();
178+
long dT = currentFrameTime - previousFrameTime;
179+
previousFrameTime = currentFrameTime;
180+
181+
if (LocalProperties.limitFrameRate && dT < MIN_SCREEN_REFRESH_INTERVAL)
182+
Utils.sleep(MIN_SCREEN_REFRESH_INTERVAL - dT);
183+
184+
if (Thread.interrupted())
185+
break;
186+
187+
try {
188+
mImage = mAdbHelper.retrieveScreenShot();
189+
190+
long t2 = System.currentTimeMillis();
191+
postFpsCount((t2 - currentFrameTime) / 1000d);
192+
193+
if (Thread.interrupted())
194+
mImage = null;
195+
196+
if (mImage == null)
197+
abort();
198+
else
199+
repaintPanel();
200+
201+
} catch (IIOException e) {
202+
e.printStackTrace();
203+
Logger.w("Corrupted data received from device, skipping one frame");
204+
// Screencap is partially corrupted for that frame, let's try at the next one
205+
} catch (IOException e) {
206+
e.printStackTrace();
207+
abort();
208+
}
209+
}
210+
}
211+
212+
private void abort() {
213+
interrupt();
214+
mUpdateThread = null;
215+
mImage = null;
216+
217+
Utils.executeOnUiThread(() -> {
218+
Logger.e("Unable to retrieve screen capture, aborting rendering...");
219+
repaint();
220+
});
221+
}
222+
223+
private void repaintPanel() {
224+
Utils.executeOnUiThread(AdbDeviceScreenComponent.this::repaint);
225+
}
226+
227+
private void postFpsCount(final double dt) {
228+
Utils.executeOnUiThread(() -> ((MainFrame) getTopLevelAncestor()).getTitleManger().postFpsCount(1d / dt));
229+
}
230+
}
231+
232+
}

src/main/java/com/majeur/ars/AdbHelper.java

Lines changed: 0 additions & 158 deletions
This file was deleted.

0 commit comments

Comments
 (0)