MtpContext.java revision 2b3ee0ea07246b859a5b75d8a6102a7cce7ec838
1package com.android.gallery3d.data; 2 3import android.content.Context; 4import android.media.MediaScannerConnection; 5import android.media.MediaScannerConnection.MediaScannerConnectionClient; 6import android.mtp.MtpObjectInfo; 7import android.net.Uri; 8import android.os.Environment; 9import android.util.Log; 10import android.widget.Toast; 11 12import com.android.gallery3d.R; 13import com.android.gallery3d.util.GalleryUtils; 14 15import java.io.File; 16import java.util.ArrayList; 17import java.util.List; 18 19public class MtpContext implements MtpClient.Listener { 20 private static final String TAG = "MtpContext"; 21 22 public static final String NAME_IMPORTED_FOLDER = "Imported"; 23 24 private ScannerClient mScannerClient; 25 private Context mContext; 26 private MtpClient mClient; 27 28 private static final class ScannerClient implements MediaScannerConnectionClient { 29 ArrayList<String> mPaths = new ArrayList<String>(); 30 MediaScannerConnection mScannerConnection; 31 boolean mConnected; 32 Object mLock = new Object(); 33 34 public ScannerClient(Context context) { 35 mScannerConnection = new MediaScannerConnection(context, this); 36 } 37 38 public void scanPath(String path) { 39 synchronized (mLock) { 40 if (mConnected) { 41 mScannerConnection.scanFile(path, null); 42 } else { 43 mPaths.add(path); 44 mScannerConnection.connect(); 45 } 46 } 47 } 48 49 @Override 50 public void onMediaScannerConnected() { 51 synchronized (mLock) { 52 mConnected = true; 53 if (!mPaths.isEmpty()) { 54 for (String path : mPaths) { 55 mScannerConnection.scanFile(path, null); 56 } 57 mPaths.clear(); 58 } 59 } 60 } 61 62 @Override 63 public void onScanCompleted(String path, Uri uri) { 64 } 65 } 66 67 public MtpContext(Context context) { 68 mContext = context; 69 mScannerClient = new ScannerClient(context); 70 mClient = new MtpClient(mContext); 71 } 72 73 public void pause() { 74 mClient.removeListener(this); 75 } 76 77 public void resume() { 78 mClient.addListener(this); 79 notifyDirty(); 80 } 81 82 public void deviceAdded(android.mtp.MtpDevice device) { 83 notifyDirty(); 84 showToast(R.string.camera_connected); 85 } 86 87 public void deviceRemoved(android.mtp.MtpDevice device) { 88 notifyDirty(); 89 showToast(R.string.camera_disconnected); 90 } 91 92 private void notifyDirty() { 93 mContext.getContentResolver().notifyChange(Uri.parse("mtp://"), null); 94 } 95 96 private void showToast(final int msg) { 97 Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show(); 98 } 99 100 public MtpClient getMtpClient() { 101 return mClient; 102 } 103 104 public boolean copyFile(String deviceName, MtpObjectInfo objInfo) { 105 if (GalleryUtils.hasSpaceForSize(objInfo.getCompressedSize())) { 106 File dest = Environment.getExternalStorageDirectory(); 107 dest = new File(dest, NAME_IMPORTED_FOLDER); 108 dest.mkdirs(); 109 String destPath = new File(dest, objInfo.getName()).getAbsolutePath(); 110 int objectId = objInfo.getObjectHandle(); 111 if (mClient.importFile(deviceName, objectId, destPath)) { 112 mScannerClient.scanPath(destPath); 113 return true; 114 } 115 } else { 116 Log.w(TAG, "No space to import " + objInfo.getName() + 117 " whose size = " + objInfo.getCompressedSize()); 118 } 119 return false; 120 } 121 122 public boolean copyAlbum(String deviceName, String albumName, 123 List<MtpObjectInfo> children) { 124 File dest = Environment.getExternalStorageDirectory(); 125 dest = new File(dest, albumName); 126 dest.mkdirs(); 127 int success = 0; 128 for (MtpObjectInfo child : children) { 129 if (!GalleryUtils.hasSpaceForSize(child.getCompressedSize())) continue; 130 131 File importedFile = new File(dest, child.getName()); 132 String path = importedFile.getAbsolutePath(); 133 if (mClient.importFile(deviceName, child.getObjectHandle(), path)) { 134 mScannerClient.scanPath(path); 135 success++; 136 } 137 } 138 return success == children.size(); 139 } 140} 141