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