18182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood/*
28182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood * Copyright (C) 2010 The Android Open Source Project
38182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood *
48182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License");
58182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood * you may not use this file except in compliance with the License.
68182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood * You may obtain a copy of the License at
78182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood *
88182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood *      http://www.apache.org/licenses/LICENSE-2.0
98182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood *
108182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood * Unless required by applicable law or agreed to in writing, software
118182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS,
128182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood * See the License for the specific language governing permissions and
148182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood * limitations under the License.
158182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood */
168182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
178182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwoodpackage android.mtp;
188182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
19c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.UsbDevice;
20acc29cc91be634070c92a807df412ced97b9b375Mike Lockwoodimport android.hardware.usb.UsbDeviceConnection;
218182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
228182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood/**
230cdd9f7def708a71a0d0722361f52c0416370dc6Scott Main * This class represents an MTP or PTP device connected on the USB host bus. An application can
240cdd9f7def708a71a0d0722361f52c0416370dc6Scott Main * instantiate an object of this type, by referencing an attached {@link
250cdd9f7def708a71a0d0722361f52c0416370dc6Scott Main * android.hardware.usb.UsbDevice} and then use methods in this class to get information about the
260cdd9f7def708a71a0d0722361f52c0416370dc6Scott Main * device and objects stored on it, as well as open the connection and transfer data.
278182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood */
288182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwoodpublic final class MtpDevice {
298182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
308182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private static final String TAG = "MtpDevice";
318182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
328182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private final UsbDevice mDevice;
338182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
348182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    static {
358182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        System.loadLibrary("media_jni");
368182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
378182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
38540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood    /**
39540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * MtpClient constructor
40540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     *
41c4308f01c965571dc2354107c3574df113e397eeMike Lockwood     * @param device the {@link android.hardware.usb.UsbDevice} for the MTP or PTP device
42540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     */
438182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public MtpDevice(UsbDevice device) {
448182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        mDevice = device;
458182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
468182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
47540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood    /**
48acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood     * Opens the MTP device.  Once the device is open it takes ownership of the
49acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood     * {@link android.hardware.usb.UsbDeviceConnection}.
50acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood     * The connection will be closed when you call {@link #close()}
51acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood     * The connection will also be closed if this method fails.
52540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     *
53acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood     * @param connection an open {@link android.hardware.usb.UsbDeviceConnection} for the device
54540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @return true if the device was successfully opened.
55540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     */
56acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood    public boolean open(UsbDeviceConnection connection) {
57acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood        boolean result = native_open(mDevice.getDeviceName(), connection.getFileDescriptor());
58acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood        if (!result) {
59acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood            connection.close();
608182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        }
61acc29cc91be634070c92a807df412ced97b9b375Mike Lockwood        return result;
628182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
638182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
64540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood    /**
6511dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * Closes all resources related to the MtpDevice object.
6611dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * After this is called, the object can not be used until {@link #open} is called again
6711dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * with a new {@link android.hardware.usb.UsbDeviceConnection}.
68540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     */
698182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public void close() {
708182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        native_close();
718182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
728182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
738182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    @Override
748182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    protected void finalize() throws Throwable {
758182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        try {
768182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood            native_close();
778182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        } finally {
788182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood            super.finalize();
798182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        }
808182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
818182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
82540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood    /**
83540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * Returns the name of the USB device
8411dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * This returns the same value as {@link android.hardware.usb.UsbDevice#getDeviceName}
8511dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * for the device's {@link android.hardware.usb.UsbDevice}
86540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     *
87540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @return the device name
88540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     */
898182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public String getDeviceName() {
908182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mDevice.getDeviceName();
918182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
928182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
93540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood    /**
9411dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * Returns the USB ID of the USB device.
9511dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * This returns the same value as {@link android.hardware.usb.UsbDevice#getDeviceId}
9611dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * for the device's {@link android.hardware.usb.UsbDevice}
97540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     *
98540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @return the device ID
99540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     */
1008182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public int getDeviceId() {
1018182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mDevice.getDeviceId();
1028182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
1038182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
1048182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    @Override
1058182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public String toString() {
1068182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return mDevice.getDeviceName();
1078182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
1088182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
109540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood    /**
11011dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * Returns the {@link MtpDeviceInfo} for this device
111540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     *
112540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @return the device info
113540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     */
1148182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public MtpDeviceInfo getDeviceInfo() {
1158182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return native_get_device_info();
1168182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
1178182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
118540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood    /**
119540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * Returns the list of IDs for all storage units on this device
12011dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * Information about each storage unit can be accessed via {@link #getStorageInfo}.
121540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     *
12211dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * @return the list of storage IDs
123540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     */
1248182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public int[] getStorageIds() {
1258182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return native_get_storage_ids();
1268182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
1278182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
128540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood    /**
129540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * Returns the list of object handles for all objects on the given storage unit,
130540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * with the given format and parent.
13111dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * Information about each object can be accessed via {@link #getObjectInfo}.
132540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     *
133540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @param storageId the storage unit to query
134540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @param format the format of the object to return, or zero for all formats
135540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @param objectHandle the parent object to query, or zero for the storage root
136540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @return the object handles
137540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     */
1388182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public int[] getObjectHandles(int storageId, int format, int objectHandle) {
1398182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return native_get_object_handles(storageId, format, objectHandle);
1408182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
1418182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
142540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood    /**
143540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * Returns the data for an object as a byte array.
14411dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * This call may block for an arbitrary amount of time depending on the size
14511dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * of the data and speed of the devices.
146540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     *
147540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @param objectHandle handle of the object to read
148540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @param objectSize the size of the object (this should match
14911dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     *      {@link MtpObjectInfo#getCompressedSize}
150540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @return the object's data, or null if reading fails
151540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     */
1528182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public byte[] getObject(int objectHandle, int objectSize) {
1538182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return native_get_object(objectHandle, objectSize);
1548182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
1558182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
156540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood    /**
157540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * Returns the thumbnail data for an object as a byte array.
15811dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * The size and format of the thumbnail data can be determined via
15911dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * {@link MtpObjectInfo#getThumbCompressedSize} and
16011dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * {@link MtpObjectInfo#getThumbFormat}.
16111dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * For typical devices the format is JPEG.
162540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     *
163540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @param objectHandle handle of the object to read
164540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @return the object's thumbnail, or null if reading fails
165540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     */
1668182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public byte[] getThumbnail(int objectHandle) {
1678182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return native_get_thumbnail(objectHandle);
1688182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
1698182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
170540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood    /**
17111dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * Retrieves the {@link MtpStorageInfo} for a storage unit.
172540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     *
173540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @param storageId the ID of the storage unit
174540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @return the MtpStorageInfo
175540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     */
1768182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public MtpStorageInfo getStorageInfo(int storageId) {
1778182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return native_get_storage_info(storageId);
1788182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
1798182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
180540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood    /**
18111dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * Retrieves the {@link MtpObjectInfo} for an object.
182540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     *
183540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @param objectHandle the handle of the object
184540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @return the MtpObjectInfo
185540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     */
1868182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public MtpObjectInfo getObjectInfo(int objectHandle) {
1878182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return native_get_object_info(objectHandle);
1888182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
1898182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
190540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood    /**
19111dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * Deletes an object on the device.  This call may block, since
19211dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * deleting a directory containing many files may take a long time
19311dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * on some devices.
194540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     *
195540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @param objectHandle handle of the object to delete
196540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @return true if the deletion succeeds
197540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     */
1988182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public boolean deleteObject(int objectHandle) {
1998182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return native_delete_object(objectHandle);
2008182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
2018182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
202540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood    /**
203540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * Retrieves the object handle for the parent of an object on the device.
204540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     *
205540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @param objectHandle handle of the object to query
206540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @return the parent's handle, or zero if it is in the root of the storage
207540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     */
2088182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public long getParent(int objectHandle) {
2098182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return native_get_parent(objectHandle);
2108182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
2118182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
212540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood    /**
213540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * Retrieves the ID of the storage unit containing the given object on the device.
214540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     *
215540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @param objectHandle handle of the object to query
216540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @return the object's storage unit ID
217540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     */
21862cfeeb821afb2f3d3b78ad93caa13408cd26eacMike Lockwood    public long getStorageId(int objectHandle) {
2198182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return native_get_storage_id(objectHandle);
2208182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
2218182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
222540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood    /**
223540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * Copies the data for an object to a file in external storage.
22411dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * This call may block for an arbitrary amount of time depending on the size
22511dd5ae97b1cd5889bb66862fd12718da62a9c75Mike Lockwood     * of the data and speed of the devices.
226540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     *
227540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @param objectHandle handle of the object to read
228540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @param destPath path to destination for the file transfer.
229540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     *      This path should be in the external storage as defined by
230540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     *      {@link android.os.Environment#getExternalStorageDirectory}
231540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     * @return true if the file transfer succeeds
232540380fb0a45b12af3970f9ea1ed041607451f46Mike Lockwood     */
2338182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    public boolean importFile(int objectHandle, String destPath) {
2348182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        return native_import_file(objectHandle, destPath);
2358182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
2368182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
2378182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    // used by the JNI code
238e2e59326f13cf291bf5b37989390fd2a55a94f0cAshok Bhat    private long mNativeContext;
2398182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
2408182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private native boolean native_open(String deviceName, int fd);
2418182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private native void native_close();
2428182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private native MtpDeviceInfo native_get_device_info();
2438182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private native int[] native_get_storage_ids();
2448182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private native MtpStorageInfo native_get_storage_info(int storageId);
2458182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private native int[] native_get_object_handles(int storageId, int format, int objectHandle);
2468182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private native MtpObjectInfo native_get_object_info(int objectHandle);
2478182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private native byte[] native_get_object(int objectHandle, int objectSize);
2488182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private native byte[] native_get_thumbnail(int objectHandle);
2498182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private native boolean native_delete_object(int objectHandle);
2508182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private native long native_get_parent(int objectHandle);
2518182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private native long native_get_storage_id(int objectHandle);
2528182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    private native boolean native_import_file(int objectHandle, String destPath);
2538182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood}
254