org.ktaka.picasasample.PicasaUploadActivity.java Source code

Java tutorial

Introduction

Here is the source code for org.ktaka.picasasample.PicasaUploadActivity.java

Source

/*
 * Copyright (c) 2013 Kenichi Takahashi
 *
 * 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 org.ktaka.picasasample;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;

import org.ktaka.api.services.picasa.PicasaClient;
import org.ktaka.api.services.picasa.PicasaUrl;
import org.ktaka.api.services.picasa.model.AlbumEntry;
import org.ktaka.api.services.picasa.model.AlbumFeed;
import org.ktaka.api.services.picasa.model.GmlPoint;
import org.ktaka.api.services.picasa.model.PhotoEntry;
import org.ktaka.api.services.picasa.model.TagEntry;
import org.ktaka.api.services.picasa.model.UserFeed;

import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.InputStreamContent;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson.JacksonFactory;

import android.media.ExifInterface;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.accounts.AccountManager;
import android.app.Activity;
import android.app.Dialog;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.util.Log;
import android.view.Menu;
import android.view.View;

public class PicasaUploadActivity extends Activity {

    /**
     * Be sure to specify the name of your application. If the application name is {@code null} or
     * blank, the application will log a warning. Suggested format is "MyCompany-ProductName/1.0".
     */
    private static final String APPLICATION_NAME = "PicasaUploadTest";

    /** Global instance of the HTTP transport. */
    private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();

    static final String TAG = "PicasaUploadActivity";

    static final int REQUEST_GOOGLE_PLAY_SERVICES = 0;
    static final int REQUEST_AUTHORIZATION = 1;
    static final int REQUEST_ACCOUNT_PICKER = 2;
    static final int REQUEST_PICKED_FROM_GALLERY = 3;
    static final int REQUEST_PICKED_FROM_CAMERA = 4;

    private static final String PREF_ACCOUNT_NAME = "accountName";
    GoogleAccountCredential credential;
    PicasaClient client;
    UserFeed feed;
    Uri imgFileUri;

    int numAsyncTasks;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_picasa_upload);

        credential = GoogleAccountCredential.usingOAuth2(this, Collections.singleton(PicasaUrl.ROOT_URL));
        SharedPreferences settings = getPreferences(Context.MODE_PRIVATE);
        credential.setSelectedAccountName(settings.getString(PREF_ACCOUNT_NAME, null));
        client = new PicasaClient(HTTP_TRANSPORT.createRequestFactory(credential));
        client.setApplicationName(APPLICATION_NAME);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.picasa_upload, menu);
        return true;
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (checkGooglePlayServicesAvailable()) {
            haveGooglePlayServices();
        }
    }

    private AlbumEntry postAlbum(UserFeed feed) throws IOException {
        System.out.println();
        AlbumEntry newAlbum = new AlbumEntry();
        newAlbum.access = "public";
        newAlbum.title = "A new album";
        newAlbum.summary = "Test for MiraiKioku API";
        AlbumEntry album = client.executeInsert(feed, newAlbum);
        showAlbum(album);
        return album;
    }

    private void addTagToPhoto(String feedUrl, String tag) throws IOException {
        TagEntry tagEntry = new TagEntry();
        tagEntry.title = tag;
        PicasaUrl url = new PicasaUrl(feedUrl);
        client.executeAddTagToPhoto(url, tagEntry);
    }

    @SuppressWarnings("unused")
    private PhotoEntry postPhoto(AlbumEntry album, Uri uri) throws IOException {
        String fileName = "test";
        InputStream iStream = getContentResolver().openInputStream(uri);
        InputStreamContent content = new InputStreamContent("image/jpeg", iStream);
        PhotoEntry photo = client.executeInsertPhotoEntry(new PicasaUrl(album.getFeedLink()), content, fileName);
        Log.i("TAG", "Image URL: " + photo.mediaGroup.content.url);
        return photo;
    }

    @SuppressWarnings("unused")
    private PhotoEntry postPhotoWithMetaData(AlbumEntry album, Uri uri) throws IOException {
        // NOTE: this video is not included in the sample
        InputStream iStream = getContentResolver().openInputStream(uri);
        InputStreamContent imgContent = new InputStreamContent("image/jpeg", iStream);
        PhotoEntry photo = new PhotoEntry();
        photo.title = "????";
        photo.summary = "????? upload API ???";
        GmlPoint point = GmlPoint.createLatLon(35.626446, 139.723444);
        PhotoEntry result = client.executeInsertPhotoEntryWithMetadata(photo, new PicasaUrl(album.getFeedLink()),
                imgContent, point);
        Log.i(TAG, "Image URL with Metadata: " + result.mediaGroup.content.url);
        return result;
    }

    UserFeed showAlbums() throws IOException {
        // build URL for the default user feed of albums
        PicasaUrl url = PicasaUrl.relativeToRoot("feed/api/user/default");
        // execute GData request for the feed
        feed = client.executeGetUserFeed(url);
        System.out.println("User: " + feed.author.name);
        System.out.println("Total number of albums: " + feed.totalResults);
        // show albums
        if (feed.albums != null) {
            for (AlbumEntry album : feed.albums) {
                showAlbum(album);
            }
        }
        return feed;
    }

    private void showAlbum(AlbumEntry album) throws IOException {
        System.out.println();
        System.out.println("-----------------------------------------------");
        System.out.println("Album title: " + album.title);
        System.out.println("Updated: " + album.updated);
        System.out.println("Album ETag: " + album.etag);
        if (album.summary != null) {
            System.out.println("Description: " + album.summary);
        }
        if (album.numPhotos != 0) {
            System.out.println("Total number of photos: " + album.numPhotos);
            PicasaUrl url = new PicasaUrl(album.getFeedLink());
            AlbumFeed feed = client.executeGetAlbumFeed(url);
            for (PhotoEntry photo : feed.photos) {
                System.out.println();
                System.out.println("Photo title: " + photo.title);
                if (photo.summary != null) {
                    System.out.println("Photo description: " + photo.summary);
                }
                System.out.println("editLink: " + photo.getEditLink());
                System.out.println("feedLink: " + photo.getFeedLink());
                System.out.println("Image MIME type: " + photo.mediaGroup.content.type);
                System.out.println("Image URL: " + photo.mediaGroup.content.url);
            }
        }
    }

    private void chooseAccount() {
        startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
        case REQUEST_GOOGLE_PLAY_SERVICES:
            if (resultCode == Activity.RESULT_OK) {
                haveGooglePlayServices();
            } else {
                checkGooglePlayServicesAvailable();
            }
            break;
        case REQUEST_AUTHORIZATION:
            if (resultCode == Activity.RESULT_OK) {
                AsyncLoadTasks.run(this);
            } else {
                chooseAccount();
            }
            break;
        case REQUEST_ACCOUNT_PICKER:
            if (resultCode == Activity.RESULT_OK && data != null && data.getExtras() != null) {
                String accountName = data.getExtras().getString(AccountManager.KEY_ACCOUNT_NAME);
                if (accountName != null) {
                    credential.setSelectedAccountName(accountName);
                    SharedPreferences settings = getPreferences(Context.MODE_PRIVATE);
                    SharedPreferences.Editor editor = settings.edit();
                    editor.putString(PREF_ACCOUNT_NAME, accountName);
                    editor.commit();
                    AsyncLoadTasks.run(this);
                }
            } else if (resultCode == Activity.RESULT_CANCELED) {
                finish();
            }
            break;
        case REQUEST_PICKED_FROM_GALLERY:
            Uri uri = data.getData();
            Log.d(TAG, "url=" + uri);
            AsyncUploader.run(this, uri);
            break;
        case REQUEST_PICKED_FROM_CAMERA:
            if (data != null) {
                Log.e("Intent value:", data.toString());
                imgFileUri = data.getData();
            }

            Log.d(TAG, "url=" + imgFileUri);
            AsyncUploader.run(this, imgFileUri);
            break;

        }
    }

    void uploadPhoto(Uri uri) {
        try {
            AlbumEntry album = postAlbum(feed);
            //PhotoEntry photo = postPhoto(album, uri);
            PhotoEntry photo = postPhotoWithMetaData(album, uri);
            String feedLink = photo.getFeedLink();
            addTagToPhoto(feedLink, "foo");
            Log.i(TAG, feedLink + " was uploaded.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    void showGooglePlayServicesAvailabilityErrorDialog(final int connectionStatusCode) {
        runOnUiThread(new Runnable() {
            public void run() {
                Dialog dialog = GooglePlayServicesUtil.getErrorDialog(connectionStatusCode,
                        PicasaUploadActivity.this, REQUEST_GOOGLE_PLAY_SERVICES);
                dialog.show();
            }
        });
    }

    /** Check that Google Play services APK is installed and up to date. */
    private boolean checkGooglePlayServicesAvailable() {
        final int connectionStatusCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
        if (GooglePlayServicesUtil.isUserRecoverableError(connectionStatusCode)) {
            showGooglePlayServicesAvailabilityErrorDialog(connectionStatusCode);
            return false;
        }
        return true;
    }

    private void haveGooglePlayServices() {
        // check if there is already an account selected
        if (credential.getSelectedAccountName() == null) {
            // ask user to choose account
            chooseAccount();
        } else {
            // load calendars
            AsyncLoadTasks.run(this);
        }
    }

    public void openCamera(View v) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        imgFileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image
        Log.d(TAG, "openCamera with url=" + imgFileUri);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imgFileUri); // set the image file name

        // start the image capture Intent
        startActivityForResult(intent, REQUEST_PICKED_FROM_CAMERA);
    }

    public void showGallery(View v) {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("image/*");
        startActivityForResult(intent, REQUEST_PICKED_FROM_GALLERY);
    }

    public static final int MEDIA_TYPE_IMAGE = 1;
    public static final int MEDIA_TYPE_VIDEO = 2;

    /** Create a file Uri for saving an image or video */
    private static Uri getOutputMediaFileUri(int type) {
        return Uri.fromFile(getOutputMediaFile(type));
    }

    /** Create a File for saving an image or video */
    private static File getOutputMediaFile(int type) {
        // To be safe, you should check that the SDCard is mounted
        // using Environment.getExternalStorageState() before doing this.

        File mediaStorageDir = new File(
                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyCameraApp");
        // This location works best if you want the created images to be shared
        // between applications and persist after your app has been uninstalled.

        // Create the storage directory if it does not exist
        if (!mediaStorageDir.exists()) {
            if (!mediaStorageDir.mkdirs()) {
                Log.d("MyCameraApp", "failed to create directory");
                return null;
            }
        }

        // Create a media file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        File mediaFile;
        if (type == MEDIA_TYPE_IMAGE) {
            mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
        } else if (type == MEDIA_TYPE_VIDEO) {
            mediaFile = new File(mediaStorageDir.getPath() + File.separator + "VID_" + timeStamp + ".mp4");
        } else {
            return null;
        }

        return mediaFile;
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        if (imgFileUri != null) {
            outState.putString("cameraImageUri", imgFileUri.toString());
        }
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        if (savedInstanceState.containsKey("cameraImageUri")) {
            imgFileUri = Uri.parse(savedInstanceState.getString("cameraImageUri"));
        }
    }
}