Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1979628e authored by Mike Lockwood's avatar Mike Lockwood Committed by Android (Google) Code Review
Browse files

Merge "CameraBrowser: Add support for copying files from camera to internal storage."

parents 2f493f0f ad0643a3
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.camerabrowser">
    package="com.android.camerabrowser">


    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application android:label="@string/app_label">
    <application android:label="@string/app_label">
        <activity android:name="CameraBrowser" android:label="Camera Browser">
        <activity android:name="CameraBrowser" android:label="Camera Browser">
            <intent-filter>
            <intent-filter>
+2 −0
Original line number Original line Diff line number Diff line
@@ -16,6 +16,8 @@


<menu xmlns:android="http://schemas.android.com/apk/res/android">
<menu xmlns:android="http://schemas.android.com/apk/res/android">


    <item android:id="@+id/save"
        android:title="@string/save_item" />
    <item android:id="@+id/delete"
    <item android:id="@+id/delete"
        android:title="@string/delete_item" />
        android:title="@string/delete_item" />
</menu>
</menu>
+3 −0
Original line number Original line Diff line number Diff line
@@ -32,9 +32,12 @@
    <string name="keywords_label">Keywords: </string>
    <string name="keywords_label">Keywords: </string>


    <!-- menu items -->
    <!-- menu items -->
    <string name="save_item">Save</string>
    <string name="delete_item">Delete</string>
    <string name="delete_item">Delete</string>


    <!-- toasts -->
    <!-- toasts -->
    <string name="object_saved_message">Object saved</string>
    <string name="save_failed_message">Could not save object</string>
    <string name="object_deleted_message">Object deleted</string>
    <string name="object_deleted_message">Object deleted</string>
    <string name="delete_failed_message">Could not delete object</string>
    <string name="delete_failed_message">Could not delete object</string>


