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 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