Skip to content

Commit

Permalink
Merge pull request #580 from jjoseba/download-media-issues
Browse files Browse the repository at this point in the history
Download media issues (#565 & #566)
  • Loading branch information
alexlittle committed Sep 6, 2016
2 parents ddf5322 + ea83517 commit 495ebe7
Show file tree
Hide file tree
Showing 18 changed files with 423 additions and 203 deletions.
Expand Up @@ -29,6 +29,8 @@
import org.digitalcampus.oppia.adapter.DownloadMediaListAdapter;
import org.digitalcampus.oppia.listener.DownloadMediaListener;
import org.digitalcampus.oppia.listener.ListInnerBtnOnClickListener;
import org.digitalcampus.oppia.model.Course;
import org.digitalcampus.oppia.model.CourseMetaPage;
import org.digitalcampus.oppia.model.Media;
import org.digitalcampus.oppia.service.DownloadBroadcastReceiver;
import org.digitalcampus.oppia.service.DownloadService;
Expand All @@ -45,10 +47,13 @@
import android.os.Environment;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class DownloadMediaActivity extends AppActivity implements DownloadMediaListener {
Expand All @@ -59,6 +64,8 @@ public class DownloadMediaActivity extends AppActivity implements DownloadMediaL
private ArrayList<Media> missingMedia;
private DownloadMediaListAdapter dmla;
private DownloadBroadcastReceiver receiver;
Button downloadViaPCBtn;
private TextView emptyState;

@SuppressWarnings("unchecked")
@Override
Expand All @@ -81,7 +88,7 @@ public void onCreate(Bundle savedInstanceState) {
ListView listView = (ListView) findViewById(R.id.missing_media_list);
listView.setAdapter(dmla);

Button downloadViaPCBtn = (Button) this.findViewById(R.id.download_media_via_pc_btn);
downloadViaPCBtn = (Button) this.findViewById(R.id.download_media_via_pc_btn);
downloadViaPCBtn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
downloadViaPC();
Expand All @@ -91,20 +98,30 @@ public void onClick(View v) {
Editor e = prefs.edit();
e.putLong(PrefsActivity.PREF_LAST_MEDIA_SCAN, 0);
e.commit();

emptyState = (TextView) findViewById(R.id.empty_state);
}

@Override
public void onResume(){
super.onResume();
if ((missingMedia != null) && missingMedia.size()>0) {
//We already have loaded media (coming from orientationchange)
dmla.sortByFilename();
dmla.notifyDataSetChanged();
emptyState.setVisibility(View.GONE);
downloadViaPCBtn.setVisibility(View.VISIBLE);
}else{
emptyState.setVisibility(View.VISIBLE);
downloadViaPCBtn.setVisibility(View.GONE);
}
receiver = new DownloadBroadcastReceiver();
receiver.setMediaListener(this);
IntentFilter broadcastFilter = new IntentFilter(DownloadService.BROADCAST_ACTION);
broadcastFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
registerReceiver(receiver, broadcastFilter);

invalidateOptionsMenu();
}

@Override
Expand All @@ -127,7 +144,30 @@ protected void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putSerializable(TAG, missingMedia);
}


@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.clear();
getMenuInflater().inflate(R.menu.missing_media_sortby, menu);
MenuItem sortBy = menu.findItem(R.id.sort_by);
if(sortBy != null) {
sortBy.setVisible(missingMedia.size() != 0);
}
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

int itemId = item.getItemId();
switch(itemId){
case R.id.menuSortCourseTitle: dmla.sortByCourse(); return true;
case R.id.menuSortMediaTitle: dmla.sortByFilename(); return true;
case android.R.id.home: onBackPressed(); return true;
default: return super.onOptionsItemSelected(item);
}
}

private void downloadViaPC(){
String filename = "oppia-media.html";
String strData = "<html>";
Expand Down Expand Up @@ -188,6 +228,9 @@ public void onDownloadComplete(String fileUrl) {
Toast.makeText(this, this.getString(R.string.download_complete), Toast.LENGTH_LONG).show();
missingMedia.remove(mediaFile);
dmla.notifyDataSetChanged();
emptyState.setVisibility((missingMedia.size()==0) ? View.VISIBLE : View.GONE);
downloadViaPCBtn.setVisibility((missingMedia.size()==0) ? View.GONE : View.VISIBLE);
invalidateOptionsMenu();
}
}

Expand Down
Expand Up @@ -487,7 +487,8 @@ private void animateScanMediaMessage(){
anim.setDuration(900);
messageContainer.startAnimation(anim);

ValueAnimator animator = ValueAnimator.ofInt(initialCourseListPadding, 90);
messageContainer.measure(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
ValueAnimator animator = ValueAnimator.ofInt(initialCourseListPadding, messageContainer.getMeasuredHeight());
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
//@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
Expand Down
Expand Up @@ -18,13 +18,20 @@
package org.digitalcampus.oppia.adapter;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Locale;

import org.digitalcampus.mobile.learning.R;
import org.digitalcampus.oppia.activity.PrefsActivity;
import org.digitalcampus.oppia.listener.ListInnerBtnOnClickListener;
import org.digitalcampus.oppia.model.Course;
import org.digitalcampus.oppia.model.Media;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
Expand All @@ -49,7 +56,9 @@ public DownloadMediaListAdapter(Activity context, ArrayList<Media> mediaList) {
}

static class DownloadMediaViewHolder{
TextView mediaCourses;
TextView mediaTitle;
TextView mediaPath;
TextView mediaFileSize;
ImageButton downloadBtn;
ProgressBar downloadProgress;
Expand All @@ -64,7 +73,9 @@ public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.media_download_row, parent, false);
viewHolder = new DownloadMediaViewHolder();
viewHolder.mediaCourses = (TextView) convertView.findViewById(R.id.media_courses);
viewHolder.mediaTitle = (TextView) convertView.findViewById(R.id.media_title);
viewHolder.mediaPath = (TextView) convertView.findViewById(R.id.media_path);
viewHolder.mediaFileSize = (TextView) convertView.findViewById(R.id.media_file_size);
viewHolder.downloadBtn = (ImageButton) convertView.findViewById(R.id.action_btn);
viewHolder.downloadProgress = (ProgressBar) convertView.findViewById(R.id.download_progress);
Expand All @@ -76,7 +87,17 @@ public View getView(int position, View convertView, ViewGroup parent) {

Media m = mediaList.get(position);

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
String courses = "";
for(int i = 0; i < m.getCourses().size(); i++){
Course c = m.getCourses().get(i);
String title = c.getTitle(prefs.getString(PrefsActivity.PREF_LANGUAGE, Locale.getDefault().getLanguage()));
courses += i != 0 ? ", " + title : title;
}

viewHolder.mediaCourses.setText(courses);
viewHolder.mediaTitle.setText(m.getFilename());
viewHolder.mediaPath.setText(m.getDownloadUrl());
if(m.getFileSize() != 0){
viewHolder.mediaFileSize.setText(ctx.getString(R.string.media_file_size,m.getFileSize()/(1024*1024)));
} else {
Expand All @@ -94,6 +115,7 @@ public void onClick(View v) {
if (m.isDownloading()){
viewHolder.downloadBtn.setImageResource(R.drawable.ic_action_cancel);
viewHolder.downloadProgress.setVisibility(View.VISIBLE);
viewHolder.mediaPath.setVisibility(View.GONE);
if (m.getProgress()>0){
viewHolder.downloadProgress.setIndeterminate(false);
viewHolder.downloadProgress.setProgress(m.getProgress());
Expand All @@ -105,11 +127,39 @@ public void onClick(View v) {
else{
viewHolder.downloadBtn.setImageResource(R.drawable.ic_action_download);
viewHolder.downloadProgress.setVisibility(View.GONE);
viewHolder.mediaPath.setVisibility(View.VISIBLE);
}
return convertView;
}

public void setOnClickListener(ListInnerBtnOnClickListener onClickListener) {
this.onClickListener = onClickListener;
}

public void sortByCourse(){
//Sort the media list by filename
Collections.sort(this.mediaList, new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2){
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
String titleCourse1 = ((Media) o1).getCourses().get(0).getTitle(prefs.getString(PrefsActivity.PREF_LANGUAGE, Locale.getDefault().getLanguage()));
String titleCourse2= ((Media) o2).getCourses().get(0).getTitle(prefs.getString(PrefsActivity.PREF_LANGUAGE, Locale.getDefault().getLanguage()));
return (titleCourse1.compareTo(titleCourse2));
}
});

notifyDataSetChanged();
}

public void sortByFilename(){
//Sort the media list by filename
Collections.sort(this.mediaList, new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2){
return ((Media) o1).getFilename().compareTo(((Media) o2).getFilename());
}
});

notifyDataSetChanged();
}
}
Expand Up @@ -41,6 +41,7 @@
public class SessionManager {

public static final String ACCOUNTS_CSV_FILENAME = "oppia_accounts.csv";
public static final String APIKEY_VALID = "prefApiKeyInvalid";

public static boolean isLoggedIn(Context ctx) {
String username = getUsername(ctx);
Expand All @@ -58,7 +59,14 @@ public static String getUserDisplayName(Context ctx){
DbHelper db = DbHelper.getInstance(ctx);
try {
User u = db.getUser(username);
/*
//To test fast the apiKey expired case, uncomment this lines
////////////////////////
u.setApiKey("xxxxxxx"); //to invalidate apiKey
db.addOrUpdateUser(u);
*/
return u.getDisplayName();

} catch (UserNotFoundException e) {
e.printStackTrace();
return null;
Expand All @@ -85,6 +93,7 @@ public static void loginUser(Context ctx, User user){
editor.putBoolean(PrefsActivity.PREF_BADGING_ENABLED, user.isBadgingEnabled());

loadUserPrefs(ctx, username, editor);
setUserApiKeyValid(ctx, user, true);
Mint.setUserIdentifier(username);
editor.apply();
}
Expand Down Expand Up @@ -127,7 +136,6 @@ private static void saveUserPrefs(Context ctx, String username, SharedPreference

DbHelper db = DbHelper.getInstance(ctx);
db.insertUserPreferences(username, userPrefs);

}

//Warning: this method doesn't call prefs.apply()
Expand Down Expand Up @@ -160,6 +168,28 @@ else if (PrefsActivity.USER_BOOLEAN_PREFS.contains(prefKey)){
}
}

public static void setUserApiKeyValid(Context ctx, User user, boolean valid){
ArrayList<Pair<String, String>> userPrefs = new ArrayList<>();
Pair<String, String> userPref = new Pair<>(APIKEY_VALID, valid?"true":"false");
userPrefs.add(userPref);

DbHelper.getInstance(ctx).insertUserPreferences(user.getUsername(), userPrefs);
}

public static boolean isUserApiKeyValid(Context ctx){
if (isLoggedIn(ctx)){
String user = getUsername(ctx);
return isUserApiKeyValid(ctx, user);
}
return true;
}

public static boolean isUserApiKeyValid(Context ctx, String username){
DbHelper db = DbHelper.getInstance(ctx);
String prefValue = db.getUserPreference(username, APIKEY_VALID);
return (prefValue == null || "true".equals(prefValue));
}

public static void preloadUserAccounts(Context ctx, PreloadAccountsListener listener){
File csvAccounts = new File(Storage.getStorageLocationRoot(ctx) + File.separator + ACCOUNTS_CSV_FILENAME);
if (csvAccounts.exists()){
Expand Down
7 changes: 7 additions & 0 deletions app/src/main/java/org/digitalcampus/oppia/model/Media.java
Expand Up @@ -18,6 +18,7 @@
package org.digitalcampus.oppia.model;

import java.io.Serializable;
import java.util.ArrayList;

public class Media implements Serializable{

Expand All @@ -29,8 +30,13 @@ public class Media implements Serializable{
private String digest;
private int length;
private double fileSize;
private ArrayList<Course> courses;

private int downloaded;

public Media(){
courses = new ArrayList<>();
}

public String getFilename() {
return filename;
Expand Down Expand Up @@ -76,6 +82,7 @@ public int getDownloaded() {
return downloaded;
}

public ArrayList<Course> getCourses(){ return courses; }

//ONLY FOR UI PURPOSES
private boolean downloading;
Expand Down
Expand Up @@ -10,7 +10,10 @@

import org.apache.http.client.ClientProtocolException;
import org.digitalcampus.oppia.activity.PrefsActivity;
import org.digitalcampus.oppia.application.DbHelper;
import org.digitalcampus.oppia.application.MobileLearning;
import org.digitalcampus.oppia.exception.UserNotFoundException;
import org.digitalcampus.oppia.model.User;
import org.digitalcampus.oppia.utils.HTTPClientUtils;
import org.json.JSONException;
import org.json.JSONObject;
Expand Down Expand Up @@ -57,6 +60,12 @@ public static boolean registerDevice(Context ctx, SharedPreferences prefs){
String token = prefs.getString(PrefsActivity.GCM_TOKEN_ID, "");
String deviceModel = android.os.Build.BRAND + " " + android.os.Build.MODEL;
String deviceID = Settings.Secure.getString(ctx.getContentResolver(), Settings.Secure.ANDROID_ID);
User user = null;
try {
user = DbHelper.getInstance(ctx).getUser(username);
} catch (UserNotFoundException e) {
e.printStackTrace();
}

Log.d(TAG, "Registering device in remote admin list");
try {
Expand All @@ -69,6 +78,8 @@ public static boolean registerDevice(Context ctx, SharedPreferences prefs){
OkHttpClient client = HTTPClientUtils.getClient(ctx);
Request request = new Request.Builder()
.url(HTTPClientUtils.getFullURL(ctx, MobileLearning.DEVICEADMIN_ADD_PATH))
.addHeader(HTTPClientUtils.HEADER_AUTH,
HTTPClientUtils.getAuthHeaderValue(user.getUsername(), user.getApiKey()))
.post(RequestBody.create(HTTPClientUtils.MEDIA_TYPE_JSON, json.toString()))
.build();

Expand Down
Expand Up @@ -19,6 +19,8 @@

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

import org.digitalcampus.oppia.exception.InvalidXMLException;
import org.digitalcampus.oppia.listener.ScanMediaListener;
Expand Down Expand Up @@ -70,8 +72,10 @@ protected Payload doInBackground(Payload... params) {
for (Object cm: currentMedia){
//We have to add it if there is not other object with that filename
add = !((Media) cm).getFilename().equals(m.getFilename());
if(!add){ ((Media) cm).getCourses().add(course); break; }
}
if (add){
m.getCourses().add(course);
if (downloadingMedia!=null && downloadingMedia.contains(m.getDownloadUrl())){
m.setDownloading(true);
}
Expand Down
Binary file added app/src/main/res/drawable-hdpi/ic_sort.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/src/main/res/drawable-mdpi/ic_sort.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/src/main/res/drawable-xhdpi/ic_sort.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 495ebe7

Please sign in to comment.