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