• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
16 package com.android.camerabrowser;
17 
18 import android.app.Activity;
19 import android.content.ActivityNotFoundException;
20 import android.content.Context;
21 import android.content.Intent;
22 import android.graphics.Bitmap;
23 import android.graphics.BitmapFactory;
24 import android.media.MediaScannerConnection;
25 import android.media.MediaScannerConnection.MediaScannerConnectionClient;
26 import android.mtp.MtpConstants;
27 import android.mtp.MtpObjectInfo;
28 import android.net.Uri;
29 import android.os.Bundle;
30 import android.os.Environment;
31 import android.util.Log;
32 import android.view.View;
33 import android.widget.Button;
34 import android.widget.ImageView;
35 import android.widget.TextView;
36 import android.widget.Toast;
37 
38 import java.io.File;
39 import java.util.Date;
40 
41 /**
42  * A view to display the properties of an object.
43  */
44 public 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 
ScannerClient(Context context)61         public ScannerClient(Context context) {
62             mContext = context;
63         }
64 
setScanPath(String path)65         public void setScanPath(String path) {
66             mPath = path;
67         }
68 
69         @Override
onMediaScannerConnected()70         public void onMediaScannerConnected() {
71             mScannerConnection.scanFile(mPath, null);
72         }
73 
74         @Override
onScanCompleted(String path, Uri uri)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
onCreate(Bundle savedInstanceState)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
onResume()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
onDestroy()164     protected void onDestroy() {
165         unregisterReceiver(mDisconnectedReceiver);
166         super.onDestroy();
167     }
168 
importObject()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 
deleteObject()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 
onClick(View v)195     public void onClick(View v) {
196         if (v == mImportButton) {
197             importObject();
198         } else if (v == mDeleteButton) {
199             deleteObject();
200         }
201     }
202 }
203