package at.tugraz.examreminder.ui;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.*;
import at.tugraz.examreminder.adapter.SimpleCoursesAdapter;
import at.tugraz.examreminder.core.Course;
import at.tugraz.examreminder.core.CourseContainer;
import at.tugraz.examreminder.crawler.Crawler;
import at.tugraz.examreminder.crawler.SimpleMockCrawler;
import at.tugraz.examreminder.service.CalendarHelper;
import at.tugraz.examreminder.service.CourseListSerializer;
import at.tugraz.examreminder.service.UpdateService;
import com.actionbarsherlock.view.Menu;
import at.tugraz.examreminder.R;
import com.actionbarsherlock.app.SherlockListActivity;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.widget.SearchView;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;
public class AddCourseActivity extends SherlockListActivity implements SearchView.OnQueryTextListener, AdapterView.OnItemClickListener {
private static String BUNDLE_COURSES_KEY="COURSES_KEY";
private static String BUNDLE_SEARCH_TERM_KEY="SEARCH_TERM_KEY";
MenuItem searchViewItem;
SearchView searchView;
ProgressBar progressBar;
List<Course> courses = new ArrayList<Course>();
SimpleCoursesAdapter adapter;
GregorianCalendar lastSearchSubmit = new GregorianCalendar();
String restored_search_term = null;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add_course_activity);
progressBar = (ProgressBar)findViewById(R.id.progress);
adapter = new SimpleCoursesAdapter(this, courses);
adapter.setMarkCoursesInContainer(true);
setListAdapter(adapter);
getListView().setOnItemClickListener(this);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
List<Course> tmp_courses = CourseListSerializer.jsonToCourseList(savedInstanceState.getString(BUNDLE_COURSES_KEY));
if(tmp_courses != null) {
courses.addAll(tmp_courses);
adapter.notifyDataSetChanged();
}
restored_search_term = savedInstanceState.getString(BUNDLE_SEARCH_TERM_KEY);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(BUNDLE_COURSES_KEY, CourseListSerializer.courseListToJson(courses));
outState.putString(BUNDLE_SEARCH_TERM_KEY, searchView.getQuery().toString());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.add_course_menu, menu);
searchViewItem = menu.findItem(R.id.menu_search);
searchView = (SearchView) searchViewItem.getActionView();
searchView.setIconifiedByDefault(false);
if(restored_search_term != null){
searchView.setQuery(restored_search_term, false);
restored_search_term = null;
}
// searchView.setSubmitButtonEnabled(true);
searchView.setOnQueryTextListener(this);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Course course = adapter.getItem(position);
if(CourseContainer.instance().contains(course)){
Toast.makeText(this, R.string.course_already_added, Toast.LENGTH_SHORT).show();
} else {
boolean use_calendar = PreferenceManager.getDefaultSharedPreferences(this).getBoolean("pref_use_android_calendar", false);
if(use_calendar) {
CalendarHelper calendarHelper = new CalendarHelper(this);
calendarHelper.addExamEvents(course.exams);
}
CourseContainer.instance().add(course);
CourseContainer.instance().notifyObservers();
finish();
}
}
@Override
public boolean onQueryTextSubmit(String query) {
GregorianCalendar now = new GregorianCalendar();
// Dirty hack to prevent double submit android bug: https://code.google.com/p/android/issues/detail?id=24599
if( (now.getTimeInMillis()-lastSearchSubmit.getTimeInMillis()) < 1000 ){
return true;
}
lastSearchSubmit = now;
if(getCurrentFocus()!=null){
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
getListView().requestFocus();
}
Crawler crawler = UpdateService.getCrawlerInstance();
new SearchCoursesTask(query, crawler).execute();
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
private class SearchCoursesTask extends AsyncTask<Void, Void, List<Course>> {
private String query;
private Crawler crawler;
public SearchCoursesTask(String query, Crawler crawler) {
this.query = query;
this.crawler = crawler;
}
@Override
protected void onPreExecute() {
AddCourseActivity.this.searchView.setEnabled(false);
AddCourseActivity.this.progressBar.setVisibility(View.VISIBLE);
}
@Override
protected List<Course> doInBackground(Void... params) {
return crawler.getCourseList(query);
}
@Override
protected void onPostExecute(List<Course> courses) {
AddCourseActivity.this.courses.clear();
if(courses != null)
AddCourseActivity.this.courses.addAll(courses);
AddCourseActivity.this.adapter.notifyDataSetChanged();
AddCourseActivity.this.searchView.setEnabled(true);
AddCourseActivity.this.progressBar.setVisibility(View.GONE);
if(courses==null) {
Log.d("Debug", "Crawler returned null, showing error");
String error_title = getString(R.string.error);
String error_message = getString(R.string.search_error);
DialogHelper.showErrorDialog(AddCourseActivity.this, error_title, error_message);
}
}
}
}