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