MtpDatabase.java revision e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6a
1d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood/* 2d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * Copyright (C) 2010 The Android Open Source Project 3d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * 4d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 5d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * you may not use this file except in compliance with the License. 6d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * You may obtain a copy of the License at 7d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * 8d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 9d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * 10d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * Unless required by applicable law or agreed to in writing, software 11d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 12d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * See the License for the specific language governing permissions and 14d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * limitations under the License. 15d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood */ 16d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 17d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodpackage android.media; 18d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 19d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodimport android.content.Context; 20d815f79766984fce499e147ecbacc01914683f74Mike Lockwoodimport android.content.ContentValues; 21d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodimport android.content.IContentProvider; 222837eefc5459427138c080d445bb491c75630163Mike Lockwoodimport android.content.Intent; 23d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodimport android.database.Cursor; 2459e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwoodimport android.database.sqlite.SQLiteDatabase; 25d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodimport android.net.Uri; 262b5f9ad1eaf0d6daaca5cf3761434a09309902bbMike Lockwoodimport android.os.Environment; 27d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodimport android.os.RemoteException; 289a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwoodimport android.provider.MediaStore.Audio; 293b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwoodimport android.provider.MediaStore.Files; 30ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwoodimport android.provider.MediaStore.Images; 31ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwoodimport android.provider.MediaStore.MediaColumns; 322837eefc5459427138c080d445bb491c75630163Mike Lockwoodimport android.provider.Mtp; 33e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwoodimport android.text.format.Time; 34d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodimport android.util.Log; 35d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 365ebac83e20dadf10bd4a0cee4ddf69d0ec049f98Mike Lockwoodimport java.io.File; 375ebac83e20dadf10bd4a0cee4ddf69d0ec049f98Mike Lockwood 38d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood/** 39d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * {@hide} 40d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood */ 41d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodpublic class MtpDatabase { 42d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 43d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood private static final String TAG = "MtpDatabase"; 44d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 452837eefc5459427138c080d445bb491c75630163Mike Lockwood private final Context mContext; 46d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood private final IContentProvider mMediaProvider; 47d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood private final String mVolumeName; 48d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood private final Uri mObjectsUri; 4901788562f26f213f63c14483fd3977e23b8314abMike Lockwood private final String mMediaStoragePath; 502b5f9ad1eaf0d6daaca5cf3761434a09309902bbMike Lockwood private final String mExternalStoragePath; 51d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 522837eefc5459427138c080d445bb491c75630163Mike Lockwood // true if the database has been modified in the current MTP session 532837eefc5459427138c080d445bb491c75630163Mike Lockwood private boolean mDatabaseModified; 542837eefc5459427138c080d445bb491c75630163Mike Lockwood 5559e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood // database for writable MTP device properties 5659e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood private SQLiteDatabase mDevicePropDb; 5759e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood private static final int DEVICE_PROPERTIES_DATABASE_VERSION = 1; 5859e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 59b2cada9034436b4ea4bac218da7a1e29460d15b2Mike Lockwood // FIXME - this should be passed in via the constructor 60b2cada9034436b4ea4bac218da7a1e29460d15b2Mike Lockwood private final int mStorageID = 0x00010001; 61b2cada9034436b4ea4bac218da7a1e29460d15b2Mike Lockwood 62d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood private static final String[] ID_PROJECTION = new String[] { 633b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood Files.FileColumns._ID, // 0 64d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood }; 656a6a3aff17e057eeb1457ac4d04ab4b5e8f53abeMike Lockwood private static final String[] PATH_PROJECTION = new String[] { 665ebac83e20dadf10bd4a0cee4ddf69d0ec049f98Mike Lockwood Files.FileColumns._ID, // 0 675ebac83e20dadf10bd4a0cee4ddf69d0ec049f98Mike Lockwood Files.FileColumns.DATA, // 1 685ebac83e20dadf10bd4a0cee4ddf69d0ec049f98Mike Lockwood }; 69d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood private static final String[] PATH_SIZE_PROJECTION = new String[] { 703b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood Files.FileColumns._ID, // 0 713b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood Files.FileColumns.DATA, // 1 723b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood Files.FileColumns.SIZE, // 2 73d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood }; 74d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood private static final String[] OBJECT_INFO_PROJECTION = new String[] { 753b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood Files.FileColumns._ID, // 0 763b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood Files.FileColumns.DATA, // 1 773b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood Files.FileColumns.FORMAT, // 2 783b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood Files.FileColumns.PARENT, // 3 793b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood Files.FileColumns.SIZE, // 4 803b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood Files.FileColumns.DATE_MODIFIED, // 5 81d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood }; 823b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood private static final String ID_WHERE = Files.FileColumns._ID + "=?"; 833b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood private static final String PARENT_WHERE = Files.FileColumns.PARENT + "=?"; 84d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood private static final String PARENT_FORMAT_WHERE = PARENT_WHERE + " AND " 853b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood + Files.FileColumns.FORMAT + "=?"; 86d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 8759e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood private static final String[] DEVICE_PROPERTY_PROJECTION = new String[] { "_id", "value" }; 8859e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood private static final String DEVICE_PROPERTY_WHERE = "code=?"; 8959e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 90d815f79766984fce499e147ecbacc01914683f74Mike Lockwood private final MediaScanner mMediaScanner; 91d815f79766984fce499e147ecbacc01914683f74Mike Lockwood 92d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood static { 93d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood System.loadLibrary("media_jni"); 94d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 95d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 9601788562f26f213f63c14483fd3977e23b8314abMike Lockwood public MtpDatabase(Context context, String volumeName, String storagePath) { 97d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood native_setup(); 98d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 992837eefc5459427138c080d445bb491c75630163Mike Lockwood mContext = context; 100d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood mMediaProvider = context.getContentResolver().acquireProvider("media"); 101d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood mVolumeName = volumeName; 10201788562f26f213f63c14483fd3977e23b8314abMike Lockwood mMediaStoragePath = storagePath; 1032b5f9ad1eaf0d6daaca5cf3761434a09309902bbMike Lockwood mExternalStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath(); 1048490e66f57506d4e4b05e7c987c7ca34295843e6Mike Lockwood mObjectsUri = Files.getMtpObjectsUri(volumeName); 105d815f79766984fce499e147ecbacc01914683f74Mike Lockwood mMediaScanner = new MediaScanner(context); 10659e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood openDevicePropertiesDatabase(context); 107d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 108d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 109d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood @Override 110dbead321daf2c16dc74e182bec591b278cfccb2cMike Lockwood protected void finalize() throws Throwable { 111dbead321daf2c16dc74e182bec591b278cfccb2cMike Lockwood try { 112dbead321daf2c16dc74e182bec591b278cfccb2cMike Lockwood native_finalize(); 113dbead321daf2c16dc74e182bec591b278cfccb2cMike Lockwood } finally { 114dbead321daf2c16dc74e182bec591b278cfccb2cMike Lockwood super.finalize(); 115dbead321daf2c16dc74e182bec591b278cfccb2cMike Lockwood } 116d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 117d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 1182b5f9ad1eaf0d6daaca5cf3761434a09309902bbMike Lockwood private String externalToMediaPath(String path) { 1192b5f9ad1eaf0d6daaca5cf3761434a09309902bbMike Lockwood // convert external storage path to media path 1202b5f9ad1eaf0d6daaca5cf3761434a09309902bbMike Lockwood if (path != null && mMediaStoragePath != null 1212b5f9ad1eaf0d6daaca5cf3761434a09309902bbMike Lockwood && mExternalStoragePath != null 1222b5f9ad1eaf0d6daaca5cf3761434a09309902bbMike Lockwood && path.startsWith(mExternalStoragePath)) { 1232b5f9ad1eaf0d6daaca5cf3761434a09309902bbMike Lockwood path = mMediaStoragePath + path.substring(mExternalStoragePath.length()); 1242b5f9ad1eaf0d6daaca5cf3761434a09309902bbMike Lockwood } 1252b5f9ad1eaf0d6daaca5cf3761434a09309902bbMike Lockwood return path; 1262b5f9ad1eaf0d6daaca5cf3761434a09309902bbMike Lockwood } 1272b5f9ad1eaf0d6daaca5cf3761434a09309902bbMike Lockwood 12859e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood private void openDevicePropertiesDatabase(Context context) { 12959e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood mDevicePropDb = context.openOrCreateDatabase("device-properties", Context.MODE_PRIVATE, null); 13059e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood int version = mDevicePropDb.getVersion(); 13159e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 13259e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood // initialize if necessary 13359e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood if (version != DEVICE_PROPERTIES_DATABASE_VERSION) { 13459e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood mDevicePropDb.execSQL("CREATE TABLE properties (" + 13559e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood "_id INTEGER PRIMARY KEY AUTOINCREMENT," + 13659e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood "code INTEGER UNIQUE ON CONFLICT REPLACE," + 13759e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood "value TEXT" + 13859e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood ");"); 13959e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood mDevicePropDb.execSQL("CREATE INDEX property_index ON properties (code);"); 14059e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood mDevicePropDb.setVersion(DEVICE_PROPERTIES_DATABASE_VERSION); 14159e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood } 14259e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood } 14359e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 144d815f79766984fce499e147ecbacc01914683f74Mike Lockwood private int beginSendObject(String path, int format, int parent, 145d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood int storage, long size, long modified) { 1462837eefc5459427138c080d445bb491c75630163Mike Lockwood mDatabaseModified = true; 147d815f79766984fce499e147ecbacc01914683f74Mike Lockwood ContentValues values = new ContentValues(); 1483b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood values.put(Files.FileColumns.DATA, path); 1493b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood values.put(Files.FileColumns.FORMAT, format); 1503b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood values.put(Files.FileColumns.PARENT, parent); 151d815f79766984fce499e147ecbacc01914683f74Mike Lockwood // storage is ignored for now 1523b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood values.put(Files.FileColumns.SIZE, size); 1533b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood values.put(Files.FileColumns.DATE_MODIFIED, modified); 154d815f79766984fce499e147ecbacc01914683f74Mike Lockwood 155d815f79766984fce499e147ecbacc01914683f74Mike Lockwood try { 156d815f79766984fce499e147ecbacc01914683f74Mike Lockwood Uri uri = mMediaProvider.insert(mObjectsUri, values); 157d815f79766984fce499e147ecbacc01914683f74Mike Lockwood if (uri != null) { 158d815f79766984fce499e147ecbacc01914683f74Mike Lockwood return Integer.parseInt(uri.getPathSegments().get(2)); 159d815f79766984fce499e147ecbacc01914683f74Mike Lockwood } else { 160d815f79766984fce499e147ecbacc01914683f74Mike Lockwood return -1; 161d815f79766984fce499e147ecbacc01914683f74Mike Lockwood } 162d815f79766984fce499e147ecbacc01914683f74Mike Lockwood } catch (RemoteException e) { 163d815f79766984fce499e147ecbacc01914683f74Mike Lockwood Log.e(TAG, "RemoteException in beginSendObject", e); 164d815f79766984fce499e147ecbacc01914683f74Mike Lockwood return -1; 165d815f79766984fce499e147ecbacc01914683f74Mike Lockwood } 166d815f79766984fce499e147ecbacc01914683f74Mike Lockwood } 167d815f79766984fce499e147ecbacc01914683f74Mike Lockwood 168d815f79766984fce499e147ecbacc01914683f74Mike Lockwood private void endSendObject(String path, int handle, int format, boolean succeeded) { 169d815f79766984fce499e147ecbacc01914683f74Mike Lockwood if (succeeded) { 1709a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood // handle abstract playlists separately 1719a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood // they do not exist in the file system so don't use the media scanner here 1725367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood if (format == MtpConstants.FORMAT_ABSTRACT_AV_PLAYLIST) { 1739a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood // Strip Windows Media Player file extension 1749a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood if (path.endsWith(".pla")) { 1759a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood path = path.substring(0, path.length() - 4); 1769a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } 1779a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood 1789a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood // extract name from path 1799a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood String name = path; 1809a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood int lastSlash = name.lastIndexOf('/'); 1819a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood if (lastSlash >= 0) { 1829a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood name = name.substring(lastSlash + 1); 1839a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } 1849a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood 1859a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood ContentValues values = new ContentValues(1); 1869a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood values.put(Audio.Playlists.DATA, path); 1879a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood values.put(Audio.Playlists.NAME, name); 1889a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood values.put(MediaColumns.MEDIA_SCANNER_NEW_OBJECT_ID, handle); 1899a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood try { 1909a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood Uri uri = mMediaProvider.insert(Audio.Playlists.EXTERNAL_CONTENT_URI, values); 1919a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } catch (RemoteException e) { 1929a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood Log.e(TAG, "RemoteException in endSendObject", e); 1939a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } 1949a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } else { 195c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood mMediaScanner.scanMtpFile(path, mVolumeName, handle, format); 1969a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } 197d815f79766984fce499e147ecbacc01914683f74Mike Lockwood } else { 198d815f79766984fce499e147ecbacc01914683f74Mike Lockwood deleteFile(handle); 199d815f79766984fce499e147ecbacc01914683f74Mike Lockwood } 200d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 201d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 202d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood private int[] getObjectList(int storageID, int format, int parent) { 203d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood // we can ignore storageID until we support multiple storages 204d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood Log.d(TAG, "getObjectList parent: " + parent); 205d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood Cursor c = null; 206d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood try { 207d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (format != 0) { 208d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood c = mMediaProvider.query(mObjectsUri, ID_PROJECTION, 209d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood PARENT_FORMAT_WHERE, 210d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood new String[] { Integer.toString(parent), Integer.toString(format) }, 211d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood null); 212d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } else { 213d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood c = mMediaProvider.query(mObjectsUri, ID_PROJECTION, 214d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood PARENT_WHERE, new String[] { Integer.toString(parent) }, null); 215d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 216d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (c == null) { 217d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood Log.d(TAG, "null cursor"); 218d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return null; 219d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 220d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood int count = c.getCount(); 221d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (count > 0) { 222d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood int[] result = new int[count]; 223d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood for (int i = 0; i < count; i++) { 224d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood c.moveToNext(); 225d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood result[i] = c.getInt(0); 226d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 227d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood Log.d(TAG, "returning " + result); 228d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return result; 229d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 230d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } catch (RemoteException e) { 231d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood Log.e(TAG, "RemoteException in getObjectList", e); 232d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } finally { 233d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (c != null) { 234d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood c.close(); 235d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 236d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 237d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return null; 238d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 239d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 2407a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood private int getNumObjects(int storageID, int format, int parent) { 2417a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood // we can ignore storageID until we support multiple storages 2427a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood Log.d(TAG, "getObjectList parent: " + parent); 2437a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood Cursor c = null; 2447a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood try { 2457a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood if (format != 0) { 2467a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood c = mMediaProvider.query(mObjectsUri, ID_PROJECTION, 2477a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood PARENT_FORMAT_WHERE, 2487a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood new String[] { Integer.toString(parent), Integer.toString(format) }, 2497a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood null); 2507a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood } else { 2517a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood c = mMediaProvider.query(mObjectsUri, ID_PROJECTION, 2527a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood PARENT_WHERE, new String[] { Integer.toString(parent) }, null); 2537a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood } 2547a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood if (c != null) { 2557a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood return c.getCount(); 2567a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood } 2577a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood } catch (RemoteException e) { 2587a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood Log.e(TAG, "RemoteException in getNumObjects", e); 2597a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood } finally { 2607a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood if (c != null) { 2617a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood c.close(); 2627a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood } 2637a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood } 2647a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood return -1; 2657a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood } 2667a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood 2674b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood private int[] getSupportedPlaybackFormats() { 2684b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood return new int[] { 269e521169ff5dc6cbe1762bd7a049d95b56cc657eeMike Lockwood // allow transfering arbitrary files 270e521169ff5dc6cbe1762bd7a049d95b56cc657eeMike Lockwood MtpConstants.FORMAT_UNDEFINED, 27112b8a99fc1d4acc427307a4a924bf33745410260Mike Lockwood 272792ec849e5bc27c090c62f578846b888fa43e0d6Mike Lockwood MtpConstants.FORMAT_ASSOCIATION, 27312b8a99fc1d4acc427307a4a924bf33745410260Mike Lockwood MtpConstants.FORMAT_TEXT, 27412b8a99fc1d4acc427307a4a924bf33745410260Mike Lockwood MtpConstants.FORMAT_HTML, 27512b8a99fc1d4acc427307a4a924bf33745410260Mike Lockwood MtpConstants.FORMAT_WAV, 27612b8a99fc1d4acc427307a4a924bf33745410260Mike Lockwood MtpConstants.FORMAT_MP3, 27712b8a99fc1d4acc427307a4a924bf33745410260Mike Lockwood MtpConstants.FORMAT_MPEG, 27812b8a99fc1d4acc427307a4a924bf33745410260Mike Lockwood MtpConstants.FORMAT_EXIF_JPEG, 27912b8a99fc1d4acc427307a4a924bf33745410260Mike Lockwood MtpConstants.FORMAT_TIFF_EP, 28012b8a99fc1d4acc427307a4a924bf33745410260Mike Lockwood MtpConstants.FORMAT_GIF, 28112b8a99fc1d4acc427307a4a924bf33745410260Mike Lockwood MtpConstants.FORMAT_JFIF, 28212b8a99fc1d4acc427307a4a924bf33745410260Mike Lockwood MtpConstants.FORMAT_PNG, 28312b8a99fc1d4acc427307a4a924bf33745410260Mike Lockwood MtpConstants.FORMAT_TIFF, 28412b8a99fc1d4acc427307a4a924bf33745410260Mike Lockwood MtpConstants.FORMAT_WMA, 28512b8a99fc1d4acc427307a4a924bf33745410260Mike Lockwood MtpConstants.FORMAT_OGG, 28612b8a99fc1d4acc427307a4a924bf33745410260Mike Lockwood MtpConstants.FORMAT_AAC, 28712b8a99fc1d4acc427307a4a924bf33745410260Mike Lockwood MtpConstants.FORMAT_MP4_CONTAINER, 28812b8a99fc1d4acc427307a4a924bf33745410260Mike Lockwood MtpConstants.FORMAT_MP2, 28912b8a99fc1d4acc427307a4a924bf33745410260Mike Lockwood MtpConstants.FORMAT_3GP_CONTAINER, 290792ec849e5bc27c090c62f578846b888fa43e0d6Mike Lockwood MtpConstants.FORMAT_ABSTRACT_AV_PLAYLIST, 29112b8a99fc1d4acc427307a4a924bf33745410260Mike Lockwood MtpConstants.FORMAT_WPL_PLAYLIST, 29212b8a99fc1d4acc427307a4a924bf33745410260Mike Lockwood MtpConstants.FORMAT_M3U_PLAYLIST, 29312b8a99fc1d4acc427307a4a924bf33745410260Mike Lockwood MtpConstants.FORMAT_PLS_PLAYLIST, 29412b8a99fc1d4acc427307a4a924bf33745410260Mike Lockwood MtpConstants.FORMAT_XML_DOCUMENT, 2954b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood }; 2964b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood } 2974b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood 2984b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood private int[] getSupportedCaptureFormats() { 2994b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood // no capture formats yet 3004b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood return null; 3014b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood } 3024b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood 303ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood static final int[] FILE_PROPERTIES = { 304ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood // NOTE must match beginning of AUDIO_PROPERTIES, VIDEO_PROPERTIES 305ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood // and IMAGE_PROPERTIES below 3065367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood MtpConstants.PROPERTY_STORAGE_ID, 3075367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood MtpConstants.PROPERTY_OBJECT_FORMAT, 308d3bfecb0c9bdf3651a06e86c7c8607768a29a9aeMike Lockwood MtpConstants.PROPERTY_PROTECTION_STATUS, 3095367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood MtpConstants.PROPERTY_OBJECT_SIZE, 3105367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood MtpConstants.PROPERTY_OBJECT_FILE_NAME, 311d3bfecb0c9bdf3651a06e86c7c8607768a29a9aeMike Lockwood MtpConstants.PROPERTY_DATE_MODIFIED, 3125367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood MtpConstants.PROPERTY_PARENT_OBJECT, 313d3bfecb0c9bdf3651a06e86c7c8607768a29a9aeMike Lockwood MtpConstants.PROPERTY_PERSISTENT_UID, 314d3bfecb0c9bdf3651a06e86c7c8607768a29a9aeMike Lockwood MtpConstants.PROPERTY_NAME, 315ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_DATE_ADDED, 316ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood }; 317ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood 318ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood static final int[] AUDIO_PROPERTIES = { 319ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood // NOTE must match FILE_PROPERTIES above 320ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_STORAGE_ID, 321ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_OBJECT_FORMAT, 322ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_PROTECTION_STATUS, 323ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_OBJECT_SIZE, 324ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_OBJECT_FILE_NAME, 325ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_DATE_MODIFIED, 326ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_PARENT_OBJECT, 327ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_PERSISTENT_UID, 328ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_NAME, 329ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_DISPLAY_NAME, 330ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_DATE_ADDED, 331ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood 332ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood // audio specific properties 333ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_ARTIST, 334ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_ALBUM_NAME, 335ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_ALBUM_ARTIST, 336ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_TRACK, 337ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_ORIGINAL_RELEASE_DATE, 338ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_DURATION, 339ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_GENRE, 340ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_COMPOSER, 341ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood }; 342ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood 343ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood static final int[] VIDEO_PROPERTIES = { 344ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood // NOTE must match FILE_PROPERTIES above 345ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_STORAGE_ID, 346ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_OBJECT_FORMAT, 347ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_PROTECTION_STATUS, 348ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_OBJECT_SIZE, 349ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_OBJECT_FILE_NAME, 350ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_DATE_MODIFIED, 351ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_PARENT_OBJECT, 352ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_PERSISTENT_UID, 353ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_NAME, 354ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_DISPLAY_NAME, 355ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_DATE_ADDED, 356ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood 357ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood // video specific properties 358ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_ARTIST, 359ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_ALBUM_NAME, 360ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_DURATION, 361ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_DESCRIPTION, 362ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood }; 363ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood 364ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood static final int[] IMAGE_PROPERTIES = { 365ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood // NOTE must match FILE_PROPERTIES above 366ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_STORAGE_ID, 367ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_OBJECT_FORMAT, 368ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_PROTECTION_STATUS, 369ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_OBJECT_SIZE, 370ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_OBJECT_FILE_NAME, 371ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_DATE_MODIFIED, 372ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_PARENT_OBJECT, 373ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_PERSISTENT_UID, 374ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_NAME, 375ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_DISPLAY_NAME, 376ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_DATE_ADDED, 377ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood 378ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood // image specific properties 379ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood MtpConstants.PROPERTY_DESCRIPTION, 380ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood }; 381ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood 382ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood private int[] getSupportedObjectProperties(int format) { 383ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood switch (format) { 384ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.FORMAT_MP3: 385ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.FORMAT_WAV: 386ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.FORMAT_WMA: 387ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.FORMAT_OGG: 388ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.FORMAT_AAC: 389ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood return AUDIO_PROPERTIES; 390ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.FORMAT_MPEG: 391ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.FORMAT_3GP_CONTAINER: 392ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.FORMAT_WMV: 393ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood return VIDEO_PROPERTIES; 394ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.FORMAT_EXIF_JPEG: 395ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.FORMAT_GIF: 396ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.FORMAT_PNG: 397ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.FORMAT_BMP: 398ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood return IMAGE_PROPERTIES; 399ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood default: 400ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood return FILE_PROPERTIES; 401ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } 4024b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood } 4034b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood 4044b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood private int[] getSupportedDeviceProperties() { 40559e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood return new int[] { 40659e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood MtpConstants.DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER, 40759e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood MtpConstants.DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME, 40859e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood }; 4094b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood } 4104b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood 411ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood private String queryString(int id, String column) { 412ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood Cursor c = null; 413ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood try { 414ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood // for now we are only reading properties from the "objects" table 415ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood c = mMediaProvider.query(mObjectsUri, 416ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood new String [] { Files.FileColumns._ID, column }, 417ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood ID_WHERE, new String[] { Integer.toString(id) }, null); 418ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood if (c != null && c.moveToNext()) { 419ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood return c.getString(1); 420ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } else { 421ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood return ""; 422ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } 423ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } catch (Exception e) { 424ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood return null; 425ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } finally { 426ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood if (c != null) { 427ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood c.close(); 428ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } 429ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } 430ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } 431ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood 432e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood private String queryAudio(int id, String column) { 433e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood Cursor c = null; 434e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood try { 435e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood c = mMediaProvider.query(Audio.Media.getContentUri(mVolumeName), 436e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood new String [] { Files.FileColumns._ID, column }, 437e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood ID_WHERE, new String[] { Integer.toString(id) }, null); 438e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (c != null && c.moveToNext()) { 439e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood return c.getString(1); 440e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } else { 441e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood return ""; 442e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 443e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } catch (Exception e) { 444e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood return null; 445e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } finally { 446e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (c != null) { 447e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood c.close(); 448e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 449e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 450e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 451e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 452ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood private String queryGenre(int id) { 453ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood Cursor c = null; 454ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood try { 455ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood Uri uri = Audio.Genres.getContentUriForAudioId(mVolumeName, id); 456ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood c = mMediaProvider.query(uri, 457ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood new String [] { Files.FileColumns._ID, Audio.GenresColumns.NAME }, 458ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood null, null, null); 459ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood if (c != null && c.moveToNext()) { 460ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood return c.getString(1); 461ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } else { 462ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood return ""; 463ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } 464ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } catch (Exception e) { 465ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood Log.e(TAG, "queryGenre exception", e); 466ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood return null; 467ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } finally { 468ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood if (c != null) { 469ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood c.close(); 470ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } 471ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } 472ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } 473ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood 474e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood private Long queryLong(int id, String column) { 475ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood Cursor c = null; 476ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood try { 477ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood // for now we are only reading properties from the "objects" table 478ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood c = mMediaProvider.query(mObjectsUri, 479ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood new String [] { Files.FileColumns._ID, column }, 480ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood ID_WHERE, new String[] { Integer.toString(id) }, null); 481ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood if (c != null && c.moveToNext()) { 482e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood return new Long(c.getLong(1)); 483ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } 484ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } catch (Exception e) { 485ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } finally { 486ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood if (c != null) { 487ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood c.close(); 488ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } 489ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } 490e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood return null; 491ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } 492ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood 493ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood private String nameFromPath(String path) { 494ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood // extract name from full path 495ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood int start = 0; 496ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood int lastSlash = path.lastIndexOf('/'); 497ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood if (lastSlash >= 0) { 498ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood start = lastSlash + 1; 499ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } 500ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood int end = path.length(); 501ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood if (end - start > 255) { 502ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood end = start + 255; 503ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } 504ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood return path.substring(start, end); 505ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood } 506ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood 507e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood private String formatDateTime(long seconds) { 508e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood Time time = new Time(Time.TIMEZONE_UTC); 509e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood time.set(seconds * 1000); 510e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood String result = time.format("%Y-%m-%dT%H:%M:%SZ"); 511e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood Log.d(TAG, "formatDateTime returning " + result); 512e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood return result; 513e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 5145ebac83e20dadf10bd4a0cee4ddf69d0ec049f98Mike Lockwood 515e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood private MtpPropertyList getObjectPropertyList(int handle, int format, int property, 516e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood int groupCode, int depth) { 517e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood // FIXME - implement group support 518e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood // For now we only support a single property at a time 519e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (groupCode != 0) { 520e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood return new MtpPropertyList(0, MtpConstants.RESPONSE_SPECIFICATION_BY_GROUP_UNSUPPORTED); 5215ebac83e20dadf10bd4a0cee4ddf69d0ec049f98Mike Lockwood } 522e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (depth > 1) { 523e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood return new MtpPropertyList(0, MtpConstants.RESPONSE_SPECIFICATION_BY_DEPTH_UNSUPPORTED); 5245ebac83e20dadf10bd4a0cee4ddf69d0ec049f98Mike Lockwood } 5255ebac83e20dadf10bd4a0cee4ddf69d0ec049f98Mike Lockwood 526b2cada9034436b4ea4bac218da7a1e29460d15b2Mike Lockwood String column = null; 527e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood int type = MtpConstants.TYPE_UNDEFINED; 528b2cada9034436b4ea4bac218da7a1e29460d15b2Mike Lockwood 529e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood switch (property) { 5305367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood case MtpConstants.PROPERTY_STORAGE_ID: 531e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood // no query needed until we support multiple storage units 532e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood // for now it is always mStorageID 533e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood type = MtpConstants.TYPE_UINT32; 534e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 535e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MtpConstants.PROPERTY_OBJECT_FORMAT: 5363b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood column = Files.FileColumns.FORMAT; 537e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood type = MtpConstants.TYPE_UINT16; 538b2cada9034436b4ea4bac218da7a1e29460d15b2Mike Lockwood break; 5395367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood case MtpConstants.PROPERTY_PROTECTION_STATUS: 540828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood // protection status is always 0 541e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood type = MtpConstants.TYPE_UINT16; 542e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 5435367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood case MtpConstants.PROPERTY_OBJECT_SIZE: 5443b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood column = Files.FileColumns.SIZE; 545e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood type = MtpConstants.TYPE_UINT64; 546b2cada9034436b4ea4bac218da7a1e29460d15b2Mike Lockwood break; 5475367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood case MtpConstants.PROPERTY_OBJECT_FILE_NAME: 548e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood column = Files.FileColumns.DATA; 549e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood type = MtpConstants.TYPE_STR; 550e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 551ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.PROPERTY_NAME: 552e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood column = MediaColumns.TITLE; 553e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood type = MtpConstants.TYPE_STR; 554e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 5555367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood case MtpConstants.PROPERTY_DATE_MODIFIED: 5563b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood column = Files.FileColumns.DATE_MODIFIED; 557e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood type = MtpConstants.TYPE_STR; 558b2cada9034436b4ea4bac218da7a1e29460d15b2Mike Lockwood break; 559ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.PROPERTY_DATE_ADDED: 560ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood column = Files.FileColumns.DATE_ADDED; 561e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood type = MtpConstants.TYPE_STR; 562ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood break; 563ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.PROPERTY_ORIGINAL_RELEASE_DATE: 564ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood column = Audio.AudioColumns.YEAR; 565e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood type = MtpConstants.TYPE_STR; 566ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood break; 5675367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood case MtpConstants.PROPERTY_PARENT_OBJECT: 5683b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood column = Files.FileColumns.PARENT; 569e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood type = MtpConstants.TYPE_UINT32; 570b2cada9034436b4ea4bac218da7a1e29460d15b2Mike Lockwood break; 5715367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood case MtpConstants.PROPERTY_PERSISTENT_UID: 572828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood // PUID is concatenation of storageID and object handle 573e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood type = MtpConstants.TYPE_UINT128; 574e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 575ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.PROPERTY_DURATION: 576ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood column = Audio.AudioColumns.DURATION; 577e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood type = MtpConstants.TYPE_UINT32; 578ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood break; 579ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.PROPERTY_TRACK: 580e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood column = Audio.AudioColumns.TRACK; 581e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood type = MtpConstants.TYPE_UINT16; 582e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 583ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.PROPERTY_DISPLAY_NAME: 584ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood column = MediaColumns.DISPLAY_NAME; 585e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood type = MtpConstants.TYPE_STR; 586ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood break; 587ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.PROPERTY_ARTIST: 588e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood type = MtpConstants.TYPE_STR; 589ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood break; 590ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.PROPERTY_ALBUM_NAME: 591e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood type = MtpConstants.TYPE_STR; 592ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood break; 593ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.PROPERTY_ALBUM_ARTIST: 594ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood column = Audio.AudioColumns.ALBUM_ARTIST; 595e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood type = MtpConstants.TYPE_STR; 596ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood break; 597ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.PROPERTY_GENRE: 598e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood // genre requires a special query 599e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood type = MtpConstants.TYPE_STR; 600e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 601ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.PROPERTY_COMPOSER: 602ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood column = Audio.AudioColumns.COMPOSER; 603e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood type = MtpConstants.TYPE_STR; 604ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood break; 605ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MtpConstants.PROPERTY_DESCRIPTION: 606ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood column = Images.ImageColumns.DESCRIPTION; 607e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood type = MtpConstants.TYPE_STR; 608ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood break; 609b2cada9034436b4ea4bac218da7a1e29460d15b2Mike Lockwood default: 610e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood return new MtpPropertyList(0, MtpConstants.RESPONSE_OBJECT_PROP_NOT_SUPPORTED); 611b2cada9034436b4ea4bac218da7a1e29460d15b2Mike Lockwood } 612b2cada9034436b4ea4bac218da7a1e29460d15b2Mike Lockwood 613e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood Cursor c = null; 614e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood try { 615e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (column != null) { 616e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood c = mMediaProvider.query(mObjectsUri, 617e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood new String [] { Files.FileColumns._ID, column }, 618e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood // depth 0: single record, depth 1: immediate children 619e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood (depth == 0 ? ID_WHERE : PARENT_WHERE), 620e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood new String[] { Integer.toString(handle) }, null); 621e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (c == null) { 622e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood return new MtpPropertyList(0, MtpConstants.RESPONSE_INVALID_OBJECT_HANDLE); 623e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 624e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } else if (depth == 1) { 625e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood c = mMediaProvider.query(mObjectsUri, 626e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood new String [] { Files.FileColumns._ID }, 627e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood PARENT_WHERE, new String[] { Integer.toString(handle) }, null); 628e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (c == null) { 629e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood return new MtpPropertyList(0, MtpConstants.RESPONSE_INVALID_OBJECT_HANDLE); 630e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 631b2cada9034436b4ea4bac218da7a1e29460d15b2Mike Lockwood } 632e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 633e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood int count = (c == null ? 1 : c.getCount()); 634e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood MtpPropertyList result = new MtpPropertyList(count, MtpConstants.RESPONSE_OK); 635e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 636e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood for (int index = 0; index < count; index++) { 637e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (c != null) { 638e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood c.moveToNext(); 639e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 640e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (depth == 1) { 641e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood handle = (int)c.getLong(0); 642e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 643e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 644e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood switch (property) { 645e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood // handle special cases here 646e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MtpConstants.PROPERTY_STORAGE_ID: 647e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood result.setProperty(index, handle, property, MtpConstants.TYPE_UINT32, 648e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood mStorageID); 649e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 650e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MtpConstants.PROPERTY_PROTECTION_STATUS: 651e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood // protection status is always 0 652e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood result.setProperty(index, handle, property, MtpConstants.TYPE_UINT16, 0); 653e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 654e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MtpConstants.PROPERTY_OBJECT_FILE_NAME: 655e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood // special case - need to extract file name from full path 656e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood String value = c.getString(1); 657e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (value != null) { 658e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood result.setProperty(index, handle, property, nameFromPath(value)); 659e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } else { 660e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood result.setResult(MtpConstants.RESPONSE_INVALID_OBJECT_HANDLE); 661e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 662e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 663e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MtpConstants.PROPERTY_NAME: 664e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood // first try title 665e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood String name = c.getString(1); 666e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood // then try name 667e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (name == null) { 668e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood name = queryString(handle, Audio.PlaylistsColumns.NAME); 669e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 670e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood // if title and name fail, extract name from full path 671e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (name == null) { 672e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood name = queryString(handle, Files.FileColumns.DATA); 673e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (name != null) { 674e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood name = nameFromPath(name); 675e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 676e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 677e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (name != null) { 678e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood result.setProperty(index, handle, property, name); 679e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } else { 680e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood result.setResult(MtpConstants.RESPONSE_INVALID_OBJECT_HANDLE); 681e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 682e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 683e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MtpConstants.PROPERTY_DATE_MODIFIED: 684e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MtpConstants.PROPERTY_DATE_ADDED: 685e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood // convert from seconds to DateTime 686e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood result.setProperty(index, handle, property, formatDateTime(c.getInt(1))); 687e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 688e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MtpConstants.PROPERTY_ORIGINAL_RELEASE_DATE: 689e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood // release date is stored internally as just the year 690e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood int year = c.getInt(1); 691e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood String dateTime = Integer.toString(year) + "0101T000000"; 692e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood result.setProperty(index, handle, property, dateTime); 693e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 694e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MtpConstants.PROPERTY_PERSISTENT_UID: 695e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood // PUID is concatenation of storageID and object handle 696e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood long puid = mStorageID; 697e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood puid <<= 32; 698e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood puid += handle; 699e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood result.setProperty(index, handle, property, MtpConstants.TYPE_UINT128, puid); 700e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 701e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MtpConstants.PROPERTY_TRACK: 702e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood result.setProperty(index, handle, property, MtpConstants.TYPE_UINT16, 703e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood c.getInt(1) % 1000); 704e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 705e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MtpConstants.PROPERTY_ARTIST: 706e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood result.setProperty(index, handle, property, queryAudio(handle, Audio.AudioColumns.ARTIST)); 707e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 708e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MtpConstants.PROPERTY_ALBUM_NAME: 709e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood result.setProperty(index, handle, property, queryAudio(handle, Audio.AudioColumns.ALBUM)); 710e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 711e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MtpConstants.PROPERTY_GENRE: 712e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood String genre = queryGenre(handle); 713e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (genre != null) { 714e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood result.setProperty(index, handle, property, genre); 715e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } else { 716e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood result.setResult(MtpConstants.RESPONSE_INVALID_OBJECT_HANDLE); 717e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 718e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 719e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood default: 720e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (type == MtpConstants.TYPE_STR) { 721e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood result.setProperty(index, handle, property, c.getString(1)); 722e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } else { 723e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood result.setProperty(index, handle, property, type, c.getLong(1)); 724e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 725e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 726e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 727e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 728e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood return result; 729e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } catch (RemoteException e) { 730e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood return new MtpPropertyList(0, MtpConstants.RESPONSE_GENERAL_ERROR); 731e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } finally { 732e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (c != null) { 733e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood c.close(); 734e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 735e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 736e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood // impossible to get here, so no return statement 737e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 738e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 739e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood private int renameFile(int handle, String newName) { 740e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood Cursor c = null; 741e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 742e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood // first compute current path 743e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood String path = null; 744e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood String[] whereArgs = new String[] { Integer.toString(handle) }; 745e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood try { 746e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood c = mMediaProvider.query(mObjectsUri, PATH_PROJECTION, ID_WHERE, whereArgs, null); 747e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (c != null && c.moveToNext()) { 748e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood path = externalToMediaPath(c.getString(1)); 749e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 750e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } catch (RemoteException e) { 751e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood Log.e(TAG, "RemoteException in getObjectFilePath", e); 752e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood return MtpConstants.RESPONSE_GENERAL_ERROR; 753e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } finally { 754e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (c != null) { 755e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood c.close(); 756b2cada9034436b4ea4bac218da7a1e29460d15b2Mike Lockwood } 757b2cada9034436b4ea4bac218da7a1e29460d15b2Mike Lockwood } 758e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (path == null) { 759e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood return MtpConstants.RESPONSE_INVALID_OBJECT_HANDLE; 760e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 761e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 762e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood // now rename the file. make sure this succeeds before updating database 763e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood File oldFile = new File(path); 764e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood int lastSlash = path.lastIndexOf('/'); 765e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (lastSlash <= 1) { 766e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood return MtpConstants.RESPONSE_GENERAL_ERROR; 767e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 768e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood String newPath = path.substring(0, lastSlash + 1) + newName; 769e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood File newFile = new File(newPath); 770e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood boolean success = oldFile.renameTo(newFile); 771e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood Log.d(TAG, "renaming "+ path + " to " + newPath + (success ? " succeeded" : " failed")); 772e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (!success) { 773e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood return MtpConstants.RESPONSE_GENERAL_ERROR; 774e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 775e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 776e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood // finally update database 777e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood ContentValues values = new ContentValues(); 778e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood values.put(Files.FileColumns.DATA, newPath); 779e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood int updated = 0; 780e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood try { 781e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood // note - we are relying on a special case in MediaProvider.update() to update 782e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood // the paths for all children in the case where this is a directory. 783e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood updated = mMediaProvider.update(mObjectsUri, values, ID_WHERE, whereArgs); 784e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } catch (RemoteException e) { 785e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood Log.e(TAG, "RemoteException in mMediaProvider.update", e); 786e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 787e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (updated == 0) { 788e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood Log.e(TAG, "Unable to update path for " + path + " to " + newPath); 789e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood // this shouldn't happen, but if it does we need to rename the file to its original name 790e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood newFile.renameTo(oldFile); 791e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood return MtpConstants.RESPONSE_GENERAL_ERROR; 792e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 793e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 794e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood return MtpConstants.RESPONSE_OK; 795d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 796d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 79759e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood private int setObjectProperty(int handle, int property, 79859e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood long intValue, String stringValue) { 79959e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood Log.d(TAG, "setObjectProperty: " + property); 8005ebac83e20dadf10bd4a0cee4ddf69d0ec049f98Mike Lockwood 8015ebac83e20dadf10bd4a0cee4ddf69d0ec049f98Mike Lockwood switch (property) { 8025ebac83e20dadf10bd4a0cee4ddf69d0ec049f98Mike Lockwood case MtpConstants.PROPERTY_OBJECT_FILE_NAME: 8035ebac83e20dadf10bd4a0cee4ddf69d0ec049f98Mike Lockwood return renameFile(handle, stringValue); 8045ebac83e20dadf10bd4a0cee4ddf69d0ec049f98Mike Lockwood 8055ebac83e20dadf10bd4a0cee4ddf69d0ec049f98Mike Lockwood default: 8065ebac83e20dadf10bd4a0cee4ddf69d0ec049f98Mike Lockwood return MtpConstants.RESPONSE_OBJECT_PROP_NOT_SUPPORTED; 8075ebac83e20dadf10bd4a0cee4ddf69d0ec049f98Mike Lockwood } 80859e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood } 80959e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 81059e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood private int getDeviceProperty(int property, long[] outIntValue, char[] outStringValue) { 81159e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood Log.d(TAG, "getDeviceProperty: " + property); 81259e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 81359e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood switch (property) { 81459e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood case MtpConstants.DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER: 81559e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood case MtpConstants.DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME: 81659e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood // writable string properties kept in our device property database 81759e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood Cursor c = null; 81859e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood try { 81959e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood c = mDevicePropDb.query("properties", DEVICE_PROPERTY_PROJECTION, 82059e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood DEVICE_PROPERTY_WHERE, new String[] { Integer.toString(property) }, 82159e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood null, null, null); 82259e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 82359e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood if (c != null && c.moveToNext()) { 82459e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood String value = c.getString(1); 82559e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood int length = value.length(); 82659e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood if (length > 255) { 82759e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood length = 255; 82859e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood } 82959e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood value.getChars(0, length, outStringValue, 0); 83059e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood outStringValue[length] = 0; 83159e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood } else { 83259e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood outStringValue[0] = 0; 83359e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood } 83459e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood return MtpConstants.RESPONSE_OK; 83559e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood } finally { 83659e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood if (c != null) { 83759e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood c.close(); 83859e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood } 83959e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood } 84059e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood } 84159e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 84259e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood return MtpConstants.RESPONSE_DEVICE_PROP_NOT_SUPPORTED; 84359e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood } 84459e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 84559e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood private int setDeviceProperty(int property, long intValue, String stringValue) { 84659e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood Log.d(TAG, "setDeviceProperty: " + property + " : " + stringValue); 84759e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 84859e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood switch (property) { 84959e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood case MtpConstants.DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER: 85059e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood case MtpConstants.DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME: 85159e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood // writable string properties kept in our device property database 85259e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood try { 85359e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood ContentValues values = new ContentValues(); 85459e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood values.put("code", property); 85559e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood values.put("value", stringValue); 85659e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood mDevicePropDb.insert("properties", "code", values); 85759e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood return MtpConstants.RESPONSE_OK; 85859e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood } catch (Exception e) { 85959e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood return MtpConstants.RESPONSE_GENERAL_ERROR; 86059e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood } 86159e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood } 86259e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 86359e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood return MtpConstants.RESPONSE_DEVICE_PROP_NOT_SUPPORTED; 86459e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood } 86559e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 866d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood private boolean getObjectInfo(int handle, int[] outStorageFormatParent, 867d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood char[] outName, long[] outSizeModified) { 868d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood Log.d(TAG, "getObjectInfo: " + handle); 869d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood Cursor c = null; 870d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood try { 871d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood c = mMediaProvider.query(mObjectsUri, OBJECT_INFO_PROJECTION, 872d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood ID_WHERE, new String[] { Integer.toString(handle) }, null); 873d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (c != null && c.moveToNext()) { 874b2cada9034436b4ea4bac218da7a1e29460d15b2Mike Lockwood outStorageFormatParent[0] = mStorageID; 875d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood outStorageFormatParent[1] = c.getInt(2); 876d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood outStorageFormatParent[2] = c.getInt(3); 877d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 878d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood // extract name from path 879d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood String path = c.getString(1); 880d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood int lastSlash = path.lastIndexOf('/'); 881d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood int start = (lastSlash >= 0 ? lastSlash + 1 : 0); 882d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood int end = path.length(); 883d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (end - start > 255) { 884d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood end = start + 255; 885d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 886d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood path.getChars(start, end, outName, 0); 887d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood outName[end - start] = 0; 888d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 889d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood outSizeModified[0] = c.getLong(4); 890d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood outSizeModified[1] = c.getLong(5); 891d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return true; 892d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 893d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } catch (RemoteException e) { 8942b5f9ad1eaf0d6daaca5cf3761434a09309902bbMike Lockwood Log.e(TAG, "RemoteException in getObjectInfo", e); 895d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } finally { 896d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (c != null) { 897d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood c.close(); 898d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 899d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 900d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return false; 901d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 902d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 90359c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood private int getObjectFilePath(int handle, char[] outFilePath, long[] outFileLength) { 904d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood Log.d(TAG, "getObjectFilePath: " + handle); 90501788562f26f213f63c14483fd3977e23b8314abMike Lockwood if (handle == 0) { 90601788562f26f213f63c14483fd3977e23b8314abMike Lockwood // special case root directory 90701788562f26f213f63c14483fd3977e23b8314abMike Lockwood mMediaStoragePath.getChars(0, mMediaStoragePath.length(), outFilePath, 0); 90801788562f26f213f63c14483fd3977e23b8314abMike Lockwood outFilePath[mMediaStoragePath.length()] = 0; 90901788562f26f213f63c14483fd3977e23b8314abMike Lockwood outFileLength[0] = 0; 91001788562f26f213f63c14483fd3977e23b8314abMike Lockwood return MtpConstants.RESPONSE_OK; 91101788562f26f213f63c14483fd3977e23b8314abMike Lockwood } 912d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood Cursor c = null; 913d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood try { 914d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood c = mMediaProvider.query(mObjectsUri, PATH_SIZE_PROJECTION, 915d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood ID_WHERE, new String[] { Integer.toString(handle) }, null); 916d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (c != null && c.moveToNext()) { 9172b5f9ad1eaf0d6daaca5cf3761434a09309902bbMike Lockwood String path = externalToMediaPath(c.getString(1)); 918d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood path.getChars(0, path.length(), outFilePath, 0); 919d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood outFilePath[path.length()] = 0; 920d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood outFileLength[0] = c.getLong(2); 9215367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood return MtpConstants.RESPONSE_OK; 92259c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood } else { 9235367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood return MtpConstants.RESPONSE_INVALID_OBJECT_HANDLE; 924d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 925d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } catch (RemoteException e) { 926d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood Log.e(TAG, "RemoteException in getObjectFilePath", e); 9275367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood return MtpConstants.RESPONSE_GENERAL_ERROR; 928d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } finally { 929d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (c != null) { 930d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood c.close(); 931d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 932d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 933d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 934d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 935ccb6e961941c607208ed9ac44db2dc9a9649b218Mike Lockwood private int deleteRecursive(int handle) throws RemoteException { 936ccb6e961941c607208ed9ac44db2dc9a9649b218Mike Lockwood int[] children = getObjectList(0 /* storageID */, 0 /* format */, handle); 937ccb6e961941c607208ed9ac44db2dc9a9649b218Mike Lockwood Uri uri = Files.getMtpObjectsUri(mVolumeName, handle); 938ccb6e961941c607208ed9ac44db2dc9a9649b218Mike Lockwood // delete parent first, to avoid potential infinite recursion 939ccb6e961941c607208ed9ac44db2dc9a9649b218Mike Lockwood int count = mMediaProvider.delete(uri, null, null); 940ccb6e961941c607208ed9ac44db2dc9a9649b218Mike Lockwood if (count == 1) { 941ccb6e961941c607208ed9ac44db2dc9a9649b218Mike Lockwood if (children != null) { 942ccb6e961941c607208ed9ac44db2dc9a9649b218Mike Lockwood for (int i = 0; i < children.length; i++) { 943ccb6e961941c607208ed9ac44db2dc9a9649b218Mike Lockwood count += deleteRecursive(children[i]); 944ccb6e961941c607208ed9ac44db2dc9a9649b218Mike Lockwood } 945ccb6e961941c607208ed9ac44db2dc9a9649b218Mike Lockwood } 946ccb6e961941c607208ed9ac44db2dc9a9649b218Mike Lockwood } 947ccb6e961941c607208ed9ac44db2dc9a9649b218Mike Lockwood return count; 948ccb6e961941c607208ed9ac44db2dc9a9649b218Mike Lockwood } 949ccb6e961941c607208ed9ac44db2dc9a9649b218Mike Lockwood 95059c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood private int deleteFile(int handle) { 951d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood Log.d(TAG, "deleteFile: " + handle); 9522837eefc5459427138c080d445bb491c75630163Mike Lockwood mDatabaseModified = true; 953d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood try { 954ccb6e961941c607208ed9ac44db2dc9a9649b218Mike Lockwood if (deleteRecursive(handle) > 0) { 9555367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood return MtpConstants.RESPONSE_OK; 95659c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood } else { 9575367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood return MtpConstants.RESPONSE_INVALID_OBJECT_HANDLE; 95859c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood } 959d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } catch (RemoteException e) { 960d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood Log.e(TAG, "RemoteException in deleteFile", e); 9615367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood return MtpConstants.RESPONSE_GENERAL_ERROR; 962d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 963d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 964d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 9659a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood private int[] getObjectReferences(int handle) { 9669a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood Log.d(TAG, "getObjectReferences for: " + handle); 9678490e66f57506d4e4b05e7c987c7ca34295843e6Mike Lockwood Uri uri = Files.getMtpReferencesUri(mVolumeName, handle); 9689a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood Cursor c = null; 9699a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood try { 9709a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood c = mMediaProvider.query(uri, ID_PROJECTION, null, null, null); 9719a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood if (c == null) { 9729a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood return null; 9739a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } 9749a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood int count = c.getCount(); 9759a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood if (count > 0) { 9769a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood int[] result = new int[count]; 9779a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood for (int i = 0; i < count; i++) { 9789a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood c.moveToNext(); 9799a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood result[i] = c.getInt(0); 9809a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } 9819a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood return result; 9829a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } 9839a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } catch (RemoteException e) { 9849a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood Log.e(TAG, "RemoteException in getObjectList", e); 9859a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } finally { 9869a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood if (c != null) { 9879a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood c.close(); 9889a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } 9899a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } 9909a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood return null; 9919a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } 9929a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood 9939a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood private int setObjectReferences(int handle, int[] references) { 9942837eefc5459427138c080d445bb491c75630163Mike Lockwood mDatabaseModified = true; 9958490e66f57506d4e4b05e7c987c7ca34295843e6Mike Lockwood Uri uri = Files.getMtpReferencesUri(mVolumeName, handle); 9969a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood int count = references.length; 9979a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood ContentValues[] valuesList = new ContentValues[count]; 9989a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood for (int i = 0; i < count; i++) { 9999a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood ContentValues values = new ContentValues(); 10003b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood values.put(Files.FileColumns._ID, references[i]); 10019a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood valuesList[i] = values; 10029a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } 10039a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood try { 10049a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood if (count == mMediaProvider.bulkInsert(uri, valuesList)) { 10055367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood return MtpConstants.RESPONSE_OK; 10069a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } 10079a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } catch (RemoteException e) { 10089a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood Log.e(TAG, "RemoteException in setObjectReferences", e); 10099a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } 10105367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood return MtpConstants.RESPONSE_GENERAL_ERROR; 10119a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } 10129a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood 10132837eefc5459427138c080d445bb491c75630163Mike Lockwood private void sessionStarted() { 10142837eefc5459427138c080d445bb491c75630163Mike Lockwood Log.d(TAG, "sessionStarted"); 10152837eefc5459427138c080d445bb491c75630163Mike Lockwood mDatabaseModified = false; 10162837eefc5459427138c080d445bb491c75630163Mike Lockwood } 10172837eefc5459427138c080d445bb491c75630163Mike Lockwood 10182837eefc5459427138c080d445bb491c75630163Mike Lockwood private void sessionEnded() { 10192837eefc5459427138c080d445bb491c75630163Mike Lockwood Log.d(TAG, "sessionEnded"); 10202837eefc5459427138c080d445bb491c75630163Mike Lockwood if (mDatabaseModified) { 10212837eefc5459427138c080d445bb491c75630163Mike Lockwood Log.d(TAG, "sending ACTION_MTP_SESSION_END"); 10222837eefc5459427138c080d445bb491c75630163Mike Lockwood mContext.sendBroadcast(new Intent(Mtp.ACTION_MTP_SESSION_END)); 10232837eefc5459427138c080d445bb491c75630163Mike Lockwood mDatabaseModified = false; 10242837eefc5459427138c080d445bb491c75630163Mike Lockwood } 10252837eefc5459427138c080d445bb491c75630163Mike Lockwood } 10262837eefc5459427138c080d445bb491c75630163Mike Lockwood 1027d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood // used by the JNI code 1028d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood private int mNativeContext; 1029d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 1030d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood private native final void native_setup(); 1031d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood private native final void native_finalize(); 1032d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 1033