120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood/*
220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood * Copyright (C) 2010 The Android Open Source Project
320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood * * Licensed under the Apache License, Version 2.0 (the "License");
420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood * you may not use this file except in compliance with the License.
520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood * You may obtain a copy of the License at
620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood *
720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood *      http://www.apache.org/licenses/LICENSE-2.0
820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood *
920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood * Unless required by applicable law or agreed to in writing, software
1020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS,
1120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood * See the License for the specific language governing permissions and
1320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood * limitations under the License.
1420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood */
1520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
1620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodpackage com.android.camerabrowser;
1720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
1820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.app.Activity;
1920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.content.ActivityNotFoundException;
2020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.content.Context;
2120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.content.Intent;
2220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.graphics.Bitmap;
2320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.graphics.BitmapFactory;
2420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.media.MediaScannerConnection;
2520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.media.MediaScannerConnection.MediaScannerConnectionClient;
2620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.mtp.MtpConstants;
2720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.mtp.MtpObjectInfo;
2820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.net.Uri;
2920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.os.Bundle;
3020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.os.Environment;
3120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.util.Log;
3220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.view.View;
3320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.widget.Button;
3420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.widget.ImageView;
3520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.widget.TextView;
3620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.widget.Toast;
3720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
3820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport java.io.File;
3920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport java.util.Date;
40dcb1a58cf9d66b36de825dae2fa0cb0529e60680Elliott Hughesimport java.util.Locale;
4120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
4220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood/**
4320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood * A view to display the properties of an object.
4420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood */
4520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodpublic class ObjectViewer extends Activity implements View.OnClickListener {
4620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
4720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    private static final String TAG = "ObjectViewer";
4820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
4920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    private MtpClient mClient;
5020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    private String mDeviceName;
5120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    private int mStorageID;
5220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    private int mObjectID;
5320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    private String mFileName;
5420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    private Button mImportButton;
5520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    private Button mDeleteButton;
5620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    private DeviceDisconnectedReceiver mDisconnectedReceiver;
5720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
5820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    private final class ScannerClient implements MediaScannerConnectionClient {
5920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        private final Context mContext;
6020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        private String mPath;
6120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
6220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        public ScannerClient(Context context) {
6320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            mContext = context;
6420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        }
6520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
6620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        public void setScanPath(String path) {
6720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            mPath = path;
6820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        }
6920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
7020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        @Override
7120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        public void onMediaScannerConnected() {
7220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            mScannerConnection.scanFile(mPath, null);
7320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        }
7420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
7520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        @Override
7620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        public void onScanCompleted(String path, Uri uri) {
7720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            mScannerConnection.disconnect();
7820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
7920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            // try to start an activity to view the file
8020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            Intent intent = new Intent(Intent.ACTION_VIEW, uri);
8120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            try {
8220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                mContext.startActivity(intent);
8320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            } catch (ActivityNotFoundException e) {
8420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                Toast.makeText(mContext, R.string.start_activity_failed_message,
8520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                        Toast.LENGTH_SHORT).show();
8620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            }
8720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        }
8820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    }
8920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
9020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    private MediaScannerConnection mScannerConnection;
9120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    private ScannerClient mScannerClient;
9220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
9320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    @Override
9420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    protected void onCreate(Bundle savedInstanceState) {
9520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        super.onCreate(savedInstanceState);
9620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
9720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        mClient = ((CameraBrowserApplication)getApplication()).getMtpClient();
9820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
9920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        setContentView(R.layout.object_info);
10020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
10120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        mImportButton = (Button)findViewById(R.id.import_button);
10220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        mImportButton.setOnClickListener(this);
10320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        mDeleteButton = (Button)findViewById(R.id.delete_button);
10420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        mDeleteButton.setOnClickListener(this);
10520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
10620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        mDeviceName = getIntent().getStringExtra("device");
10720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        mStorageID = getIntent().getIntExtra("storage", 0);
10820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        mObjectID = getIntent().getIntExtra("object", 0);
10920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        mDisconnectedReceiver = new DeviceDisconnectedReceiver(this, mDeviceName);
11020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        mScannerClient = new ScannerClient(this);
11120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        mScannerConnection = new MediaScannerConnection(this, mScannerClient);
11220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    }
11320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
11420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    @Override
11520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    protected void onResume() {
11620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        super.onResume();
11720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
11820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        MtpObjectInfo info = mClient.getObjectInfo(mDeviceName, mObjectID);
11920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        if (info != null) {
12020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            TextView view = (TextView)findViewById(R.id.name);
12120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            mFileName = info.getName();
12220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view.setText(mFileName);
12320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view = (TextView)findViewById(R.id.format);
124dcb1a58cf9d66b36de825dae2fa0cb0529e60680Elliott Hughes            view.setText(Integer.toHexString(info.getFormat()).toUpperCase(Locale.ROOT));
12520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view = (TextView)findViewById(R.id.size);
12620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view.setText(Long.toString(info.getCompressedSize()));
12720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view = (TextView)findViewById(R.id.thumb_width);
12820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view.setText(Long.toString(info.getThumbPixWidth()));
12920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view = (TextView)findViewById(R.id.thumb_height);
13020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view.setText(Long.toString(info.getThumbPixHeight()));
13120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view = (TextView)findViewById(R.id.thumb_size);
13220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view.setText(Long.toString(info.getThumbCompressedSize()));
13320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view = (TextView)findViewById(R.id.width);
13420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view.setText(Long.toString(info.getImagePixWidth()));
13520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view = (TextView)findViewById(R.id.height);
13620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view.setText(Long.toString(info.getImagePixHeight()));
13720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view = (TextView)findViewById(R.id.depth);
13820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view.setText(Long.toString(info.getImagePixDepth()));
13920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view = (TextView)findViewById(R.id.sequence);
14020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view.setText(Long.toString(info.getSequenceNumber()));
14120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view = (TextView)findViewById(R.id.created);
14220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            Date date = new Date(info.getDateCreated() * 1000);
14320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view.setText(date.toString());
14420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view = (TextView)findViewById(R.id.modified);
14520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            date = new Date(info.getDateModified() * 1000);
14620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view.setText(date.toString());
14720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view = (TextView)findViewById(R.id.keywords);
14820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            view.setText(info.getKeywords());
14920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            int thumbFormat = info.getThumbFormat();
15020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            if (thumbFormat == MtpConstants.FORMAT_EXIF_JPEG
15120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                    || thumbFormat == MtpConstants.FORMAT_JFIF) {
15220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                byte[] thumbnail = mClient.getThumbnail(mDeviceName, info.getObjectHandle());
15320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                if (thumbnail != null) {
15420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                    Bitmap bitmap = BitmapFactory.decodeByteArray(thumbnail, 0, thumbnail.length);
15520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                    if (bitmap != null) {
15620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                        ImageView thumbView = (ImageView)findViewById(R.id.thumbnail);
15720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                        thumbView.setImageBitmap(bitmap);
15820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                    }
15920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                }
16020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            }
16120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        }
16220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    }
16320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
16420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    @Override
16520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    protected void onDestroy() {
16620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        unregisterReceiver(mDisconnectedReceiver);
16720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        super.onDestroy();
16820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    }
16920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
17020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    private void importObject() {
17120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        // copy file to /mnt/sdcard/imported/<filename>
17220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        File dest = Environment.getExternalStorageDirectory();
17320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        dest = new File(dest, "imported");
17420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        dest.mkdirs();
17520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        dest = new File(dest, mFileName);
17620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
17720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        if (mClient.importFile(mDeviceName, mObjectID, dest.getAbsolutePath())) {
17820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            Toast.makeText(this, R.string.object_saved_message, Toast.LENGTH_SHORT).show();
17920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
18020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            mScannerClient.setScanPath(dest.getAbsolutePath());
18120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            mScannerConnection.connect();
18220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        } else {
18320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            Toast.makeText(this, R.string.save_failed_message, Toast.LENGTH_SHORT).show();
18420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        }
18520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    }
18620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
18720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    private void deleteObject() {
18820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        if (mClient.deleteObject(mDeviceName, mObjectID)) {
18920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            Toast.makeText(this, R.string.object_deleted_message, Toast.LENGTH_SHORT).show();
19020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            finish();
19120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        } else {
19220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            Toast.makeText(this, R.string.delete_failed_message, Toast.LENGTH_SHORT).show();
19320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        }
19420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    }
19520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
19620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    public void onClick(View v) {
19720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        if (v == mImportButton) {
19820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            importObject();
19920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        } else if (v == mDeleteButton) {
20020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            deleteObject();
20120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        }
20220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    }
20320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood}
204