+0 −45
Original line number Original line Diff line number Diff line
@@ -26,16 +26,12 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.Bundle;
import android.provider.Mtp;
import android.provider.Mtp;
import android.util.Log;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ListView;
import android.widget.ResourceCursorAdapter;
import android.widget.ResourceCursorAdapter;
import android.widget.TextView;
import android.widget.TextView;
import android.widget.Toast;


 /**
 /**
 * A list view displaying all objects within a container (folder or storage unit).
 * A list view displaying all objects within a container (folder or storage unit).
@@ -119,47 +115,6 @@ public class ObjectBrowser extends ListActivity {
        }
        }
    }
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.object_menu, menu);
        return true;
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        int position = mList.getSelectedItemPosition();
        MenuItem item = menu.findItem(R.id.delete);
        item.setEnabled(position != AdapterView.INVALID_POSITION);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.delete:
                deleteSelected();
                return true;
        }
        return false;
    }

    private void deleteSelected() {
        int position = mList.getSelectedItemPosition();
        int rowID = (int)mAdapter.getItemId(position);
        Uri uri = Mtp.Object.getContentUri(mDeviceID, rowID);

        Log.d(TAG, "deleting " + uri);

        int result = getContentResolver().delete(uri, null, null);
        if (result > 0) {
            Toast.makeText(this, R.string.object_deleted_message, Toast.LENGTH_SHORT).show();
            mCursor.requery();
        } else {
            Toast.makeText(this, R.string.delete_failed_message, Toast.LENGTH_SHORT).show();
        }
    }

    private class ObjectCursorAdapter extends ResourceCursorAdapter {
    private class ObjectCursorAdapter extends ResourceCursorAdapter {


        public ObjectCursorAdapter(Context context, Cursor c) {
        public ObjectCursorAdapter(Context context, Cursor c) {
+136 −6
Original line number Original line Diff line number Diff line
@@ -22,12 +22,25 @@ import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.net.Uri;
import android.os.Bundle;
import android.os.Bundle;
import android.os.Environment;
import android.os.FileUtils;
import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.provider.Mtp;
import android.provider.Mtp;
import android.util.Log;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View;
import android.widget.ImageView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.TextView;
import android.widget.Toast;


import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.Date;


/**
/**
@@ -106,18 +119,135 @@ public class ObjectViewer extends Activity {
            view.setText(c.getString(12));
            view.setText(c.getString(12));
            byte[] thumbnail = c.getBlob(13);
            byte[] thumbnail = c.getBlob(13);
            if (thumbnail != null) {
            if (thumbnail != null) {
                Log.d(TAG, "got thumbnail, length: " + thumbnail.length);
                for (int i = 0; i < 50; i++) {
                    Log.d(TAG, "    " + Integer.toHexString(thumbnail[i]));
                }

                ImageView thumbView = (ImageView)findViewById(R.id.thumbnail);
                ImageView thumbView = (ImageView)findViewById(R.id.thumbnail);
                Bitmap bitmap = BitmapFactory.decodeByteArray(thumbnail, 0, thumbnail.length);
                Bitmap bitmap = BitmapFactory.decodeByteArray(thumbnail, 0, thumbnail.length);
                Log.d(TAG, "bitmap: " + bitmap);
                if (bitmap != null) {
                if (bitmap != null) {
                    thumbView.setImageBitmap(bitmap);
                    thumbView.setImageBitmap(bitmap);
                }
                }
            }
            }
        }
        }
    }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.object_menu, menu);
        return true;
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        MenuItem item = menu.findItem(R.id.save);
        item.setEnabled(true);
        item = menu.findItem(R.id.delete);
        item.setEnabled(true);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.save:
                save();
                return true;
            case R.id.delete:
                delete();
                return true;
        }
        return false;
    }

    private static String getTimestamp() {
        Calendar c = Calendar.getInstance();
        c.setTimeInMillis(System.currentTimeMillis());
        return String.format("%tY-%tm-%td-%tH-%tM-%tS", c, c, c, c, c, c);
    }

    private void save() {
        boolean success = false;
        Uri uri = Mtp.Object.getContentUri(mDeviceID, mObjectID);
        File destFile = null;
        ParcelFileDescriptor pfd = null;
        FileInputStream fis = null;
        FileOutputStream fos = null;

        try {
            pfd = getContentResolver().openFileDescriptor(uri, "r");
            Log.d(TAG, "save got pfd " + pfd);
            if (pfd != null) {
                fis = new FileInputStream(pfd.getFileDescriptor());
                Log.d(TAG, "save got fis " + fis);
                File destDir = Environment.getExternalStoragePublicDirectory(
                        Environment.DIRECTORY_DCIM);
                destDir.mkdirs();
                destFile = new File(destDir, "CameraBrowser-" + getTimestamp() + ".jpeg");


                Log.d(TAG, "save got destFile " + destFile);

                if (destFile.exists()) {
                    destFile.delete();
                }
                fos = new FileOutputStream(destFile);

                byte[] buffer = new byte[65536];
                int bytesRead;
                while ((bytesRead = fis.read(buffer)) >= 0) {
                    Log.d(TAG, "copying the bytes numbering " + bytesRead);
                    fos.write(buffer, 0, bytesRead);
                }

                // temporary workaround until we straighten out permissions in /data/media
                // 1015 is AID_SDCARD_RW
                FileUtils.setPermissions(destDir.getPath(), 0775, Process.myUid(), 1015);
                FileUtils.setPermissions(destFile.getPath(), 0664, Process.myUid(), 1015);

                success = true;
            }
        } catch (Exception e) {
            Log.e(TAG, "Exception in ObjectView.save", e);
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (Exception e) {
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (Exception e) {
                }
            }
            if (pfd != null) {
                try {
                    pfd.close();
                } catch (Exception e) {
                }
            }
        }

        if (success) {
            Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
            intent.setData(Uri.fromFile(destFile));
            sendBroadcast(intent);
            Toast.makeText(this, R.string.object_saved_message, Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, R.string.save_failed_message, Toast.LENGTH_SHORT).show();
        }
    }

    private void delete() {
        Uri uri = Mtp.Object.getContentUri(mDeviceID, mObjectID);

        Log.d(TAG, "deleting " + uri);

        int result = getContentResolver().delete(uri, null, null);
        if (result > 0) {
            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();
        }
    }
}
}