ObjectViewer.java revision 4453aa4c306871bb85fcf1d6efcaaf151327f2ce
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.ContentValues; 21import android.content.Intent; 22import android.database.Cursor; 23import android.graphics.Bitmap; 24import android.graphics.BitmapFactory; 25import android.net.Uri; 26import android.os.Bundle; 27import android.os.Environment; 28import android.provider.Ptp; 29import android.util.Log; 30import android.view.View; 31import android.widget.Button; 32import android.widget.ImageView; 33import android.widget.TextView; 34import android.widget.Toast; 35 36import java.io.File; 37import java.util.Date; 38 39/** 40 * A view to display the properties of an object. 41 */ 42public class ObjectViewer extends Activity implements View.OnClickListener { 43 44 private static final String TAG = "ObjectViewer"; 45 46 private int mDeviceID; 47 private long mStorageID; 48 private long mObjectID; 49 private String mFileName; 50 private Button mImportButton; 51 private Button mDeleteButton; 52 private DeviceDisconnectedReceiver mDisconnectedReceiver; 53 54 private static final String[] OBJECT_COLUMNS = 55 new String[] { Ptp.Object._ID, 56 Ptp.Object.NAME, 57 Ptp.Object.SIZE, 58 Ptp.Object.THUMB_WIDTH, 59 Ptp.Object.THUMB_HEIGHT, 60 Ptp.Object.THUMB_SIZE, 61 Ptp.Object.IMAGE_WIDTH, 62 Ptp.Object.IMAGE_HEIGHT, 63 Ptp.Object.IMAGE_DEPTH, 64 Ptp.Object.SEQUENCE_NUMBER, 65 Ptp.Object.DATE_CREATED, 66 Ptp.Object.DATE_MODIFIED, 67 Ptp.Object.KEYWORDS, 68 Ptp.Object.THUMB, 69 Ptp.Object.FORMAT, 70 }; 71 72 @Override 73 protected void onCreate(Bundle savedInstanceState) { 74 super.onCreate(savedInstanceState); 75 76 setContentView(R.layout.object_info); 77 78 mImportButton = (Button)findViewById(R.id.import_button); 79 mImportButton.setOnClickListener(this); 80 mDeleteButton = (Button)findViewById(R.id.delete_button); 81 mDeleteButton.setOnClickListener(this); 82 83 mDeviceID = getIntent().getIntExtra("device", 0); 84 mStorageID = getIntent().getLongExtra("storage", 0); 85 mObjectID = getIntent().getLongExtra("object", 0); 86 mDisconnectedReceiver = new DeviceDisconnectedReceiver(this, mDeviceID); 87 } 88 89 @Override 90 protected void onResume() { 91 super.onResume(); 92 93 if (mDeviceID != 0 && mObjectID != 0) { 94 Cursor c = getContentResolver().query( 95 Ptp.Object.getContentUri(mDeviceID, mObjectID), 96 OBJECT_COLUMNS, null, null, null); 97 c.moveToFirst(); 98 TextView view = (TextView)findViewById(R.id.name); 99 mFileName = c.getString(1); 100 view.setText(mFileName); 101 view = (TextView)findViewById(R.id.size); 102 view.setText(Long.toString(c.getLong(2))); 103 view = (TextView)findViewById(R.id.thumb_width); 104 view.setText(Long.toString(c.getLong(3))); 105 view = (TextView)findViewById(R.id.thumb_height); 106 view.setText(Long.toString(c.getLong(4))); 107 view = (TextView)findViewById(R.id.thumb_size); 108 view.setText(Long.toString(c.getLong(5))); 109 view = (TextView)findViewById(R.id.width); 110 view.setText(Long.toString(c.getLong(6))); 111 view = (TextView)findViewById(R.id.height); 112 view.setText(Long.toString(c.getLong(7))); 113 view = (TextView)findViewById(R.id.depth); 114 view.setText(Long.toString(c.getLong(8))); 115 view = (TextView)findViewById(R.id.sequence); 116 view.setText(Long.toString(c.getLong(9))); 117 view = (TextView)findViewById(R.id.created); 118 Date date = new Date(c.getLong(10) * 1000); 119 view.setText(date.toString()); 120 view = (TextView)findViewById(R.id.modified); 121 date = new Date(c.getLong(11) * 1000); 122 view.setText(date.toString()); 123 view = (TextView)findViewById(R.id.keywords); 124 view.setText(c.getString(12)); 125 byte[] thumbnail = c.getBlob(13); 126 if (thumbnail != null) { 127 ImageView thumbView = (ImageView)findViewById(R.id.thumbnail); 128 Bitmap bitmap = BitmapFactory.decodeByteArray(thumbnail, 0, thumbnail.length); 129 if (bitmap != null) { 130 thumbView.setImageBitmap(bitmap); 131 } 132 } 133 view = (TextView)findViewById(R.id.format); 134 view.setText(Long.toHexString(c.getLong(14)).toUpperCase()); 135 } 136 } 137 138 @Override 139 protected void onDestroy() { 140 unregisterReceiver(mDisconnectedReceiver); 141 super.onDestroy(); 142 } 143 144 private void importObject() { 145 // copy file to /mnt/sdcard/imported/<filename> 146 File dest = Environment.getExternalStorageDirectory(); 147 dest = new File(dest, "imported"); 148 dest.mkdirs(); 149 dest = new File(dest, mFileName); 150 151 Uri requestUri = Ptp.Object.getContentUriForImport(mDeviceID, mObjectID, 152 dest.getAbsolutePath()); 153 Uri resultUri = getContentResolver().insert(requestUri, new ContentValues()); 154 Log.d(TAG, "save returned " + resultUri); 155 156 if (resultUri != null) { 157 Toast.makeText(this, R.string.object_saved_message, Toast.LENGTH_SHORT).show(); 158 Intent intent = new Intent(Intent.ACTION_VIEW, resultUri); 159 try { 160 startActivity(intent); 161 } catch (ActivityNotFoundException e) { 162 Toast.makeText(this, R.string.start_activity_failed_message, Toast.LENGTH_SHORT).show(); 163 } 164 } else { 165 Toast.makeText(this, R.string.save_failed_message, Toast.LENGTH_SHORT).show(); 166 } 167 } 168 169 private void deleteObject() { 170 Uri uri = Ptp.Object.getContentUri(mDeviceID, mObjectID); 171 172 Log.d(TAG, "deleting " + uri); 173 174 int result = getContentResolver().delete(uri, null, null); 175 if (result > 0) { 176 Toast.makeText(this, R.string.object_deleted_message, Toast.LENGTH_SHORT).show(); 177 finish(); 178 } else { 179 Toast.makeText(this, R.string.delete_failed_message, Toast.LENGTH_SHORT).show(); 180 } 181 } 182 183 public void onClick(View v) { 184 if (v == mImportButton) { 185 importObject(); 186 } else if (v == mDeleteButton) { 187 deleteObject(); 188 } 189 } 190} 191