Under the new MtpStorageManager design of Android P,
media info like MP3 Track title, album and artist, Genre, etc
can not be retrieved via MTP
by Windows Media Player, Linux Rhythmbox and BMW Car Kit
Bug: 112635346
Test: Windows Media Player
Test: Linux Rhythmbox
Change-Id: Ibbdaff52a24fa36c6090e799323b767dd5692207
(cherry picked from commit 7784da12b9b3394beb791b16befcd33075668270)
For packages:
android.mtp
This is an automatically generated CL. See go/UnsupportedAppUsage
for more details.
Exempted-From-Owner-Approval: Mechanical changes to the codebase
which have been approved by Android API council and announced on
android-eng@
Bug: 110868826
Test: m
Change-Id: Id97d70dc1003cd7c6ed585d647bf0df0fd7a946a
Under MTP mode, new file created at device side shown size zero at PC side
due to file information is not updated to PC in time with ObjectAdded event
Bug: 77883345
Test: 1. Take screenshot of device under MTP mode with Win10 / Linux
2. file copy, delete, rename between PC and device
3. file copy, delete, rename on device with adb shell command
Test: adb shell am instrument -w android.mtp/
android.support.test.runner.AndroidJUnitRunner
Change-Id: If428064fb0104b53b8afd5b050a4fab4a09312f0
Streams are dispreferred in Android java, so
use Lists for all cases instead.
Test: Mtp works and MtpStorageManager tests pass
Change-Id: I0579013fca690346c6c2561fe3079fd50f215833
External sdcards are accessed through /mnt/media_rw,
so access() each touched file for sdcardfs to update
its metadata.
Java handles single object renames directly so that
is the only place where it is needed.
Bug: 77849654
Test: use mtp with emulated sdcard
Change-Id: Ie460398010f1fe74d8084808a6333b121674362c
Due to permissions changes, we now need to access
the underlying filesystem of removable devices in
order to get write access.
Add internalPath to StorageVolume, and have VolumeInfo
set the field on creation.
Bug: 77849654
Test: Can write to emulated sdcard through MTP
Change-Id: I63302ecf2dd2600a1c9f3f6ab106c3695654cbaa
If MtpService stops before MtpServer
shuts down, the server will be null,
so don't attempt to use it in that
case.
Bug: 76433619
Test: no errors
Change-Id: I6744cb78908e6a0663a4b60107d5c9c18dda62bb
The current model for setting up a functionfs
function is:
UsbDeviceManager#setCurrentFunctions() ->
intent is sent to MtpReceiver to write the descriptors ->
init/hal waits for descriptors to write, then pulls up gadget ->
Gadget is configured, a USB_STATE intent starts MtpServer
The main downside of this is a lack of reliability because
the Mtp process could be killed at any point. Normally, a
gadget is unbound if its control endpoint is closed. no_disconnect
works around this, but is still a little janky. In addition, the
extra intent delays the startup of the gadget.
With the new model, UsbDeviceManager writes the descriptors
on initialization. Since it is a system service, it won't be killed.
UsbDeviceManager#setCurrentFunctions() ->
init/hal pulls up gadget ->
Gadget is configured, a USB_STATE intent starts MtpServer
MtpServer calls UsbManager#getControlFd to get a dup of the control
endpoint.
Also modify permissions so system server can access mtp files.
Bug: 72877174
Test: Change usb configurations to ptp/mtp
Change-Id: Id17d2b5930f4e1f37ec1b4f00add9d594174ad49
Getting the content provider could
return null in some cases where the user
is locked, so check for that when closing.
Bug: 73656609
Test: no crash
Change-Id: I607cd2da5348520616a1c171d0d8a1afacabe592
MtpStorageManager keeps track of file information and
send notifications for new files. MtpDatabase now uses
this instead of MediaProvider for getting object information,
although some operations are still reflected into MP.
Since MtpStorageManager handles storage ids, remove
that field from StorageVolume and VolumeInfo.
Clean up a lot of the jni code for MtpDatabase.
Bug: 63143623
Test: Test every MtpOperation in a variety of situations on Linux and
Windows. Also use the shell to manipulate files. Verify that the cache
is consistent throughout, and the operations behave as expected. Verify
files created by the shell appear.
Test: adb shell am instrument -w android.mtp /android.support.test.runner.AndroidJUnitRunner
Change-Id: Id4ea810047b0c323399cd833047733e5daafb30a
MtpServer needs this function to update the database for directory
copy operation.
Test: Call this function from MtpServer and database is updated in
directory copy scenario.
Change-Id: I9b316f4dbf7f35922292c33ab02f9efebc867aa8
Signed-off-by: kyle_tso <kyle_tso@htc.com>
When moving between different storages, the storageId
must be changed as well.
Bug: 67028892
Test: Move between storages with virtual sdcard.
Change-Id: Ie82aa8d53686bfffb7c26b46a49524a00f2f0214
This is needed to implement the MTP MOVE_OBJECT operation.
Bug: 66679910
Test: Move objects and folders, verify mediastore is consistent
Change-Id: I2f4f0c43134fb3ff82745166c051712cc1736b7f
MtpService has been changed to a singleton service
running in user 0, so the original context will
be that of user 0. Accesses to MediaProvider and
MediaScanner should use the new passed in user context
in order to access user data, while the broadcast
receiver for battery data will use the original context.
Bug: 64822515
Test: Use Mtp and switch users.
Change-Id: Ic181258337944db7dc6f6097c967cb104df938d3
CloseGuard instances are allocated in constructors and usually
assigned to final fields. This implies they're non-null in finalizers
except in the case where the constructor throws. We add a null check
to make sure we can continue cleaning up other state in the finalizer
(if applicable).
Also, this change decouples closeguard warnings in constructors
from other state based logic. This because the logic there is usually
duplicated with the call to close().
NOTE: This change is not a "complete" fix. Many of these finalizers
are broken in the case where <init> throws. The only objective of
this change is to make such errors more obvious.
Note that some of these classes don't have CTS tests.
Test: make, CtsMediaTestCases.
Bug: 35609098
Change-Id: I24d9e0215f80e44914dba8ab99b6312fd6ed1fc0
Property value is based on the particular device.
This allows some hosts (windows) to apply a device
specific icon in file explorer.
Test: Connect device to windows, verify new icon
Bug: 25360563
Change-Id: I9d3468ca8c01a6f0d42ad543aef11ed265b6c825
This is part of weaning apps off accessing system identifiers via
system properties API. Apps should use android.os.Build API instead.
Bug: 33700679
Test: Enable MTP mode then check that mtp-detect output same as before this commit
Change-Id: I4e6696cdee18b9c3e987c432c095911e85a997db
Functionfs requires MtpServer to write descriptors before the device can be
configured. This adds a new configure call that will occur only when
functions are changed (new argument added to updateUsbStateBroadcast for this)
and be called after sys.usb.config is changed but before the waitForState
call to ensure compatibility with configfs devices.
Bug: 30976142
Change-Id: I7e94a5847d3b19c0fd75139e1b15a3f2a1cea01d
Test: Manual
The USB data transfer is disabled we should not allow access MTP devices
(e.g.
usb sticks). We have two ways of accessing them: Either by mounting them
or by creating a MTPDevice in an app.
Of course an app could implement implement their own MTPDevice
implementation. In this case we cannot enforce the policy without
completely suppressing all MTP USB devices which would be too
restrictive.
Note: When the policy is set we do _not_ disconnect already connected
MTP devices
Fixes: 31472955
Change-Id: I6080c48c49657102774b2b3b4d89ff030245a266
The USB data transfer is disabled we should not allow access MTP devices (e.g.
usb sticks). We have two ways of accessing them: Either by mounting them
or by creating a MTPDevice in an app.
Of course an app could implement implement their own MTPDevice
implementation. In this case we cannot enforce the policy without
completely suppressing all MTP USB devices which would be too
restrictive.
Note: When the policy is set we do _not_ disconnect already connected
MTP devices
Fixes: 31472955
Change-Id: I6080c48c49657102774b2b3b4d89ff030245a266
The CL adds onTerminate runner to MtpServer constructor's arguments to
know when MtpServer stops its thread.
BUG=29971895
Change-Id: I685ad6bc663f76e04ae3837129cbe12805d2093c
Previously MtpDevice#readEvent does not have throws IOException at its
definition, though internal JNI functions throws it.
BUG=28254719
Change-Id: I4e6cf8003d168b7e732c4b4eb2eafe52a12442c2
* MtpEvent: Remove public constructor since properties cannot be set
directly.
* MtpEvent: Move event constants from MtpConstants to MtpEvent class.
* getPartialObject64: the byte[] must have indices of Integer.MAX_VALUE
at most. Document as such.
* sendObjectInfo: what happens if the transfer doesn’t succeed? How is
the app notified? If there is a reason for the failure communicated,
how does the app find this out? Add docs.
* Add isOperationSupported(int) and isEventSupported(int) helpers.
Change-Id: Ifd80016d2ddd3b66d5c45f6da76b6133f0c9a617
Fixes: 28146379
In the MTP spec, the object size is stored in MtpObjectInfo as unsigned
32-bit integer and fetched by the getObjectInfo operation. For the
objects that are more than 4GB, the object size is provided as one of
extra properties, which are fetched by different operation.
The CL adds to getObjectSizeLong hidden method to Java MtpDevice class
so that client code can obtain 4GB+ object size.
BUG=27805369
Change-Id: I8a5b85c8db39734f00e49709c61b271eb48ff33d
In MTP code, we use jint for ID (e.g. object handle) and code (property
code). But getObjectPropertyValue takes jlong and it causes missing
property values in Java code. Previously we passed the long value to
Map<Integer, MtpPropertyGroup>#get(Integer) and the compiler somehow
accepted the code. However it actually takes Long at runtime, so the
properties are never found.
BUG=26437284
Change-Id: I79defd325ea5d20c4dce84d891d984e24abcacc5