package ca.etsmtl.applets.etsmobile.ui.fragment;
import android.app.DownloadManager;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.MimeTypeMap;
import android.widget.ExpandableListView;
import android.widget.Toast;
import com.octo.android.robospice.persistence.exception.SpiceException;
import com.octo.android.robospice.request.springandroid.SpringAndroidSpiceRequest;
import org.apache.commons.io.FilenameUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import ca.etsmtl.applets.etsmobile.ApplicationManager;
import ca.etsmtl.applets.etsmobile.model.Moodle.MoodleCoreCourse;
import ca.etsmtl.applets.etsmobile.model.Moodle.MoodleCoreCourses;
import ca.etsmtl.applets.etsmobile.model.Moodle.MoodleCoreModule;
import ca.etsmtl.applets.etsmobile.model.Moodle.MoodleModuleContent;
import ca.etsmtl.applets.etsmobile.ui.adapter.ExpandableListMoodleAdapter;
import ca.etsmtl.applets.etsmobile2.R;
/**
* Displays downloadable resources for a Moodle course
*
* @author Thibaut
*/
public class MoodleCourseDetailsFragment extends HttpFragment {
public static String COURSE_ID = "COURSE_ID";
private long enqueue;
private DownloadManager dm;
private String moodleCourseId;
private ExpandableListMoodleAdapter expandableListMoodleAdapter;
private ExpandableListView expListView;
private List<HeaderText> listDataHeader;
private HashMap<HeaderText, Object[]> listDataChild;
private ArrayList<MoodleCoreModule> listMoodleLinkModules;
private ArrayList<MoodleModuleContent> listMoodleResourceContents;
private BroadcastReceiver receiver = null;
public static MoodleCourseDetailsFragment newInstance(int moodleCourseId) {
MoodleCourseDetailsFragment fragment = new MoodleCourseDetailsFragment();
Bundle args = new Bundle();
args.putString(COURSE_ID, Integer.toString(moodleCourseId));
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
Bundle bundle = getArguments();
moodleCourseId = bundle.getString(COURSE_ID);
}
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(enqueue);
Cursor c = dm.query(query);
if (c.moveToFirst()) {
int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS);
if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) {
String uriString = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
MimeTypeMap map = MimeTypeMap.getSingleton();
String ext = MimeTypeMap.getFileExtensionFromUrl(uriString);
String type = map.getMimeTypeFromExtension(ext);
if (type == null)
type = "*/*";
Intent openFile = new Intent(Intent.ACTION_VIEW);
openFile.setDataAndType(Uri.parse(uriString), type);
try {
startActivity(openFile);
} catch(ActivityNotFoundException e) {
Toast.makeText(getActivity(),"Aucune application ne peut ouvrir ce fichier",Toast.LENGTH_SHORT).show();
}
}
}
}
}
};
getActivity().registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}
@Override
public void onDestroy() {
getActivity().unregisterReceiver(receiver);
super.onDestroy();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup v = (ViewGroup) inflater.inflate(R.layout.fragment_moodle_details, container, false);
super.onCreateView(inflater, v, savedInstanceState);
expListView = (ExpandableListView) v.findViewById(R.id.expandableListView_moodle_courses_details);
queryMoodleCoreCourses(moodleCourseId);
return v;
}
@Override
public void onStart() {
super.onStart();
}
@Override
public void onRequestFailure(SpiceException e) {
super.onRequestFailure(e);
}
@Override
public void onRequestSuccess(Object o) {
if(o instanceof MoodleCoreCourses) {
MoodleCoreCourses moodleCoreCourses = (MoodleCoreCourses) o;
// create empty data
listDataChild = new HashMap<HeaderText, Object[]>();
listDataHeader = new ArrayList<HeaderText>();
listMoodleLinkModules = new ArrayList<MoodleCoreModule>();
listMoodleResourceContents = new ArrayList<MoodleModuleContent>();
int position = 2;
for(MoodleCoreCourse coreCourse : moodleCoreCourses) {
for(MoodleCoreModule coreModule : coreCourse.getModules()) {
if(coreModule.getModname().equals("folder")) {
listDataChild.put(new HeaderText(coreModule.getName(),position), coreModule.getContents().toArray());
} else if (coreModule.getModname().equals("url") || coreModule.getModname().equals("forum")) {
listMoodleLinkModules.add(coreModule);
} else if (coreModule.getModname().equals("resource")) {
listMoodleResourceContents.addAll(coreModule.getContents());
}
position++;
}
}
listDataChild.put(new HeaderText("Liens",0),listMoodleLinkModules.toArray());
listDataChild.put(new HeaderText("Ressources",1),listMoodleResourceContents.toArray());
listDataHeader.addAll(listDataChild.keySet());
Collections.sort(listDataHeader, new Comparator<HeaderText>() {
@Override
public int compare(HeaderText headerText1, HeaderText headerText2) {
if(headerText1.getPosition() < headerText2.getPosition()) {
return -1;
} else if (headerText1.getPosition() == headerText2.getPosition()) {
return 0;
} else {
return 1;
}
}
});
expandableListMoodleAdapter = new ExpandableListMoodleAdapter(getActivity(), listDataHeader, listDataChild);
expListView.setAdapter(expandableListMoodleAdapter);
expListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
Object object = expandableListMoodleAdapter.getChild(groupPosition, childPosition);
if(object instanceof MoodleModuleContent) {
MoodleModuleContent item = (MoodleModuleContent) object;
String url = item.getFileurl()+"&token="+ ApplicationManager.userCredentials.getMoodleToken();
Uri uri = Uri.parse(url);
DownloadManager.Request request = new DownloadManager.Request(uri);
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, item.getFilename());
// r.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
MimeTypeMap mimetype = MimeTypeMap.getSingleton();
String extension = FilenameUtils.getExtension(item.getFilename());
request.setMimeType(mimetype.getMimeTypeFromExtension(extension));
dm = (DownloadManager) getActivity().getSystemService(Context.DOWNLOAD_SERVICE);
enqueue = dm.enqueue(request);
}
if(object instanceof MoodleCoreModule) {
MoodleCoreModule item = (MoodleCoreModule) object;
String url = "";
if(item.getModname().equals("url")) {
url = item.getContents().get(0).getFileurl();
} else {
url = item.getUrl();
}
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
}
return true;
}
});
super.onRequestSuccess(null);
}
}
/**
* Query all resources for a Moodle course
* @param idCourse
*/
private void queryMoodleCoreCourses(final String idCourse) {
SpringAndroidSpiceRequest<Object> request = new SpringAndroidSpiceRequest<Object>(null) {
@Override
public MoodleCoreCourses loadDataFromNetwork() throws Exception {
String url = getActivity().getString(R.string.moodle_api_core_course_get_contents, ApplicationManager.userCredentials.getMoodleToken(), idCourse);
return getRestTemplate().getForObject(url, MoodleCoreCourses.class);
}
};
dataManager.sendRequest(request, this);
}
@Override
void updateUI() {
loadingView.showLoadingView();
}
/**
* Holder for headers in ExpandableListView
*/
public class HeaderText {
String headerName;
int position;
public HeaderText(String headerName, int position) {
this.headerName = headerName;
this.position = position;
}
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}
public String getHeaderName() {
return headerName;
}
public void setHeaderName(String headerName) {
this.headerName = headerName;
}
}
}