1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 * * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *      http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16package com.android.camerabrowser;
17
18import android.app.Activity;
19import android.content.ActivityNotFoundException;
20import android.content.Context;
21import android.content.Intent;
22import android.graphics.Bitmap;
23import android.graphics.BitmapFactory;
24import android.media.MediaScannerConnection;
25import android.media.MediaScannerConnection.MediaScannerConnectionClient;
26import android.mtp.MtpConstants;
27import android.mtp.MtpObjectInfo;
28import android.net.Uri;
29import android.os.Bundle;
30import android.os.Environment;
31import android.util.Log;
32import android.view.View;
33import android.widget.Button;
34import android.widget.ImageView;
35import android.widget.TextView;
36import android.widget.Toast;
37
38import java.io.File;
39import java.util.Date;
40
41/**
42 * A view to display the properties of an object.
43 */
44public class ObjectViewer extends Activity implements View.OnClickListener {
45
46    private static final String TAG = "ObjectViewer";
47
48    private MtpClient mClient;
49    private String mDeviceName;
50    private int mStorageID;
51    private int mObjectID;
52    private String mFileName;
53    private Button mImportButton;
54    private Button mDeleteButton;
55    private DeviceDisconnectedReceiver mDisconnectedReceiver;
56
57    private final class ScannerClient implements MediaScannerConnectionClient {
58        private final Context mContext;
59        private String mPath;
60
61        public ScannerClient(Context context) {
62            mContext = context;
63        }
64
65        public void setScanPath(String path) {
66            mPath = path;
67        }
68
69        @Override
70        public void onMediaScannerConnected() {
71            mScannerConnection.scanFile(mPath, null);
72        }
73
74        @Override
75        public void onScanCompleted(String path, Uri uri) {
76            mScannerConnection.disconnect();
77
78            // try to start an activity to view the file
79            Intent intent = new Intent(Intent.ACTION_VIEW, uri);
80            try {
81                mContext.startActivity(intent);
82            } catch (ActivityNotFoundException e) {
83                Toast.makeText(mContext, R.string.start_activity_failed_message,
84                        Toast.LENGTH_SHORT).show();
85            }
86        }
87    }
88
89    private MediaScannerConnection mScannerConnection;
90    private ScannerClient mScannerClient;
91
92    @Override
93    protected void onCreate(Bundle savedInstanceState) {
94        super.onCreate(savedInstanceState);
95
96        mClient = ((CameraBrowserApplication)getApplication()).getMtpClient();
97
98        setContentView(R.layout.object_info);
99
100        mImportButton = (Button)findViewById(R.id.import_button);
101        mImportButton.setOnClickListener(this);
102        mDeleteButton = (Button)findViewById(R.id.delete_button);
103        mDeleteButton.setOnClickListener(this);
104
105        mDeviceName = getIntent().getStringExtra("device");
106        mStorageID = getIntent().getIntExtra("storage", 0);
107        mObjectID = getIntent().getIntExtra("object", 0);
108        mDisconnectedReceiver = new DeviceDisconnectedReceiver(this, mDeviceName);
109        mScannerClient = new ScannerClient(this);
110        mScannerConnection = new MediaScannerConnection(this, mScannerClient);
111    }
112
113    @Override
114    protected void onResume() {
115        super.onResume();
116
117        MtpObjectInfo info = mClient.getObjectInfo(mDeviceName, mObjectID);
118        if (info != null) {
119            TextView view = (TextView)findViewById(R.id.name);
120            mFileName = info.getName();
121            view.setText(mFileName);
122            view = (TextView)findViewById(R.id.format);
123            view.setText(Integer.toHexString(info.getFormat()).toUpperCase());
124            view = (TextView)findViewById(R.id.size);
125            view.setText(Long.toString(info.getCompressedSize()));
126            view = (TextView)findViewById(R.id.thumb_width);
127            view.setText(Long.toString(info.getThumbPixWidth()));
128            view = (TextView)findViewById(R.id.thumb_height);
129            view.setText(Long.toString(info.getThumbPixHeight()));
130            view = (TextView)findViewById(R.id.thumb_size);
131            view.setText(Long.toString(info.getThumbCompressedSize()));
132            view = (TextView)findViewById(R.id.width);
133            view.setText(Long.toString(info.getImagePixWidth()));
134            view = (TextView)findViewById(R.id.height);
135            view.setText(Long.toString(info.getImagePixHeight()));
136            view = (TextView)findViewById(R.id.depth);
137            view.setText(Long.toString(info.getImagePixDepth()));
138            view = (TextView)findViewById(R.id.sequence);
139            view.setText(Long.toString(info.getSequenceNumber()));
140            view = (TextView)findViewById(R.id.created);
141            Date date = new Date(info.getDateCreated() * 1000);
142            view.setText(date.toString());
143            view = (TextView)findViewById(R.id.modified);
144            date = new Date(info.getDateModified() * 1000);
145            view.setText(date.toString());
146            view = (TextView)findViewById(R.id.keywords);
147            view.setText(info.getKeywords());
148            int thumbFormat = info.getThumbFormat();
149            if (thumbFormat == MtpConstants.FORMAT_EXIF_JPEG
150                    || thumbFormat == MtpConstants.FORMAT_JFIF) {
151                byte[] thumbnail = mClient.getThumbnail(mDeviceName, info.getObjectHandle());
152                if (thumbnail != null) {
153                    Bitmap bitmap = BitmapFactory.decodeByteArray(thumbnail, 0, thumbnail.length);
154                    if (bitmap != null) {
155                        ImageView thumbView = (ImageView)findViewById(R.id.thumbnail);
156                        thumbView.setImageBitmap(bitmap);
157                    }
158                }
159            }
160        }
161    }
162
163    @Override
164    protected void onDestroy() {
165        unregisterReceiver(mDisconnectedReceiver);
166        super.onDestroy();
167    }
168
169    private void importObject() {
170        // copy file to /mnt/sdcard/imported/<filename>
171        File dest = Environment.getExternalStorageDirectory();
172        dest = new File(dest, "imported");
173        dest.mkdirs();
174        dest = new File(dest, mFileName);
175
176        if (mClient.importFile(mDeviceName, mObjectID, dest.getAbsolutePath())) {
177            Toast.makeText(this, R.string.object_saved_message, Toast.LENGTH_SHORT).show();
178
179            mScannerClient.setScanPath(dest.getAbsolutePath());
180            mScannerConnection.connect();
181        } else {
182            Toast.makeText(this, R.string.save_failed_message, Toast.LENGTH_SHORT).show();
183        }
184    }
185
186    private void deleteObject() {
187        if (mClient.deleteObject(mDeviceName, mObjectID)) {
188            Toast.makeText(this, R.string.object_deleted_message, Toast.LENGTH_SHORT).show();
189            finish();
190        } else {
191            Toast.makeText(this, R.string.delete_failed_message, Toast.LENGTH_SHORT).show();
192        }
193    }
194
195    public void onClick(View v) {
196        if (v == mImportButton) {
197            importObject();
198        } else if (v == mDeleteButton) {
199            deleteObject();
200        }
201    }
202}
203