package ca.ualberta.cs.cmput301f14t14.questionapp;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.UUID;
import ca.ualberta.cs.cmput301f14t14.questionapp.data.Callback;
import ca.ualberta.cs.cmput301f14t14.questionapp.data.ClientData;
import ca.ualberta.cs.cmput301f14t14.questionapp.data.DataManager;
import ca.ualberta.cs.cmput301f14t14.questionapp.model.Image;
import ca.ualberta.cs.cmput301f14t14.questionapp.model.Question;
import ca.ualberta.cs.cmput301f14t14.questionapp.view.AddImage;
import ca.ualberta.cs.cmput301f14t14.questionapp.view.AddQuestionDialogFragment;
import ca.ualberta.cs.cmput301f14t14.questionapp.view.QuestionListAdapter;
import ca.ualberta.cs.cmput301f14t14.questionapp.view.SearchQueryDialogFragment;
import android.app.ActionBar;
import android.app.ActionBar.OnNavigationListener;
import android.app.Activity;
import android.app.FragmentManager;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import android.content.Context;
public class MainActivity extends Activity {
private DataManager dataManager;
private QuestionListAdapter qla = null;
private List<Question> qList = null;
private ClientData cd = null;
private Callback<List<Question>> listCallback = null;
private Callback<Question> favouriteQuestionCallback = null;
private Callback<Question> readLaterQuestionCallback = null;
private AddImage AI = new AddImage();
private static final int CAMERA = 1;
private static final int ADD_IMAGE = 2;
public Image img;
private long MAX_SIZE = 64000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Instantiate Client Data for username stuff
cd = new ClientData(this);
//Create a spinner adapter for sorting choices
ArrayAdapter<CharSequence> sortAdapter =
ArrayAdapter.createFromResource(
getActionBar().getThemedContext(),
R.array.sort_spinner_data,
android.R.layout.simple_spinner_item
);
// Specify the layout to use when the list of choices appears
sortAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
getActionBar().setListNavigationCallbacks(sortAdapter, changeSort());
dataManager = DataManager.getInstance(this);
// if first time logging in, prompt user to set username
if(cd.getUsername() == null){
Intent intent = new Intent(this.getBaseContext(), WelcomeScreenActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
qList = new ArrayList<Question>();
qla = new QuestionListAdapter(this, R.layout.list_question, qList);
ListView questionView = (ListView) findViewById(R.id.question_list);
questionView.setAdapter(qla);
questionView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// run off to the question view if you tap an item
final Question question = qla.getItem(position);
UUID qId = question.getId();
Intent intent = new Intent(getApplicationContext(), QuestionActivity.class);
intent.putExtra("QUESTION_UUID", qId.toString());
startActivity(intent);
}
});
listCallback = new Callback<List<Question>>() {
@Override
public void run(List<Question> list) {
qList.clear();
if (list != null) {
qList.addAll(list);
}
qla.update();
}
};
}
@Override
public void onResume(){
super.onResume();
dataManager.getQuestionList(listCallback);
}
public OnNavigationListener changeSort() {
//This is the callback that is called when the user chooses
//a sorting order from the spinner in the action bar.
final Context activitycontext = this;
return new OnNavigationListener() {
@Override
public boolean onNavigationItemSelected(int itemposition, long itemid) {
// change way of sorting based on way selected
ClientData cd = new ClientData(activitycontext);
sortList(itemposition, dataManager, cd);
qla.update();
return true;
}
};
}
protected void sortList(int itemposition, final DataManager dm, final ClientData cd) {
switch (itemposition){
case 1:{
// Sort by date
Collections.sort(qList, new Comparator<Question>(){
@Override
public int compare(Question q1, Question q2) {
return q1.getDate().compareTo(q2.getDate());
}
});
break;
}
case 2:{
// Sort by most upvoted
Collections.sort(qList, new Comparator<Question>(){
@Override
public int compare(Question q1, Question q2) {
if(q1.getUpvotes() == q2.getUpvotes()){
return q1.getDate().compareTo(q2.getDate());
}
return q2.getUpvotes() - q1.getUpvotes();
}
});
break;
}
case 3:{
//Sort by Favourites
final List<UUID> favQ = cd.getFavorites();
favouriteQuestionCallback = new Callback<Question>(){
@Override
public void run(Question o) {
if(!qList.contains(o)){
qList.add(o);
}
}
};
for(UUID q: favQ){
dataManager.getQuestion(q, favouriteQuestionCallback);
}
Collections.sort(qList, new Comparator<Question>(){
@Override
public int compare(Question arg0, Question arg1) {
if(favQ.contains(arg0.getId()) == favQ.contains(arg1.getId())){
//Sort by date if both in or not in favourites
return arg0.getDate().compareTo(arg1.getDate());
}
else if(favQ.contains(arg0.getId()) && !favQ.contains(arg1.getId())){
return -1;
}
else{
return 1;
}
}
});
break;
}
case 4:{
// Sort by current user posts
Collections.sort(qList, new Comparator<Question>(){
@Override
public int compare(Question q1, Question q2) {
//Instantiate ClientData here
if(q1.getAuthor().equals(cd.getUsername()) == q2.getAuthor().equals(cd.getUsername())){
return q1.getDate().compareTo(q2.getDate());
}
else if(q1.getAuthor().equals(cd.getUsername()) && !q2.getAuthor().equals(cd.getUsername()))
return -1;
else{
return 1;
}
}
});
break;
}
case 5: {
// Sort by most answered
Collections.sort(qList, new Comparator<Question>(){
@Override
public int compare(Question q1, Question q2) {
if(q2.getAnswerList().size() == q1.getAnswerList().size()){
return q1.getDate().compareTo(q2.getDate());
}
return q2.getAnswerList().size() - q1.getAnswerList().size();
}
});
break;
}
case 6: {
// Sort by most answered
Collections.sort(qList, new Comparator<Question>(){
@Override
public int compare(Question q1, Question q2) {
if(q1.getCommentList().size() == q2.getCommentList().size()){
return q1.getDate().compareTo(q2.getDate());
}
return q2.getCommentList().size() - q1.getCommentList().size();
}
});
break;
}
case 7: {
// Sort by has images
Collections.sort(qList, new Comparator<Question>(){
@Override
public int compare(Question q1, Question q2) {
if ((q1.getImage() != null && q2.getImage() != null) || (q1.getImage() == null && q2.getImage() == null)){
// Both same, sort by date for consistency
return q1.getDate().compareTo(q2.getDate());
}
return (q1.getImage() != null) ? -1: 1;
}
});
break;
}
case 8:{
// Sort by read later
final List<UUID> readQ = cd.getReadLaterItems();
readLaterQuestionCallback = new Callback<Question>(){
@Override
public void run(Question o) {
if(!qList.contains(o)){
qList.add(o);
}
}
};
for(UUID q: readQ){
dataManager.getQuestion(q, readLaterQuestionCallback);
}
Collections.sort(qList, new Comparator<Question>(){
@Override
public int compare(Question arg0, Question arg1) {
if(readQ.contains(arg0.getId()) == readQ.contains(arg1.getId())){
//Sort by date if both in or not in read later
return arg0.getDate().compareTo(arg1.getDate());
}
else if(readQ.contains(arg0.getId()) && !readQ.contains(arg1.getId())){
return -1;
}
else{
return 1;
}
}
});
break;
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
switch (id) {
case R.id.action_question_list_search:
FragmentManager fm = getFragmentManager();
SearchQueryDialogFragment sQ = new SearchQueryDialogFragment();
sQ.show(fm, "search");
break;
}
return super.onOptionsItemSelected(item);
}
public void addQuestion(View view){
// open dialog to create a question
FragmentManager fm = getFragmentManager();
AddQuestionDialogFragment aQ = new AddQuestionDialogFragment();
aQ.show(fm, "addquestiondialogfragmentlayout");
}
public void updateList(Question q) {
// update the list
qla.add(q);
qla.update();
Toast.makeText(getApplicationContext(), "Question successfully added", Toast.LENGTH_LONG).show();
}
public void searchQuestions(String q) {
//Start search activity
Intent intent = new Intent(getApplicationContext(), SearchActivity.class);
intent.putExtra("QUERY_STRING", q);
startActivity(intent);
}
public void takeAPhoto(View v){
Intent intent = AI.takeAPhoto();
startActivityForResult(intent, CAMERA);
}
public void addImage(View v){
Intent intent = AI.addPhoto();
startActivityForResult(Intent.createChooser(intent, "Select Image"), ADD_IMAGE);
}
public void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == Activity.RESULT_OK){
if (requestCode == CAMERA){
img = new Image(this, AI.getImgUri());
}
else if(requestCode == ADD_IMAGE){
Uri uri = data.getData();
img = new Image(this, uri);
}
}
//long num = img.getSize();
while(img.getSize() > MAX_SIZE){
img.setImageData(img.compress(img.getBitmap()));
}
}
}