package com.electronapps.LJPro;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore.Images;
import android.util.Log;
import android.widget.ArrayAdapter;
import com.google.api.client.googleapis.GoogleHeaders;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpResponse;
import com.google.api.client.http.HttpResponseException;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.InputStreamContent;
import com.google.api.client.http.apache.ApacheHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.http.json.JsonHttpParser;
import com.google.api.client.sample.picasa.model.PicasaUrl;
import com.google.api.client.sample.picasa.model.Util;
import com.google.api.client.xml.atom.AtomParser;
public class PicasaAPI {
private static final String AUTH_TOKEN_TYPE = "lh2";
private static final String TAG = "PicasaAndroidSample";
private static final int MENU_ADD = 0;
private static final int MENU_ACCOUNTS = 1;
private static final int CONTEXT_EDIT = 0;
private static final int CONTEXT_DELETE = 1;
private static final int CONTEXT_LOGGING = 2;
private static final int REQUEST_AUTHENTICATE = 0;
private static final String PREF = "MyPrefs";
private static ApacheHttpTransport transport;
private String authToken;
private String postLink;
private Context mContext;
private String mAccountName=null;
private TokenCallback mCallback;
private String mJournalName;
public interface TokenCallback{
public void onHaveToken(String accountname,String token);
}
public PicasaAPI(Context c,String journalname,String accountName,TokenCallback callback) {
mContext=c;
mAccountName=accountName;
mJournalName=journalname;
mCallback=callback;
transport =new ApacheHttpTransport();
transport.defaultHeaders=new GoogleHeaders();
GoogleHeaders headers =(GoogleHeaders) transport.defaultHeaders;
headers.setApplicationName("Google-PicasaAndroidAample/1.0");
headers.gdataVersion = "2";
JsonHttpParser parser = new JsonHttpParser();
//parser.namespaceDictionary = Util.NAMESPACE_DICTIONARY;
transport.addParser(parser);
}
public void authorizeAccount() {
gotAccount(false);
}
public void gotAccount(boolean tokenExpired) {
if (mAccountName != null) {
AccountManager manager = AccountManager.get(mContext);
Account[] accounts = manager.getAccountsByType("com.google");
int size = accounts.length;
for (int i = 0; i < size; i++) {
Account account = accounts[i];
if (mAccountName.equals(account.name)) {
if (tokenExpired) {
manager.invalidateAuthToken("com.google", this.authToken);
}
gotAccount(manager, account);
return;
}
}
}
showAccountDialog();
}
public void showAccountDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setTitle("Select a Google account");
final AccountManager manager = AccountManager.get(mContext);
final Account[] accounts = manager.getAccountsByType("com.google");
final int size = accounts.length;
String[] names = new String[size];
for (int i = 0; i < size; i++) {
names[i] = accounts[i].name;
}
builder.setItems(names, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
mAccountName=accounts[which].name;
gotAccount(manager, accounts[which]);
}
});
builder.create().show();
}
private void gotAccount(final AccountManager manager, final Account account) {
/* SharedPreferences settings = mContext.getSharedPreferences(PREF, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString("accountName", account.name);
editor.commit();*/
new Thread() {
@Override
public void run() {
try {
final LJDB db=LJDB.getDB(mContext);
db.open();
final Bundle bundle =
manager.getAuthToken(account, AUTH_TOKEN_TYPE, true, null, null)
.getResult();
((Activity)mContext).runOnUiThread(new Runnable() {
public void run() {
try {
if (bundle.containsKey(AccountManager.KEY_INTENT)) {
Intent intent =
bundle.getParcelable(AccountManager.KEY_INTENT);
int flags = intent.getFlags();
flags &= ~Intent.FLAG_ACTIVITY_NEW_TASK;
intent.setFlags(flags);
((Activity)mContext).startActivityForResult(intent, REQUEST_AUTHENTICATE);
} else if (bundle.containsKey(AccountManager.KEY_AUTHTOKEN)) {
ContentValues photoAccount=new ContentValues();
photoAccount.put("accountname", mJournalName);
photoAccount.put("photo_account",account.name);
photoAccount.put("auth_token", bundle.getString(AccountManager.KEY_AUTHTOKEN));
photoAccount.put("provider", "Picasa");
Boolean success=db.insertPhotoAccount(photoAccount);
if (success){
mCallback.onHaveToken(account.name,bundle.getString(AccountManager.KEY_AUTHTOKEN));
}
}
} catch (Exception e) {
handleException(e);
}
}
});
} catch (Exception e) {
handleException(e);
}
}
}.start();
}
static SendData sendData;
public HashMap<String,String> doUpload(SendData d,String authToken) {
this.authToken = authToken;
HashMap<String,String> photodata=new HashMap<String,String>();
sendData=d;
((GoogleHeaders) transport.defaultHeaders).setGoogleLogin(authToken);
if (sendData != null) {
try {
if (sendData.fileName != null) {
boolean success = false;
try {
HttpRequest request = transport.buildPostRequest();
request.url = PicasaUrl.relativeToRoot(
"feed/api/user/default/albumid/default/");
((GoogleHeaders) request.headers).setSlugFromFileName(sendData.title);
FileContentMonitored content=new FileContentMonitored(mContext,sendData.data,sendData.title,sendData.contentType);
request.content = content;
HttpResponse response=request.execute();
String resp=response.parseAsString();
String src=null;
String link=null;
try {
JSONObject entry=new JSONObject(resp).getJSONObject("entry");
src=entry.getJSONObject("content").getString("src");
JSONArray links=entry.getJSONArray("link");
int numLinks=links.length();
for (int i=0;i<numLinks;i++){
JSONObject linkObj=links.getJSONObject(i);
if (linkObj.getString("rel").contains("canonical")){
link=linkObj.getString("href");
break;
}
}
photodata.put("link", link);
photodata.put("source", src);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
success = true;
} catch (IOException e) {
handleException(e);
}
}
} finally {
sendData = null;
}
}
return photodata;
}
static class SendData {
String fileName;
File data;
String title;
String contentType;
long contentLength;
SendData(String filepath,String type,String title) {
this.data=new File(filepath);
this.fileName = data.getName();
String c=null;
this.title=title;
this.contentType = type;
this.contentLength =data.length();
}
}
private void handleException(Exception e) {
e.printStackTrace();
SharedPreferences settings = mContext.getSharedPreferences(PREF, 0);
boolean log = settings.getBoolean("logging", false);
if (e instanceof HttpResponseException) {
HttpResponse response = ((HttpResponseException) e).response;
int statusCode = response.statusCode;
try {
response.ignore();
} catch (IOException e1) {
e1.printStackTrace();
}
if (statusCode == 401 || statusCode == 403) {
gotAccount(true);
return;
}
if (log) {
try {
Log.e(TAG, response.parseAsString());
} catch (IOException parseException) {
parseException.printStackTrace();
}
}
}
if (log) {
Log.e(TAG, e.getMessage(), e);
}
}
}