package com.nonintrusive.client.tabs.askquestion;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.nonintrusive.client.GlobalNonIntrusive;
import com.nonintrusive.client.database.ClientDB;
import com.nonintrusive.client.send.R;
public class AskQuestionActivity extends Activity {
private static final String TAG = "NonIntrusiveClientSend";
protected static final String ENCODING = "UTF-8";
private static final String SERVER_URL = null;
// preferences
private SharedPreferences mPref;
private Editor mEditor;
// client
private String mSimId;
private boolean mIsNewClient = true;
// question
private ArrayList<EditText> mAnswersListView;
private int mAnswersNo = 3;
private String qMessage;
private String[] qAnswers;
private String qTags;
// GUI
private EditText mQuestion;
private EditText mTags;
private Handler mHandler;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ask_question);
initState();
// if is the first time when we open the application
// send ID to the server
if (mIsNewClient) {
new Thread(new Runnable() {
@Override
public void run() {
try {
sendToServer("id="
+ URLEncoder.encode(mSimId, ENCODING));
mEditor.putBoolean("isNew", false);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}).start();
}
loadGui();
}
/**
* Initiates the GUI elements
*/
private void loadGui() {
mQuestion = (EditText) findViewById(R.id.editTextQuestion);
mTags = (EditText) findViewById(R.id.editTextTags);
Button addButton = (Button) findViewById(R.id.buttonAdd);
addButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mAnswersNo > GlobalNonIntrusive.MAX_ANSWERS) {
mHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(
AskQuestionActivity.this,
"You've reached maximum answers per question!",
Toast.LENGTH_SHORT).show();
}
});
return;
}
Context ctx = AskQuestionActivity.this;
TextView labelA = new TextView(ctx);
labelA.setText("A" + mAnswersNo++);
labelA.setLayoutParams(new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
EditText answerText = new EditText(ctx);
answerText.setLayoutParams(new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
mAnswersListView.add(answerText);
LinearLayout layout = new LinearLayout(ctx);
layout.setOrientation(LinearLayout.HORIZONTAL);
layout.addView(labelA);
layout.addView(answerText);
LinearLayout parent = (LinearLayout) findViewById(R.id.answersLayout);
parent.addView(layout, new LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
}
});
Button sendButton = (Button) findViewById(R.id.buttonSend);
sendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String message = buildMessage();
sendToServer(message);
}
});
Button clearButton = (Button) findViewById(R.id.clearForm);
clearButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mQuestion.setText("");
mTags.setText("");
for (EditText answer : mAnswersListView) {
answer.setText("");
}
}
});
}
/**
* Load the initial state
*/
private void initState() {
mPref = PreferenceManager.getDefaultSharedPreferences(this);
TelephonyManager tManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
mIsNewClient = mPref.getBoolean("isNew", true);
mSimId = tManager.getSimSerialNumber();
mEditor = mPref.edit();
mHandler = new Handler();
mAnswersListView = new ArrayList<EditText>();
mAnswersListView.add((EditText) findViewById(R.id.editTextA1));
mAnswersListView.add((EditText) findViewById(R.id.editTextA2));
qAnswers = new String[GlobalNonIntrusive.MAX_ANSWERS];
}
/**
* Builds the message to send to server
*
* @return message for server
*/
private String buildMessage() {
StringBuilder message = new StringBuilder();
final String next = "&";
try {
message.append("id=" + URLEncoder.encode(mSimId, ENCODING) + next);
qMessage = mQuestion.getText().toString();
if (qMessage.equals(""))
return null;
message.append("text=" + URLEncoder.encode(qMessage, ENCODING)
+ next);
int size = mAnswersListView.size();
int k = 0;
for (int i = 0; i < size; i++) {
EditText editText = mAnswersListView.get(i - k);
String textA = editText.getText().toString();
if (textA.equals("")) {
k++;
continue;
}
qAnswers[i - k] = textA;
message.append("answer_" + (i - k) + "="
+ URLEncoder.encode(textA, ENCODING) + next);
}
qTags = "";
String[] tags = mTags.getText().toString().split(" ");
size = tags.length;
for (int i = 0; i < size; i++) {
message.append("tag_" + i + "="
+ URLEncoder.encode(tags[i], ENCODING) + next);
qTags += tags[i] + " ";
}
Log.d(TAG, "message " + message);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
Log.d(TAG, "UnsupportedEncodingException");
return null;
}
return message.toString();
}
/**
* Sends the message to server
*
* @param message
*/
private boolean sendToServer(String message) {
HttpClient client = new DefaultHttpClient();
String params = buildMessage();
if (message == null) {
mHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(AskQuestionActivity.this,
"Message failed to build!", Toast.LENGTH_SHORT)
.show();
}
});
Log.d(TAG, "Message failed to build!");
return false;
}
// TODO: move this down after we have the server
addQuestionToDB();
// TODO: add clear button; save last unsend question
if (SERVER_URL == null) {
mHandler.post(new Runnable() {
@Override
public void run() {
// Toast.makeText(AskQuestionActivity.this,
// "Server address not set", Toast.LENGTH_SHORT)
// .show();
}
});
return false;
}
HttpGet request = new HttpGet(SERVER_URL + "?" + params);
try {
HttpResponse response = client.execute(request);
int status = response.getStatusLine().getStatusCode();
if (status != HttpStatus.SC_OK) {
Log.d(TAG, "HttpStatus not ok (" + status + ")");
return false;
}
} catch (ClientProtocolException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* It should be called only after buildMessage()
*/
private void addQuestionToDB() {
if (qMessage == null || qMessage.equals(""))
return;
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put(ClientDB.MESSAGE, qMessage);
values.put(ClientDB.ANSWER1, qAnswers[0]);
values.put(ClientDB.ANSWER2, qAnswers[1]);
if (qAnswers[2] != null) {
values.put(ClientDB.ANSWER3, qAnswers[2]);
if (qAnswers[3] != null) {
values.put(ClientDB.ANSWER4, qAnswers[3]);
if (qAnswers[4] != null)
values.put(ClientDB.ANSWER5, qAnswers[4]);
}
}
values.put(ClientDB.TAGS, qTags);
values.put(ClientDB.IS_MY_QUESTION, true);
values.put(ClientDB.TIMESTAMP, System.currentTimeMillis());
cr.insert(ClientDB.CONTENT_URI, values);
}
}
|