package com.ecollege.android;
import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
import roboguice.inject.InjectExtra;
import roboguice.inject.InjectResource;
import roboguice.inject.InjectView;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.ecollege.android.activities.ECollegeActivity;
import com.ecollege.android.activities.ECollegeListActivity;
import com.ecollege.android.adapter.UberAdapter;
import com.ecollege.android.adapter.UberItem;
import com.ecollege.api.ECollegeClient;
import com.ecollege.api.model.Announcement;
import com.ecollege.api.model.Course;
import com.ecollege.api.model.User;
import com.ecollege.api.services.courses.FetchAnnouncementsForCourse;
import com.ecollege.api.services.courses.FetchInstructorsForCourse;
import com.google.inject.Inject;
public class CourseActivity extends ECollegeListActivity {
public static final String ANNOUNCEMENT_LIST_EXTRA = "ANNOUNCEMENT_LIST_EXTRA";
@Inject ECollegeApplication app;
@Inject SharedPreferences prefs;
@InjectView(R.id.course_title_text) TextView courseTitleText;
@InjectView(R.id.course_code_text) TextView courseCodeText;
@InjectView(R.id.instructor_text) TextView instructorText;
@InjectView(R.id.announcement_title) TextView announcementTitle;
@InjectView(R.id.announcement_description) TextView announcementDescription;
@InjectView(R.id.instructor_loading_indicator) ProgressBar instructorLoadingIndicator;
@InjectView(R.id.announcement_loading_indicator) ProgressBar announcementsLoadingIndicator;
@InjectView(R.id.announcement_view) LinearLayout announcementView;
@InjectResource(R.array.course_menu_items) String[] courseMenuItems;
@InjectExtra(CoursesActivity.COURSE_EXTRA) Course course;
protected ECollegeClient client;
protected LayoutInflater viewInflater;
private CourseMenuAdapter courseMenuAdapter;
private List<User> instructors;
private List<Announcement> announcements;
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.course);
viewInflater = getLayoutInflater();
client = app.getClient();
displayCourse();
createMenu();
announcementView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (announcements != null && announcements.size() > 0) {
Intent i = new Intent(CourseActivity.this,AnnouncementActivity.class);
i.putExtra(AnnouncementActivity.COURSE_EXTRA, course);
i.putExtra(AnnouncementActivity.ANNOUNCEMENT_EXTRA, announcements.get(0));
i.putExtra(AnnouncementActivity.FINISH_ON_CLICK_ALL_ANNOUNCEMENTS_EXTRA, false);
startActivity(i);
}
}
});
loadAndDisplayInstructorsForCourse();
loadAndDisplayAnnouncementsForCourse();
}
@Override protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Class<? extends ECollegeActivity> destinationClass;
String detailExtraKey = null;
Serializable detailExtraValue = null;
switch (position) {
case 0:
destinationClass = CourseAnnouncementsActivity.class;
detailExtraKey = ANNOUNCEMENT_LIST_EXTRA;
detailExtraValue = (Serializable) announcements;
break;
case 1:
destinationClass = CourseGradebookActivity.class;
break;
case 2:
destinationClass = CoursePeopleActivity.class;
break;
default:
return;
}
Intent intent = new Intent(this, destinationClass);
intent.putExtra(CoursesActivity.COURSE_EXTRA, course);
if (detailExtraKey != null && detailExtraValue != null) {
intent.putExtra(detailExtraKey, detailExtraValue);
}
startActivity(intent);
}
private void displayCourse() {
courseTitleText.setText(Html.fromHtml(course.getTitle()));
courseCodeText.setText(Html.fromHtml(course.getDisplayCourseCode()));
}
private void createMenu() {
courseMenuAdapter = new CourseMenuAdapter(this);
courseMenuAdapter.updateItems(courseMenuItems);
setListAdapter(courseMenuAdapter);
}
private void displayInstructorList() {
showInstructorLoadingProgress(false);
if (!instructors.isEmpty()) {
Iterator<User> i = instructors.listIterator();
StringBuffer sb = new StringBuffer("");
User instructor;
while (i.hasNext()) {
instructor = i.next();
sb.append(instructor.getFirstName() + " " + instructor.getLastName());
if (i.hasNext()) sb.append(", ");
}
instructorText.setText(sb.toString());
} else {
instructorText.setText(R.string.no_instructor);
}
}
private void displayFirstAnnouncement() {
showAnnouncementLoadingProgress(false);
if (!announcements.isEmpty()) {
Announcement firstAnnouncement = announcements.get(0);
announcementTitle.setText(firstAnnouncement.getSubject());
announcementDescription.setText(firstAnnouncement.getRawText());
} else {
announcementTitle.setText(R.string.no_announcements);
announcementDescription.setText(null);
}
}
private void displayAnnouncementCount() {
courseMenuAdapter.notifyDataSetChanged();
}
private void loadAndDisplayInstructorsForCourse() {
showInstructorLoadingProgress(true);
buildService(new FetchInstructorsForCourse(course)).execute();
}
private void loadAndDisplayAnnouncementsForCourse() {
showAnnouncementLoadingProgress(true);
buildService(new FetchAnnouncementsForCourse(course, true)).execute();
}
private void showAnnouncementLoadingProgress(boolean loading) {
if (loading) {
announcementsLoadingIndicator.setVisibility(View.VISIBLE);
announcementTitle.setVisibility(View.GONE);
announcementDescription.setVisibility(View.GONE);
} else {
announcementsLoadingIndicator.setVisibility(View.GONE);
announcementTitle.setVisibility(View.VISIBLE);
announcementDescription.setVisibility(View.VISIBLE);
}
}
private void showInstructorLoadingProgress(boolean loading) {
if (loading) {
instructorLoadingIndicator.setVisibility(View.VISIBLE);
instructorText.setVisibility(View.INVISIBLE);
} else {
instructorLoadingIndicator.setVisibility(View.GONE);
instructorText.setVisibility(View.VISIBLE);
}
}
public void onServiceCallSuccess(FetchInstructorsForCourse service) {
instructors = service.getResult();
displayInstructorList();
}
public void onServiceCallSuccess(FetchAnnouncementsForCourse service) {
// stop progress
announcements = service.getResult();
displayFirstAnnouncement();
displayAnnouncementCount();
}
protected class CourseMenuItemViewHolder {
public TextView title;
public TextView unreadCountText;
}
protected class CourseMenuAdapter extends UberAdapter<String> {
public CourseMenuAdapter(Context context) {
super(context,false,false,false);
}
@Override
protected View getDataItemView(View convertView, ViewGroup parent,
UberItem<String> item) {
CourseMenuItemViewHolder holder;
if (convertView == null) {
holder = new CourseMenuItemViewHolder();
convertView = viewInflater.inflate(R.layout.course_menu_item, null);
holder.title = (TextView) convertView.findViewById(R.id.course_title);
holder.unreadCountText = (TextView) convertView.findViewById(R.id.unread_count_text);
convertView.setTag(holder);
} else {
holder = (CourseMenuItemViewHolder) convertView.getTag();
}
holder.title.setText(item.getDataItem());
// first position should be "Announcements"
// if (position == 0 && announcements != null && announcements.size() > 0) {
// holder.unreadCountText.setVisibility(View.VISIBLE);
// holder.unreadCountText.setText(announcements.size() + "");
// } else {
// holder.unreadCountText.setVisibility(View.GONE);
// holder.unreadCountText.setText(null);
// }
return convertView;
}
}
}