package com.tuit.ar.activities;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.SeekBar.OnSeekBarChangeListener;
import com.tuit.ar.R;
import com.tuit.ar.api.Twitter;
import com.tuit.ar.api.TwitterAccountRequestsObserver;
import com.tuit.ar.api.TwitterRequest;
import com.tuit.ar.api.request.Options;
public class NewTweet extends Activity implements OnClickListener, TwitterAccountRequestsObserver {
static private final int MENU_ADD_PHOTO = 0;
static private final int MAX_CHARS = 140;
private String replyToTweetId;
private EditText messageField;
private TextView charCount;
private SeekBar imageSize;
private File photo;
private Bitmap bm = null;
private ImageView preview = null;
private int imageWidth = 0;
private int imageHeight = 0;
private float scale = 1.0F;
private TextView imageSizeWidth;
private TextView imageSizeHeight;
private TextView imageSizeMb;
static private final int MAX_PROGRESS = 10000;
private Button send;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.new_tweet);
send = (Button)findViewById(R.id.send);
send.setOnClickListener(this);
Twitter.getInstance().getDefaultAccount().addRequestObserver(this);
Intent intent = getIntent();
replyToTweetId = intent.getStringExtra("reply_to_id");
String replyToUser = intent.getStringExtra("reply_to_username");
if (replyToUser != null) {
TextView username = (TextView)findViewById(R.id.replyToUsername);
username.setText(getString(R.string.inReplyTo).replace("%s", "@" + replyToUser));
}
String defaultMessage = intent.getStringExtra("default_text");
messageField = (EditText) findViewById(R.id.tweetMessage);
charCount = (TextView) findViewById(R.id.charCount);
if (defaultMessage != null) {
messageField.setText(defaultMessage);
charCount.setText(String.valueOf(MAX_CHARS - defaultMessage.length()));
}
messageField.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
updateCharCount();
return false;
}
});
imageSize = (SeekBar) findViewById(R.id.imageSize);
imageSize.setMax(MAX_PROGRESS);
imageSize.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
public void onStopTrackingTouch(SeekBar arg0) {
updateImageSizeKb();
}
public void onStartTrackingTouch(SeekBar arg0) {
}
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
scale = (float)progress / MAX_PROGRESS;
imageSizeWidth.setText(getString(R.string.width) + " " + String.valueOf(Math.round(scale * imageWidth)) + "px");
imageSizeHeight.setText(getString(R.string.height) + " " + String.valueOf(Math.round(scale * imageHeight)) + "px");
imageSizeMb.setText(getString(R.string.loading));
}
});
imageSizeHeight = (TextView) findViewById(R.id.imageSizeHeight);
imageSizeWidth = (TextView) findViewById(R.id.imageSizeWidth);
imageSizeMb = (TextView) findViewById(R.id.imageSizeMb);
preview = (ImageView)findViewById(R.id.preview);
imageSizeMb.setText("");
imageSize.setVisibility(View.INVISIBLE);
imageSizeHeight.setVisibility(View.INVISIBLE);
imageSizeWidth.setVisibility(View.INVISIBLE);
}
protected void updateImageSizeKb() {
imageSizeMb.setText(getString(R.string.loading));
try {
createImage();
imageSizeMb.setText((photo.length() / 1024) + "KB");
} catch (Exception e) {
}
}
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, MENU_ADD_PHOTO, 0, R.string.addPhoto);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_ADD_PHOTO:
{
startActivityForResult(new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI), 0);
break;
}
}
return true;
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try {
if (resultCode == Activity.RESULT_OK) {
bm = MediaStore.Images.Media.getBitmap(getContentResolver(), data.getData());
preview.setImageBitmap(bm);
imageWidth = bm.getWidth();
imageHeight = bm.getHeight();
imageSize.setVisibility(View.VISIBLE);
imageSizeHeight.setVisibility(View.VISIBLE);
imageSizeWidth.setVisibility(View.VISIBLE);
imageSize.setProgress(MAX_PROGRESS);
updateImageSizeKb();
}
} catch (Exception e) {
Toast.makeText(this, getString(R.string.unableToUpload), Toast.LENGTH_LONG).show();
}
}
private void updateCharCount() {
charCount.setText(String.valueOf(MAX_CHARS - messageField.getText().toString().length()));
}
protected void createImage() throws Exception {
FileOutputStream fos;
// FIXME: not using temporary files?
fos = super.openFileOutput("upload.jpg", MODE_WORLD_READABLE);
Bitmap bm;
if (scale < 1.0)
bm = Bitmap.createScaledBitmap(this.bm, Math.round(scale * imageWidth), Math.round(scale * imageHeight), true);
else
bm = this.bm;
bm.compress(CompressFormat.JPEG, 75, fos);
fos.flush();
fos.close();
photo = new File("/data/data/com.tuit.ar/files", "upload.jpg");
}
public void onClick(View v) {
String message = messageField.getText().toString();
try {
if (this.bm != null) {
createImage();
Twitter.getInstance().getDefaultAccount().upload(photo, message);
} else {
ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("status", message));
if (replyToTweetId != null) params.add(new BasicNameValuePair("in_reply_to_status_id", replyToTweetId));
int method = TwitterRequest.METHOD_POST;
Twitter.getInstance().getDefaultAccount().requestUrl(Options.POST_TWEET, params, method);
}
} catch (Exception e) {
sendFailed(e.getLocalizedMessage());
}
}
public void sendFailed(String message) {
if (message == null)
Toast.makeText(this, getString(R.string.unableToPost), Toast.LENGTH_SHORT).show();
else
Toast.makeText(this, getString(R.string.unableToPost) + " (" + message + ")", Toast.LENGTH_SHORT).show();
}
public void requestHasStarted(TwitterRequest request) {
setProgressBarIndeterminateVisibility(true);
}
public void requestHasFinished(TwitterRequest request) {
setProgressBarIndeterminateVisibility(false);
if (request.getUrl().equals(Options.POST_TWEET) || request.getUrl().equals(Options.POST_TWEET_WITH_PHOTO)) {
if (request.getStatusCode() >= 200 && request.getStatusCode() < 400) {
Toast.makeText(this, getString(R.string.messageSent), Toast.LENGTH_SHORT).show();
finish();
try {
Twitter.getInstance().getDefaultAccount().requestUrl(Options.FRIENDS_TIMELINE);
} catch (Exception e) {}
}
else sendFailed(request.getErrorMessage());
}
}
public void onDestroy() {
super.onDestroy();
Twitter.getInstance().getDefaultAccount().removeRequestObserver(this);
send.setOnClickListener(null);
messageField.setOnKeyListener(null);
imageSize.setOnSeekBarChangeListener(null);
if (photo != null) photo.delete();
}
}