package com.buddycloud;
import java.io.File;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.buddycloud.fragments.GenericChannelsFragment;
import com.buddycloud.fragments.SearchChannelsFragment;
import com.buddycloud.log.Logger;
import com.buddycloud.model.MediaModel;
import com.buddycloud.model.MediaModelCallback;
import com.buddycloud.model.ModelCallback;
import com.buddycloud.model.PostsModel;
import com.buddycloud.model.SubscribedChannelsModel;
import com.buddycloud.utils.ActionbarUtil;
import com.buddycloud.utils.FileUtils;
import com.buddycloud.utils.ImageHelper;
import com.buddycloud.utils.InputUtils;
import com.buddycloud.utils.NetworkUtil;
import com.buddycloud.utils.TextUtils;
import com.kbeanie.imagechooser.api.ChooserType;
import com.kbeanie.imagechooser.api.ChosenImage;
import com.kbeanie.imagechooser.api.ChosenVideo;
import com.kbeanie.imagechooser.api.MediaChooserListener;
import com.kbeanie.imagechooser.api.MediaChooserManager;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
/**
* This class used to show the post activity controller that
* allow the user to attach media and post content.
*
* @author Adnan Urooj (Deminem)
*
*/
public class PostNewTopicActivity extends SherlockActivity
implements MediaChooserListener {
private static final String TAG = PostNewTopicActivity.class.getName();
public static final int REQUEST_CODE = 109;
public static final int NEW_POST_CREATED_RESULT = 209;
private static final String MEDIA_THUMBNAIL_DIR = "media_thumbnail";
private TextView mPostContentTxtCounter;
private MediaChooserManager mChooserManager;
private ProgressDialog mProgressDialog;
private String attachedMediaChannel;
private String attachedMediaId;
private boolean isAttachMediaInProgress;
private boolean isShareIntent;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_post_new_topic);
ActionbarUtil.showActionBarwithBack(this, getString(R.string.post_new_topic_title));
// Post Content
final EditText postContentTxt = (EditText)findViewById(R.id.postTxt);
postContentTxt.addTextChangedListener(mNewPostTextWatcher);
postContentTxt.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
final String postTxt = postContentTxt.getText().toString();
final TextView channelJidTxt = (TextView)findViewById(R.id.channelJidTxt);
createPost(channelJidTxt.getText().toString(), postTxt);
}
return false;
}
});
mPostContentTxtCounter = (TextView)findViewById(R.id.postCounterTxt);
// media selection
ImageView mediaSelectionIcon = (ImageView)findViewById(R.id.mediaSelection);
mediaSelectionIcon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mediaSelection();
}
});
// share intent
final Intent intent = getIntent();
if (intent != null && intent.getAction() != null) {
if (intent.getAction().equals(Intent.ACTION_SEND)) {
isShareIntent = true;
final String mediaType = intent.getType();
if (mediaType.contains("image/")
|| mediaType.contains("video/")) {
Uri mediaUri = (Uri) getIntent().getExtras().get(Intent.EXTRA_STREAM);
showAttachment(mediaUri, mediaUri);
} else if (mediaType.contains("text/")) {
String sharedText = getIntent().getStringExtra(Intent.EXTRA_TEXT);
postContentTxt.setText(sharedText);
}
}
}
final String channelJid = getChannelJid();
TextView postChannelJidTxt = (TextView)findViewById(R.id.channelJidTxt);
postChannelJidTxt.setText(channelJid);
if (isShareIntent) {
postChannelJidTxt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
channelSelection();
}
});
}
// channel JID selection arrow
ImageView postChannelJidArrowIcon = (ImageView)findViewById(R.id.bcArrowRight);
if (isShareIntent) {
postChannelJidArrowIcon.setVisibility(View.VISIBLE);
postChannelJidArrowIcon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
channelSelection();
}
});
}
// Progress dialog
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage(getString(R.string.message_post_creation));
mProgressDialog.setCancelable(false);
}
@Override
protected void onResume() {
super.onResume();
ImageLoader.getInstance().resume();
}
@Override
protected void onStop() {
super.onStop();
ImageLoader.getInstance().stop();
// clean up media thumbnail selection
cleanUpMediaSelection();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.post_screen_options, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
final EditText postContent = (EditText)findViewById(R.id.postTxt);
final TextView channelJid = (TextView)findViewById(R.id.channelJidTxt);
switch (item.getItemId()) {
case android.R.id.home:
InputUtils.hideKeyboard(PostNewTopicActivity.this);
finish();
return true;
case R.id.menu_post_send:
createPost(channelJid.getText().toString(), postContent.getText().toString());
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK
&& requestCode == ChooserType.REQUEST_PICK_PICTURE_OR_VIDEO) {
mChooserManager.submit(requestCode, data);
}
else if (requestCode == SearchActivity.REQUEST_CODE) {
if (data != null) {
final TextView channelJidTxt = (TextView)findViewById(R.id.channelJidTxt);
final String channelJid = data.getStringExtra(GenericChannelsFragment.CHANNEL);
channelJidTxt.setText(channelJid);
}
}
super.onActivityResult(requestCode, resultCode, data);
}
/**
* Create new topic post
*
* @param channelJid
* @param postContent
*/
private void createPost(final String channelJid, final String postContent) {
if (!NetworkUtil.isNetworkAvailable()) {
Toast.makeText(PostNewTopicActivity.this,
getString(R.string.message_no_network_connection),
Toast.LENGTH_LONG).show();
}
if (isAttachMediaInProgress) {
Toast.makeText(PostNewTopicActivity.this,
getString(R.string.message_post_topic_attachment_in_progress),
Toast.LENGTH_LONG).show();
return ;
}
if (TextUtils.isEmpty(channelJid)) {
Toast.makeText(PostNewTopicActivity.this,
getString(R.string.message_post_topic_channelJid_mandatory),
Toast.LENGTH_LONG).show();
return ;
}
if (TextUtils.isEmpty(postContent)) {
Toast.makeText(PostNewTopicActivity.this,
getString(R.string.message_post_topic_mandatory),
Toast.LENGTH_LONG).show();
return ;
}
mProgressDialog.show();
JSONObject post = createJSONPost(postContent);
PostsModel.getInstance().save(PostNewTopicActivity.this, post,
new ModelCallback<JSONObject>() {
@Override
public void success(JSONObject response) {
setResult(NEW_POST_CREATED_RESULT);
finish();
Toast.makeText(getApplicationContext(),
getString(R.string.message_post_created),
Toast.LENGTH_LONG).show();
mProgressDialog.dismiss();
}
@Override
public void error(Throwable throwable) {
mProgressDialog.dismiss();
Toast.makeText(PostNewTopicActivity.this,
getString(R.string.message_post_creation_failed),
Toast.LENGTH_LONG).show();
}
}, channelJid);
}
private JSONObject createJSONPost(final String postContent) {
JSONObject post = new JSONObject();
try {
// post content info
post.putOpt("content", postContent);
// attach media info
if (getAttachedMediaChannel() != null
&& getAttachedMediaId() != null) {
JSONArray mediaArray = new JSONArray();
JSONObject mediaObject = new JSONObject();
mediaObject.putOpt("id", getAttachedMediaId());
mediaObject.putOpt("channel", getAttachedMediaChannel());
mediaArray.put(mediaObject);
post.putOpt("media", mediaArray);
}
} catch (JSONException e) {
Logger.error(TAG, "createJSONPost error: ", e);
}
return post;
}
private String getAttachedMediaChannel() {
return attachedMediaChannel;
}
private void setAttachedMediaChannel(String attachedMediaChannel) {
this.attachedMediaChannel = attachedMediaChannel;
}
private String getAttachedMediaId() {
return attachedMediaId;
}
private void setAttachedMediaId(String attachedMediaId) {
this.attachedMediaId = attachedMediaId;
}
private String getChannelJid() {
return (getIntent() != null) ? getIntent().getStringExtra(GenericChannelsFragment.CHANNEL) : "";
}
private View getThumbnailMediaView(int viewResc) {
return (View)findViewById(viewResc);
}
private void channelSelection() {
Intent searchActivityIntent = new Intent();
searchActivityIntent.setClass(PostNewTopicActivity.this, SearchActivity.class);
searchActivityIntent.putExtra(SearchChannelsFragment.AFFILIATIONS, new String[] {
SubscribedChannelsModel.ROLE_OWNER,
SubscribedChannelsModel.ROLE_MODERATOR,
SubscribedChannelsModel.ROLE_PUBLISHER});
startActivityForResult(searchActivityIntent, SearchActivity.REQUEST_CODE);
}
private void mediaSelection() {
mChooserManager = new MediaChooserManager(this,
ChooserType.REQUEST_PICK_PICTURE_OR_VIDEO, MEDIA_THUMBNAIL_DIR, true);
mChooserManager.setMediaChooserListener(this);
try {
String path = mChooserManager.choose();
// clean up media thumbnail selection
cleanUpMediaSelection();
} catch (Exception e) {
Logger.error(TAG, "Exception: ", e);
}
}
private void showAttachment(final Uri originalFilePath,
final Uri thumbnailFilePath) {
if (TextUtils.isEmpty(originalFilePath.toString())
|| TextUtils.isEmpty(thumbnailFilePath.toString())) {
return;
}
runOnUiThread(new Runnable() {
public void run() {
final View thumbnailAttachmentPanel = getThumbnailMediaView(R.id.thumbnailAttachmentPanel);
final TextView channelJid = (TextView)findViewById(R.id.channelJidTxt);
thumbnailAttachmentPanel.setVisibility(View.VISIBLE);
ImageView cancelBtn = (ImageView)getThumbnailMediaView(R.id.closeBtn);
ImageView mediaImage = (ImageView)getThumbnailMediaView(R.id.thumbnailMediaImage);
// display selected media image preview
DisplayImageOptions dio = new DisplayImageOptions.Builder()
.cloneFrom(ImageHelper.defaultImageOptions())
.build();
ImageLoader.getInstance().displayImage(thumbnailFilePath.toString(), mediaImage, dio);
// cancel button
cancelBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
removeAttachment();
}
});
// upload the file on server
if (NetworkUtil.isNetworkAvailable()) {
final ProgressBar pb = (ProgressBar)getThumbnailMediaView(R.id.progressBar);
pb.setVisibility(View.VISIBLE);
MediaModel.getInstance().saveWithProgress(getApplicationContext(), null, new MediaModelCallback<JSONObject>() {
@Override
public void success(JSONObject response) {
Toast.makeText(getApplicationContext(),
getString(R.string.message_media_uploaded),
Toast.LENGTH_SHORT).show();
setAttachedMediaChannel(response.optString("entityId"));
setAttachedMediaId(response.optString("id"));
isAttachMediaInProgress = false;
}
@Override
public void error(Throwable throwable) {
Toast.makeText(getApplicationContext(),
getString(R.string.message_media_upload_failed),
Toast.LENGTH_LONG).show();
// reset attachment properties
setAttachedMediaChannel(null);
setAttachedMediaId(null);
isAttachMediaInProgress = false;
}
@Override
public void progress(final long num, final long totalSize) {
runOnUiThread(new Runnable() {
@Override
public void run() {
int progress = (int) ((num / (float) totalSize) * 100);
pb.setProgress(progress);
Logger.info(TAG, "Uploading the media progress (" + progress +
") total of (" + totalSize + ")");
}
});
}
}, originalFilePath.toString(), channelJid.getText().toString());
isAttachMediaInProgress = true;
}
}
});
}
private void removeAttachment() {
// reset attachment properties
setAttachedMediaChannel(null);
setAttachedMediaId(null);
isAttachMediaInProgress = false;
runOnUiThread(new Runnable() {
public void run() {
final View thumbnailAttachmentPanel = getThumbnailMediaView(R.id.thumbnailAttachmentPanel);
final ImageView mediaImage = (ImageView)getThumbnailMediaView(R.id.thumbnailMediaImage);
mediaImage.setImageBitmap(null);
thumbnailAttachmentPanel.setVisibility(View.GONE);
}
});
// clean up media thumbnail selection
cleanUpMediaSelection();
}
private void cleanUpMediaSelection() {
FileUtils.removeAllFiles(MEDIA_THUMBNAIL_DIR);
}
private final TextWatcher mNewPostTextWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
if (mPostContentTxtCounter != null) {
mPostContentTxtCounter.setText(String.valueOf(s.length()));
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
};
/* ######################################
* ### Image Chooser Delegate Methods ###
* ######################################
*/
/**
* Selected image object
*
* @param image
*/
@Override
public void onImageChosen(ChosenImage image) {
if (image == null) return;
Uri originalFilePathUri = Uri.fromFile(new File(image.getFilePathOriginal()));
Uri thumbnailUri = Uri.fromFile(new File(image.getFilePathOriginal()));
showAttachment(originalFilePathUri, thumbnailUri);
}
/**
* Selected video object
*
* @param video
*/
@Override
public void onVideoChosen(ChosenVideo video) {
if (video == null) return;
Uri originalFilePathUri = Uri.fromFile(new File(video.getVideoFilePath()));
Uri thumbnailUri = Uri.fromFile(new File(video.getVideoPreviewImage()));
showAttachment(originalFilePathUri, thumbnailUri);
}
/**
* If the error occurred during the media selection
*
* @param error
*/
@Override
public void onError(String error) {
removeAttachment();
}
}