| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.camerabrowser; |
| |
| import android.app.Activity; |
| import android.content.ActivityNotFoundException; |
| import android.content.Context; |
| import android.content.Intent; |
| import android.graphics.Bitmap; |
| import android.graphics.BitmapFactory; |
| import android.media.MediaScannerConnection; |
| import android.media.MediaScannerConnection.MediaScannerConnectionClient; |
| import android.mtp.MtpConstants; |
| import android.mtp.MtpObjectInfo; |
| import android.net.Uri; |
| import android.os.Bundle; |
| import android.os.Environment; |
| import android.util.Log; |
| import android.view.View; |
| import android.widget.Button; |
| import android.widget.ImageView; |
| import android.widget.TextView; |
| import android.widget.Toast; |
| |
| import java.io.File; |
| import java.util.Date; |
| import java.util.Locale; |
| |
| /** |
| * A view to display the properties of an object. |
| */ |
| public class ObjectViewer extends Activity implements View.OnClickListener { |
| |
| private static final String TAG = "ObjectViewer"; |
| |
| private MtpClient mClient; |
| private String mDeviceName; |
| private int mStorageID; |
| private int mObjectID; |
| private String mFileName; |
| private Button mImportButton; |
| private Button mDeleteButton; |
| private DeviceDisconnectedReceiver mDisconnectedReceiver; |
| |
| private final class ScannerClient implements MediaScannerConnectionClient { |
| private final Context mContext; |
| private String mPath; |
| |
| public ScannerClient(Context context) { |
| mContext = context; |
| } |
| |
| public void setScanPath(String path) { |
| mPath = path; |
| } |
| |
| @Override |
| public void onMediaScannerConnected() { |
| mScannerConnection.scanFile(mPath, null); |
| } |
| |
| @Override |
| public void onScanCompleted(String path, Uri uri) { |
| mScannerConnection.disconnect(); |
| |
| // try to start an activity to view the file |
| Intent intent = new Intent(Intent.ACTION_VIEW, uri); |
| try { |
| mContext.startActivity(intent); |
| } catch (ActivityNotFoundException e) { |
| Toast.makeText(mContext, R.string.start_activity_failed_message, |
| Toast.LENGTH_SHORT).show(); |
| } |
| } |
| } |
| |
| private MediaScannerConnection mScannerConnection; |
| private ScannerClient mScannerClient; |
| |
| @Override |
| protected void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| |
| mClient = ((CameraBrowserApplication)getApplication()).getMtpClient(); |
| |
| setContentView(R.layout.object_info); |
| |
| mImportButton = (Button)findViewById(R.id.import_button); |
| mImportButton.setOnClickListener(this); |
| mDeleteButton = (Button)findViewById(R.id.delete_button); |
| mDeleteButton.setOnClickListener(this); |
| |
| mDeviceName = getIntent().getStringExtra("device"); |
| mStorageID = getIntent().getIntExtra("storage", 0); |
| mObjectID = getIntent().getIntExtra("object", 0); |
| mDisconnectedReceiver = new DeviceDisconnectedReceiver(this, mDeviceName); |
| mScannerClient = new ScannerClient(this); |
| mScannerConnection = new MediaScannerConnection(this, mScannerClient); |
| } |
| |
| @Override |
| protected void onResume() { |
| super.onResume(); |
| |
| MtpObjectInfo info = mClient.getObjectInfo(mDeviceName, mObjectID); |
| if (info != null) { |
| TextView view = (TextView)findViewById(R.id.name); |
| mFileName = info.getName(); |
| view.setText(mFileName); |
| view = (TextView)findViewById(R.id.format); |
| view.setText(Integer.toHexString(info.getFormat()).toUpperCase(Locale.ROOT)); |
| view = (TextView)findViewById(R.id.size); |
| view.setText(Long.toString(info.getCompressedSize())); |
| view = (TextView)findViewById(R.id.thumb_width); |
| view.setText(Long.toString(info.getThumbPixWidth())); |
| view = (TextView)findViewById(R.id.thumb_height); |
| view.setText(Long.toString(info.getThumbPixHeight())); |
| view = (TextView)findViewById(R.id.thumb_size); |
| view.setText(Long.toString(info.getThumbCompressedSize())); |
| view = (TextView)findViewById(R.id.width); |
| view.setText(Long.toString(info.getImagePixWidth())); |
| view = (TextView)findViewById(R.id.height); |
| view.setText(Long.toString(info.getImagePixHeight())); |
| view = (TextView)findViewById(R.id.depth); |
| view.setText(Long.toString(info.getImagePixDepth())); |
| view = (TextView)findViewById(R.id.sequence); |
| view.setText(Long.toString(info.getSequenceNumber())); |
| view = (TextView)findViewById(R.id.created); |
| Date date = new Date(info.getDateCreated() * 1000); |
| view.setText(date.toString()); |
| view = (TextView)findViewById(R.id.modified); |
| date = new Date(info.getDateModified() * 1000); |
| view.setText(date.toString()); |
| view = (TextView)findViewById(R.id.keywords); |
| view.setText(info.getKeywords()); |
| int thumbFormat = info.getThumbFormat(); |
| if (thumbFormat == MtpConstants.FORMAT_EXIF_JPEG |
| || thumbFormat == MtpConstants.FORMAT_JFIF) { |
| byte[] thumbnail = mClient.getThumbnail(mDeviceName, info.getObjectHandle()); |
| if (thumbnail != null) { |
| Bitmap bitmap = BitmapFactory.decodeByteArray(thumbnail, 0, thumbnail.length); |
| if (bitmap != null) { |
| ImageView thumbView = (ImageView)findViewById(R.id.thumbnail); |
| thumbView.setImageBitmap(bitmap); |
| } |
| } |
| } |
| } |
| } |
| |
| @Override |
| protected void onDestroy() { |
| unregisterReceiver(mDisconnectedReceiver); |
| super.onDestroy(); |
| } |
| |
| private void importObject() { |
| // copy file to /mnt/sdcard/imported/<filename> |
| File dest = Environment.getExternalStorageDirectory(); |
| dest = new File(dest, "imported"); |
| dest.mkdirs(); |
| dest = new File(dest, mFileName); |
| |
| if (mClient.importFile(mDeviceName, mObjectID, dest.getAbsolutePath())) { |
| Toast.makeText(this, R.string.object_saved_message, Toast.LENGTH_SHORT).show(); |
| |
| mScannerClient.setScanPath(dest.getAbsolutePath()); |
| mScannerConnection.connect(); |
| } else { |
| Toast.makeText(this, R.string.save_failed_message, Toast.LENGTH_SHORT).show(); |
| } |
| } |
| |
| private void deleteObject() { |
| if (mClient.deleteObject(mDeviceName, mObjectID)) { |
| Toast.makeText(this, R.string.object_deleted_message, Toast.LENGTH_SHORT).show(); |
| finish(); |
| } else { |
| Toast.makeText(this, R.string.delete_failed_message, Toast.LENGTH_SHORT).show(); |
| } |
| } |
| |
| public void onClick(View v) { |
| if (v == mImportButton) { |
| importObject(); |
| } else if (v == mDeleteButton) { |
| deleteObject(); |
| } |
| } |
| } |