MtpContext.java revision f9a0a4306d589b4a4e20554fed512a603426bfa1
1package 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}
142