package com.ecollege.android; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import roboguice.inject.InjectExtra; 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.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.ListView; import android.widget.Spinner; import android.widget.TextView; import com.ecollege.android.activities.ECollegeListActivity; import com.ecollege.android.adapter.UberAdapter; import com.ecollege.android.adapter.UberItem; import com.ecollege.android.util.CacheConfiguration; import com.ecollege.android.view.helpers.ResponseCountViewHelper; import com.ecollege.api.ECollegeClient; import com.ecollege.api.model.ContainerInfo; import com.ecollege.api.model.Course; import com.ecollege.api.model.DiscussionTopic; import com.ecollege.api.model.ResponseCount; import com.ecollege.api.model.UserDiscussionTopic; import com.ecollege.api.services.discussions.FetchDiscussionTopicsForCourseIds; import com.google.inject.Inject; public class CourseDiscussionsActivity extends ECollegeListActivity { public static final String COURSE_ID_EXTRA = "COURSE_ID_EXTRA"; private static final int VIEW_TOPIC_REQUEST = 0; @Inject ECollegeApplication app; @Inject SharedPreferences prefs; @InjectView(R.id.reload_button) Button reloadButton; @InjectView(R.id.unit_dropdown) Spinner unitDropdown; @InjectView(R.id.course_title_text) TextView courseTitleText; @InjectExtra(COURSE_ID_EXTRA) long courseId; protected ECollegeClient client; private TopicsAdapter topicAdapter; private LayoutInflater viewInflater; private List<UserDiscussionTopic> allTopics = new ArrayList<UserDiscussionTopic>(); private List<CourseUnit> allUnits = new ArrayList<CourseDiscussionsActivity.CourseUnit>(); private CourseUnit currentUnitFilter = new CourseUnit(); private class CourseUnit implements Comparable<CourseUnit> { public CourseUnit() { } public CourseUnit(long unitNumber, String unitHeader, String unitTitle) { this.unitNumber = unitNumber; this.unitHeader = unitHeader; this.unitTitle = unitTitle; } public long unitNumber = -1; public String unitHeader; public String unitTitle; public long getUnitNumber() { return unitNumber; } public int compareTo(CourseUnit another) { if (unitNumber == -1) return -1; //All at top if (another == null) return 1; return toString().compareTo(another.toString()); } @Override public boolean equals(Object o) { if (o == null) return false; if (!(o instanceof CourseUnit)) return false; return ((CourseUnit)o).toString().equals(toString()); } @Override public int hashCode() { return toString().hashCode(); } @Override public String toString() { if (unitNumber == -1) { return "All Units"; } return String.format("%s %s: %s", unitHeader, unitNumber, unitTitle); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.course_discussions); client = app.getClient(); viewInflater = getLayoutInflater(); Course course = app.getCourseById(courseId); if (course != null) { courseTitleText.setText(Html.fromHtml(course.getTitle())); } configureControls(); topicAdapter = new TopicsAdapter(this); setListAdapter(topicAdapter); fetchTopicsForSelectedCourses(false); } @Override protected void onActivityResult (int requestCode, int resultCode, Intent data) { if (requestCode == VIEW_TOPIC_REQUEST) { fetchTopicsForSelectedCourses(true); } } private void configureControls() { reloadButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { fetchTopicsForSelectedCourses(true); } }); unitDropdown.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Object item = parent.getItemAtPosition(position); if (item instanceof CourseUnit) { currentUnitFilter = (CourseUnit)item; updateCurrentTopics(); } } public void onNothingSelected(AdapterView<?> parent) { currentUnitFilter = new CourseUnit();//All Item updateCurrentTopics(); } }); } private void fetchTopicsForSelectedCourses(boolean reload) { topicAdapter.beginLoading(); CacheConfiguration cacheConfiguration = new CacheConfiguration(); cacheConfiguration.bypassFileCache = reload; cacheConfiguration.bypassResultCache = reload; buildService(new FetchDiscussionTopicsForCourseIds(courseId)) .configureCaching(cacheConfiguration) .execute(); } public void onServiceCallException(FetchDiscussionTopicsForCourseIds service, Exception ex) { topicAdapter.hasError(); } public void onServiceCallSuccess(FetchDiscussionTopicsForCourseIds service) { allTopics = service.getResult(); HashSet<CourseUnit> unitSet = new HashSet<CourseDiscussionsActivity.CourseUnit>(); unitSet.add(new CourseUnit()); for (UserDiscussionTopic t : allTopics) { ContainerInfo ci = t.getTopic().getContainerInfo(); unitSet.add(new CourseUnit(ci.getUnitNumber(),ci.getUnitHeader(),ci.getUnitTitle())); } List<CourseUnit> sortedUnits = new ArrayList<CourseDiscussionsActivity.CourseUnit>(unitSet); Collections.sort(sortedUnits); allUnits = sortedUnits; ArrayAdapter<CourseUnit> adapter = new ArrayAdapter<CourseUnit> (this, R.layout.transparent_spinner_text_view, allUnits); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); unitDropdown.setAdapter(adapter); topicAdapter.setLastUpdatedAt(service.getCompletedAt()); updateCurrentTopics(); } protected void updateCurrentTopics() { if (currentUnitFilter == null || currentUnitFilter.getUnitNumber() == -1) { topicAdapter.updateItems(allTopics); } else { List<UserDiscussionTopic> filteredTopics = new ArrayList<UserDiscussionTopic>(); for (UserDiscussionTopic userTopic : allTopics) { ContainerInfo ci = userTopic.getTopic().getContainerInfo(); if (ci.getUnitNumber() == currentUnitFilter.getUnitNumber()) { filteredTopics.add(userTopic); } } topicAdapter.updateItems(filteredTopics); } } @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); @SuppressWarnings("unchecked") UberItem<UserDiscussionTopic> item = (UberItem<UserDiscussionTopic>)l.getItemAtPosition(position); UserDiscussionTopic selectedTopic = item.getDataItem(); Intent intent = new Intent(this, UserTopicActivity.class); intent.putExtra(UserTopicActivity.USER_TOPIC_EXTRA, selectedTopic); startActivityForResult(intent, VIEW_TOPIC_REQUEST); } static class ViewHolder { ImageView icon; TextView titleText; TextView totalResponseCountText; TextView unreadResponseCountText; TextView userResponseCountText; } protected class TopicsAdapter extends UberAdapter<UserDiscussionTopic> { public TopicsAdapter(Context context) { super(context, true, false, false); } @Override protected Object groupIdFunction(UserDiscussionTopic item) { ContainerInfo ci = item.getTopic().getContainerInfo(); return String.format("%s %s: %s", ci.getUnitHeader(), ci.getUnitNumber(), ci.getUnitTitle()); } @Override protected View getDataItemView(View convertView, ViewGroup parent, UberItem<UserDiscussionTopic> item) { ViewHolder holder; if (convertView == null) { convertView = viewInflater.inflate(R.layout.user_topic_item, null); holder = new ViewHolder(); holder.icon = (ImageView) convertView.findViewById(R.id.icon); holder.titleText = (TextView) convertView.findViewById(R.id.title_text); holder.totalResponseCountText = (TextView) convertView.findViewById(R.id.total_response_count_text); holder.unreadResponseCountText = (TextView) convertView.findViewById(R.id.unread_response_count_text); holder.userResponseCountText = (TextView) convertView.findViewById(R.id.user_response_count_text); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } UserDiscussionTopic userTopic = item.getDataItem(); DiscussionTopic topic = userTopic.getTopic(); ResponseCount responseCount = userTopic.getChildResponseCounts(); holder.titleText.setText(Html.fromHtml(topic.getTitle()).toString()); ResponseCountViewHelper responseCountViewHelper = new ResponseCountViewHelper( getBaseContext(), holder.icon, holder.unreadResponseCountText, holder.totalResponseCountText, holder.userResponseCountText ); responseCountViewHelper.setResponseCount(responseCount); return convertView; } } }