package com.rec.photoeditor.share; import java.util.Observable; import java.util.Observer; import android.accounts.Account; import android.accounts.AccountManager; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.os.AsyncTask; import android.util.Log; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.EditText; import android.widget.Toast; import com.rec.photoeditor.Platform; import com.rec.photoeditor.R; import com.rec.photoeditor.twitter.TwitterApp; public class ShareDialog extends Dialog implements android.view.View.OnClickListener, OnCheckedChangeListener { private static final String TAG = "Photo Editor"; private Button facebookButton; private Button twitterButton; private Button picasaButton; private Button postButton; private CheckBox facebookCB; private CheckBox twitterCB; private CheckBox picasaCB; private EditText message; private Context context; private Activity parentActivity; private TwitterApp twitterApp; private String pathToImage; private PicasaShare picasaShare; private TwitterShare twitterShare; private FacebookShare facebookShare; private ShareComponentChangeHandler shareComponentChangeHandler; public ShareDialog(Context _context, Activity _parentActivity, String _pathToImage) { super(_context); context = _context; pathToImage = _pathToImage; parentActivity = _parentActivity; shareComponentChangeHandler = new ShareComponentChangeHandler(); initComponents(); initSocialMedia(); } private void initComponents() { setContentView(R.layout.share_dialog); setTitle("Share Photo"); // Dialog class set layout as wrap_content automatically, so i need to // correct it this.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); facebookButton = (Button) findViewById(R.id.facebook_log_in); facebookButton.setOnClickListener(this); twitterButton = (Button) findViewById(R.id.twitter_log_in); twitterButton.setOnClickListener(this); picasaButton = (Button) findViewById(R.id.gplus_log_in); picasaButton.setOnClickListener(this); postButton = (Button) findViewById(R.id.post_button); postButton.setOnClickListener(this); facebookCB = (CheckBox) findViewById(R.id.facebook_check_box); facebookCB.setOnCheckedChangeListener(this); twitterCB = (CheckBox) findViewById(R.id.twitter_check_box); twitterCB.setOnCheckedChangeListener(this); picasaCB = (CheckBox) findViewById(R.id.gplus_check_box); picasaCB.setOnCheckedChangeListener(this); message = (EditText) findViewById(R.id.description_edit_text); } private void initSocialMedia() { initFacebook(shareComponentChangeHandler); initPicasa(shareComponentChangeHandler); initTwitter(shareComponentChangeHandler); } private void initTwitter(ShareComponentChangeHandler changeHandler) { twitterShare = new TwitterShare(context, changeHandler); twitterApp = twitterShare.getTwitterApp(); twitterApp.setListener(twitterShare.mTwLoginDialogListener); validateTwitterSession(); } private void initPicasa(ShareComponentChangeHandler changeHandler) { picasaShare = new PicasaShare(context, changeHandler); validateGoogleSession(); } private void initFacebook(ShareComponentChangeHandler changeHandler) { facebookShare = new FacebookShare(context, changeHandler); facebookShare.setParentActivity(parentActivity); validateFacebookSession(); } private void validateTwitterSession() { if (twitterApp.hasAccessToken()) { twitterCB.setChecked(true); String username = twitterApp.getUsername(); username = (username.equals("")) ? getContext().getString( R.string.unknown) : username; twitterCB.setText(username); twitterButton.setText(getContext().getString(R.string.log_out)); } } private void validateGoogleSession() { AccountManager manager = AccountManager.get(context); final Account[] accounts = manager.getAccountsByType("com.google"); final int size = accounts.length; if (size > 0) { picasaShare.gotAccount(manager, accounts[0]); picasaShare.setGoogleUsername(accounts[0].name); picasaCB.setChecked(true); picasaCB.setText(accounts[0].name); picasaButton.setText(getContext() .getString(R.string.change_account)); } } private void validateFacebookSession() { facebookShare.initFacebookSession(); if (Platform.facebook.isSessionValid()) { facebookCB.setChecked(true); facebookCB.setText(facebookShare.getFacebookUserName()); facebookButton.setText(getContext().getString(R.string.log_out)); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.facebook_log_in: onFacebookButtonClick(); break; case R.id.twitter_log_in: onTwitterButtonClick(); break; case R.id.gplus_log_in: onPicasaButtonClick(); break; case R.id.post_button: onPostButtonClick(); break; default: break; } } @Override public void onCheckedChanged(CompoundButton buttonChanged, boolean state) { switch (buttonChanged.getId()) { case R.id.facebook_check_box: handleFacbookCheckChanged(state); break; case R.id.twitter_check_box: handleTwitterCheckChanged(state); break; case R.id.gplus_check_box: handlePicasaCheckChanged(state); break; default: break; } } private void handlePicasaCheckChanged(boolean state) { if (state && (picasaShare.getGoogleUsername() == null || "" .equals(picasaShare.getGoogleUsername()))) { Toast.makeText( context, getContext().getString( R.string.please_choose_to_google_account_first), Toast.LENGTH_LONG).show(); picasaCB.setChecked(false); } } private void handleTwitterCheckChanged(boolean state) { if (state && !twitterApp.hasAccessToken()) { Toast.makeText( context, getContext().getString( R.string.please_login_to_twitter_first), Toast.LENGTH_LONG).show(); twitterCB.setChecked(false); } } private void handleFacbookCheckChanged(boolean state) { if (state && !Platform.facebook.isSessionValid()) { Toast.makeText( context, getContext().getString( R.string.please_login_to_facebook_first), Toast.LENGTH_LONG).show(); facebookCB.setChecked(false); } } private void onFacebookButtonClick() { handleFacebookButtonClick(); } private void handleFacebookButtonClick() { if (Platform.facebook.isSessionValid()) { facebookShare.facebookLogOut(); facebookCB.setChecked(false); facebookCB.setText(getContext().getString(R.string.facebook)); facebookButton.setText(getContext().getString(R.string.log_in)); } else { facebookShare.facebookLogIn(); Platform.facebook.authorize(parentActivity, Platform.facebookPermissions, FacebookShare.AUTHORIZE_FACEBOOK, facebookShare.new FacebookLoginDialogListener()); } } private void onTwitterButtonClick() { handleOnTwitterButtonClick(); } private void onPicasaButtonClick() { createChooseGmailAccountDialog().show(); } private void handleOnTwitterButtonClick() { if (twitterApp.hasAccessToken()) { twitterApp.resetAccessToken(context); twitterCB.setChecked(false); twitterCB.setText(getContext().getString(R.string.twitter)); twitterButton.setText(getContext().getString(R.string.log_in)); } else { twitterApp.authorize(); } } private Dialog createChooseGmailAccountDialog() { // context.showDialog(0); AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(getContext().getString( R.string.select_a_google_account)); final AccountManager manager = AccountManager.get(context); 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) { picasaShare.gotAccount(manager, accounts[which]); picasaCB.setChecked(true); picasaCB.setText(accounts[which].name); } }); return builder.create(); } private void onPostButtonClick() { ShareHandler sh = new ShareHandler(); sh.execute(new String[0]); } private void handlePostButtonClick() { Thread picassaThread = new Thread(new Runnable() { public void run() { if (picasaCB.isChecked()) { picasaShare.setFinished(false); picasaShare.uploadImage(pathToImage, message.getText() .toString()); } } }); picassaThread.start(); Thread facebookThread = new Thread(new Runnable() { public void run() { if (facebookCB.isChecked()) { facebookShare.setFinished(false); facebookShare.postPhotoOnFacebook(pathToImage, message .getText().toString()); } } }); facebookThread.start(); Thread twitterThread = new Thread(new Runnable() { public void run() { if (twitterCB.isChecked()) { twitterShare.setFinished(false); twitterShare.uploadImage(pathToImage, message.getText() .toString()); } } }); twitterThread.start(); try { picassaThread.join(60000); facebookThread.join(30000); twitterThread.join(30000); } catch (InterruptedException e1) { Log.i(TAG, "problem with sending image" + e1.getLocalizedMessage()); e1.printStackTrace(); } Log.i(TAG, "facebookShare.isFinished()" + facebookShare.isFinished()); Log.i(TAG, "twitterShare.isFinished()" + twitterShare.isFinished()); Log.i(TAG, "picasaShare.isFinished()" + picasaShare.isFinished()); } private class ShareHandler extends AsyncTask<String, String, String> { ProgressDialog progressDialog; public ShareHandler() { progressDialog = new ProgressDialog(context); } protected void onPreExecute() { progressDialog.setMessage(getContext().getString( R.string.please_wait_picture_is_uploading)); progressDialog.setCancelable(false); progressDialog.show(); } protected String doInBackground(String... strings) { handlePostButtonClick(); return ""; } protected void onPostExecute(String result) { progressDialog.cancel(); StringBuilder messageText = new StringBuilder(); boolean status = true; if (facebookShare.isSuccess() && facebookCB.isChecked()) { messageText.append(getContext().getString( R.string._message_to_facebook_send_succesfully)); } else if (!facebookShare.isSuccess() && facebookCB.isChecked()) { messageText.append(getContext().getString( R.string._sending_message_to_twitter_failed_)); status = false; } if (picasaShare.isSuccess() && picasaCB.isChecked()) { messageText.append(getContext().getString( R.string._message_to_picasa_send_succesfully)); } else if (!picasaShare.isSuccess() && picasaCB.isChecked()) { messageText.append(getContext().getString( R.string._sending_message_to_picasa_failed_)); status = false; } if (twitterShare.isSuccess() && twitterCB.isChecked()) { messageText.append(getContext().getString( R.string._message_to_twitter_send_succesfully)); } else if (!twitterShare.isSuccess() && twitterCB.isChecked()) { messageText.append(getContext().getString( R.string._sending_message_to_twitter_failed_)); status = false; } AlertDialog.Builder shareStatusDialog = new AlertDialog.Builder( context); if (status) { shareStatusDialog.setMessage(getContext().getString( R.string.photo_uploaded_succesfully)); } else { shareStatusDialog.setMessage(getContext().getString( R.string.photo_upload_failed_see_datails_) + messageText.toString()); } shareStatusDialog.setNeutralButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { ShareDialog.this.cancel(); } }); shareStatusDialog.show(); } } public class ShareComponentChangeHandler implements Observer { public void update(Observable changeCaller, Object data) { if (!(data instanceof ShareMessages)) return; if (changeCaller instanceof FacebookShare) { handleFacebookChanges((ShareMessages) data); } if (changeCaller instanceof PicasaShare) { handlePicasaChanges((ShareMessages) data); } if (changeCaller instanceof TwitterShare) { handleTwitterChanges((ShareMessages) data); } } private void handleFacebookChanges(final ShareMessages message) { switch (message.getMessageCode()) { case ShareMessages.FACEBOOK_LOGIN_COMPLEATE: { parentActivity.runOnUiThread(new Runnable() { public void run() { facebookCB.setText(message.getMessage()); } }); break; } case ShareMessages.FACEBOOK_LOGIN_SUCCESS: { facebookCB.setChecked(true); facebookCB.setText(message.getMessage()); facebookButton .setText(getContext().getString(R.string.log_out)); break; } } } private void handlePicasaChanges(ShareMessages message) { switch (message.getMessageCode()) { case ShareMessages.PICASA_EXCEPTION: { Log.i(TAG, "Problem with picasa " + message.getMessage()); break; } } } private void handleTwitterChanges(ShareMessages message) { switch (message.getMessageCode()) { case ShareMessages.TWITTER_LOGIN_SUCESS: { twitterCB.setChecked(true); twitterCB.setText(message.getMessage()); twitterButton.setText(getContext().getString(R.string.log_out)); break; } case ShareMessages.TWITTER_LOGIN_FAILED: { twitterCB.setChecked(false); break; } } } } }