Replace RotationWatcher and DisplayFoldListener by a single
DisplayListener, which is notified whenever the display size or dpi
changes.
Still use the old version specifically for Android 14, where
DisplayListener may be broken (it is fixed in recent Android 14
upgrades), until we receive the first DisplayListener event (which
proves that it works).
Refs #4469 <https://github.com/Genymobile/scrcpy/pull/4469>
Co-authored-by: Simon Chan <1330321+yume-chan@users.noreply.github.com>
By adding the '?' prefix, the app is searched by its name instead of its
package name (it may take some time to retrieve the app names on the
device):
scrcpy --start-app=?firefox
An app matches if its label starts with the given name,
case-insensitive.
If '+' is also passed to force-stop the app before starting, then the
prefixes must be in that order:
scrcpy --start-app=+?firefox
The previous commit introduced:
scrcpy --start-app=name
By adding a '+' prefix, the app is stopped beforehand:
scrcpy --start-app=+name
This may be useful to start a fresh app on a new virtual display:
scrcpy --new-display --start-app=+org.mozilla.firefox
Add a command line option --start-app=name to start an Android app by
its package name. For example:
scrcpy --start-app=org.mozilla.firefox
The app will be started on the correct target display:
scrcpy --new-display --start-app=org.mozilla.firefox
Co-authored-by: Simon Chan <1330321+yume-chan@users.noreply.github.com>
Add a feature to create a new (separate) virtual display instead of
mirroring the device screen:
scrcpy --new-display=1920x1080
scrcpy --new-display=1920x1080/420 # force 420 dpi
scrcpy --new-display # use the default screen size and density
scrcpy --new-display=/240 # use the default screen size and 240 dpi
Co-authored-by: Simon Chan <1330321+yume-chan@users.noreply.github.com>
Co-authored-by: anirudhb <anirudhb@users.noreply.github.com>
Mouse and touch events must be sent to the virtual display id (used for
mirroring), other events (like key events) must be sent to the original
display id.
Co-authored-by: nightmare <mengyanshou@gmail.com>
When a new capture starts, send a new PositionMapper to the Controller
without using the global Device as an intermediate.
Now all Device methods are static.
Extract the function to convert coordinates from video space to display
space to a separate component.
It only requires the data it uses, it does not need a full ScreenInfo
(although it can be created from a ScreenInfo instance).
Remove from Device the functions using an implicit displayId.
Move them to Controller, which knows best which displayId it must use.
This will allow to properly dispatch events either to the origin display
or to the virtual display created for mirroring.
Add a function called before each capture starts (before getSize() is
called).
This allows to compute the ScreenInfo instance once exactly when needed.
Move the code related to screen size and rotation/fold to ScreenCapture.
For now, keep the ScreenInfo instance in the Device class to communicate
with the Controller, but it will be removed by further commits.
Scrcpy requires Android 5.0+, so there is no point testing for older
versions.
Btw, there were two mistakes:
- the constant name in AndroidVersions should have been
API_20_ANDROID_4_4W (Android 4.4 without 'W' is API 19)
- the method isInteractive() was introduced in Android 5.0, not 4.4W:
<037c33eae7%5E%21/>
Also adapt the call to build-tools/35.0.0/aidl, which now requires an
import path (-I. for the current directory).
Otherwise, it fails with:
ERROR: android/view/IRotationWatcher.aidl:23.1-10: directory ./ is not found in any of the import paths:
-
Also upgrade AGP (8.7.1) and Gradle (8.9), required for SDK 35.
<https://developer.android.com/build/releases/gradle-plugin#updating-gradle>
The server params were passed from the main thread to the server thread,
so a deep copy was performed in case the caller instance was destroyed.
But in practice, it only contains memory that lives until the end of the
program (command line arguments), so simply reference it. Several copies
of string fields were missing anyway.
With the old macros definitions, the type of the result depended on the
type of `sec`.
In particular, if sec is a 32-bit type, sec * 1000000 was likely to
overflow (even if the result was assigned to a sc_tick by the caller of
the macro).
This was the case on Windows, where the long type is a 32-bit signed
integer: the --time-limit argument, expressed in seconds, was first
parsed to a long value, then multiplied by 1000000 by the
SC_TICK_FROM_SEC() macro, causing an overflow when the value was greater
than 2147 (2^31 / 1000000).
Fixes#5355 <https://github.com/Genymobile/scrcpy/issues/5355>
Os.write() did not update the ByteBuffer position before Android 6.
A workaround was added by commit
b882322f7371b16acd53677c4a3adbaaed0aef77, which fixed part of the
problem, but the position was still not updated across calls, causing
the wrong chunk to be written.
Refs <d9f7e57f5d%5E%21/>
Replace argument suggestion:
--video-encoder='c2.android.avc.encoder'
by:
--video-encoder=c2.android.avc.encoder
On Linux, the quotes are interpreted by the shell, but on Windows they
are passed as is.
This was harmless, because even transmitted as is, they were interpreted
by the shell on the device. However, special characters are now
validated since commit bec3321fff4c6dc3b3dbc61fdc6fd98913988a78, making
the command fail.
Fixes#5329 <https://github.com/Genymobile/scrcpy/issues/5329>
The audio player had 2 roles:
- handle the SDL audio output device;
- resample input samples to maintain a target latency.
Extract the latter to a separate component (an "audio regulator"),
independent of SDL.
Moving classes into subpackages changed the expected imports order.
Reorganize them all at once automatically to avoid spurious changes in
future commits.