Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Oppia 1104 autodownload course activity #1290

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,6 @@ android {
buildConfigField "boolean", "SHOW_GAMIFICATION_EVENTS", runtimeProps['SHOW_GAMIFICATION_EVENTS']
buildConfigField "boolean", "ALLOW_REGISTER_USER", runtimeProps['ALLOW_REGISTER_USER']


resValue "string", "MENU_ALLOW_LOGOUT_DEFAULT_VALUE", runtimeProps['MENU_ALLOW_LOGOUT']
resValue "string", "MENU_ALLOW_COURSE_DOWNLOAD_DEFAULT_VALUE", runtimeProps['MENU_ALLOW_COURSE_DOWNLOAD']
resValue "string", "MENU_ALLOW_LANGUAGE_DEFAULT_VALUE", runtimeProps['MENU_ALLOW_LANGUAGE']
Expand All @@ -162,6 +161,8 @@ android {
resValue "string", "prefCoursesReminderTimeDefault", runtimeProps['DEFAULT_REMINDER_TIME']
resValue "string", "prefCoursesReminderDaysDefaultSerialized", runtimeProps['DEFAULT_REMINDER_DAYS']
resValue "string", "prefShowGamificationEventsDefault", runtimeProps['SHOW_GAMIFICATION_EVENTS']
resValue "string", "prefUpdateActivityOnLoginDefault", runtimeProps['UPDATE_ACTIVITY_ON_LOGIN']

}

debug {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@
public class MainActivity extends AppActivity implements BottomNavigationView.OnNavigationItemSelectedListener,
View.OnClickListener {

public static final String EXTRA_MUST_UPDATE_COURSES_ACTIVITY = "extra_must_update_courses_activity";

private DrawerMenuManager drawer;
private MenuItem searchMenuItem;

Expand Down Expand Up @@ -77,14 +79,20 @@ protected void onCreate(Bundle savedInstanceState) {

bindingHeader.viewProfileOptions.setVisibility(View.GONE);

getSupportFragmentManager().beginTransaction().replace(R.id.frame_main, new CoursesListFragment()).commit();
getSupportFragmentManager().beginTransaction().replace(R.id.frame_main, getCoursesListFragment()).commit();

saveServerBadgeAwardCriteria();

binding.drawerVersionName.setText(getString(R.string.version, BuildConfig.VERSION_NAME));

}

private Fragment getCoursesListFragment() {
Fragment fragment = new CoursesListFragment();
fragment.setArguments(getIntent().getExtras());
return fragment;
}

private void saveServerBadgeAwardCriteria() {
if (getPrefs().getString(PrefsActivity.PREF_BADGE_AWARD_CRITERIA, null) == null) {
new FetchServerInfoTask(this).execute();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,8 @@ public class PrefsActivity extends AppActivity implements SharedPreferences.OnSh
public static final String PREF_COURSES_REMINDER_TIME = "prefCoursesReminderTime";
public static final String PREF_REMINDERS_LOG = "prefRemindersLog";

public static final String PREF_UPDATE_ACTIVITY_ON_LOGIN = "prefUpdateActivityOnLogin";

private PreferenceChangedCallback currentPrefScreen;

@Inject
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ public void onBackPressed() {
}
}

public void onSuccessUserAccess(User user) {
public void onSuccessUserAccess(User user, boolean mustUpdateCoursesActivity) {

boolean fromViewDigest = getIntent().getBooleanExtra(ViewDigestActivity.EXTRA_FROM_VIEW_DIGEST, false);

Expand All @@ -179,7 +179,9 @@ public void onSuccessUserAccess(User user) {
if (fromViewDigest) {
setResult(Activity.RESULT_OK);
} else {
startActivity(new Intent(this, MainActivity.class));
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra(MainActivity.EXTRA_MUST_UPDATE_COURSES_ACTIVITY, mustUpdateCoursesActivity);
startActivity(intent);
}

if (analyticsProvider.shouldShowOptOutRationale(this)){
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@ public void showProgressDialog(String message) {
}

public void showProgressDialog(String message, boolean cancelable) {
showProgressDialog(message, cancelable, true);
}
public void showProgressDialog(String message, boolean cancelable, boolean indeterminate) {

if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
Expand All @@ -79,9 +82,19 @@ public void showProgressDialog(String message, boolean cancelable) {
progressDialog.setMessage(message);
progressDialog.setCancelable(cancelable);
progressDialog.setCanceledOnTouchOutside(false);

if (!indeterminate) {
progressDialog.setIndeterminate(false);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
}

progressDialog.show();
}

protected ProgressDialog getProgressDialog() {
return progressDialog;
}

public void hideProgressDialog() {
if (progressDialog != null && progressDialog.isShowing()){
progressDialog.dismiss();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
Expand All @@ -22,6 +21,7 @@
import org.digitalcampus.mobile.learning.databinding.FragmentCoursesListBinding;
import org.digitalcampus.oppia.activity.CourseIndexActivity;
import org.digitalcampus.oppia.activity.DownloadActivity;
import org.digitalcampus.oppia.activity.MainActivity;
import org.digitalcampus.oppia.activity.PrefsActivity;
import org.digitalcampus.oppia.activity.TagSelectActivity;
import org.digitalcampus.oppia.adapter.CoursesListAdapter;
Expand All @@ -43,10 +43,12 @@
import org.digitalcampus.oppia.task.UpdateCourseActivityTask;
import org.digitalcampus.oppia.task.result.BasicResult;
import org.digitalcampus.oppia.task.result.EntityResult;
import org.digitalcampus.oppia.utils.ConnectionUtils;
import org.digitalcampus.oppia.utils.CourseUtils;
import org.digitalcampus.oppia.utils.TextUtilsJava;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;

Expand All @@ -58,7 +60,7 @@ public class CoursesListFragment extends AppFragment implements SharedPreference
CourseInstallerListener,
UpdateActivityListener, CoursesListAdapter.OnItemClickListener {

public static final String ACTION_COURSES_UPDATES = "actionCoursesUpdates";
public static final String ACTION_COURSES_UPDATES = "actionCoursesUpdates";

private List<Course> courses;

Expand All @@ -67,9 +69,12 @@ public class CoursesListFragment extends AppFragment implements SharedPreference

private InstallerBroadcastReceiver receiver;

@Inject CoursesRepository coursesRepository;
@Inject SharedPreferences sharedPrefs;
@Inject ApiEndpoint apiEndpoint;
@Inject
CoursesRepository coursesRepository;
@Inject
SharedPreferences sharedPrefs;
@Inject
ApiEndpoint apiEndpoint;

BroadcastReceiver coursesUpdatesReceiver = new BroadcastReceiver() {
@Override
Expand Down Expand Up @@ -116,10 +121,25 @@ public View onCreateView(@NonNull LayoutInflater inflater,
public void onStart() {
super.onStart();
displayCourses();

if (getArguments() != null && getArguments().getBoolean(MainActivity.EXTRA_MUST_UPDATE_COURSES_ACTIVITY)) {
String updateActivityOnLoginOption = sharedPrefs.getString(PrefsActivity.PREF_UPDATE_ACTIVITY_ON_LOGIN, getString(R.string.prefUpdateActivityOnLoginDefault));
if (TextUtilsJava.equals(updateActivityOnLoginOption, getString(R.string.update_activity_on_login_option_optional))
|| TextUtilsJava.equals(updateActivityOnLoginOption, getString(R.string.update_activity_on_login_option_force))) {
runUpdateCoursesActivityProcess();
}
getArguments().remove(MainActivity.EXTRA_MUST_UPDATE_COURSES_ACTIVITY);
}
}

private void runUpdateCoursesActivityProcess() {
if (!courses.isEmpty()) {
launchUpdateCoursesActivityTask(courses, "", false);
}
}

@Override
public void onResume(){
public void onResume() {
super.onResume();

receiver = new InstallerBroadcastReceiver();
Expand All @@ -137,7 +157,7 @@ public void onResume(){
}

@Override
public void onPause(){
public void onPause() {
super.onPause();
getActivity().unregisterReceiver(receiver);
getActivity().unregisterReceiver(coursesUpdatesReceiver);
Expand All @@ -148,7 +168,7 @@ private void displayCourses() {
courses.addAll(coursesRepository.getCourses(getActivity()));
CourseUtils.refreshStatuses(prefs, courses, null);

if (courses.size() < App.DOWNLOAD_COURSES_DISPLAY){
if (courses.size() < App.DOWNLOAD_COURSES_DISPLAY) {
displayDownloadSection();
} else {
binding.manageCoursesText.setText(R.string.no_courses);
Expand All @@ -161,9 +181,9 @@ private void displayCourses() {
}


private void displayDownloadSection(){
private void displayDownloadSection() {
binding.noCourses.setVisibility(View.VISIBLE);
binding.manageCoursesText.setText((!courses.isEmpty())? R.string.more_courses : R.string.no_courses);
binding.manageCoursesText.setText((!courses.isEmpty()) ? R.string.more_courses : R.string.no_courses);
binding.manageCoursesBtn.setOnClickListener(v -> onManageCoursesClick());
binding.emptyStateImg.setOnClickListener(v -> onManageCoursesClick());

Expand Down Expand Up @@ -237,14 +257,14 @@ public void onContextMenuItemSelected(final int position, final int itemId) {
AdminSecurityManager.with(getActivity()).checkAdminPermission(itemId, () -> {
Course course = courses.get(position);
if (itemId == R.id.course_context_delete) {
if (sharedPrefs.getBoolean(PrefsActivity.PREF_DELETE_COURSE_ENABLED, true)){
if (sharedPrefs.getBoolean(PrefsActivity.PREF_DELETE_COURSE_ENABLED, true)) {
confirmCourseDelete(course);
} else {
Toast.makeText(getActivity(), getString(R.string.warning_delete_disabled), Toast.LENGTH_LONG).show();
}
} else if (itemId == R.id.course_context_reset) {
confirmCourseReset(course);
} else if (itemId == R.id.course_context_update_activity){
} else if (itemId == R.id.course_context_update_activity) {
confirmCourseUpdateActivity(course);
}
});
Expand Down Expand Up @@ -281,28 +301,36 @@ private void confirmCourseReset(Course course) {
builder.show();
}

private void confirmCourseUpdateActivity(Course course){
private void confirmCourseUpdateActivity(Course course) {

showProgressDialog(getString(R.string.course_updating), false);
launchUpdateCoursesActivityTask(Arrays.asList(course), getString(R.string.course_updating), true);
}

private void launchUpdateCoursesActivityTask(List<Course> courses, String progressDialogMessage, boolean progressDialogIndeterminate) {

if (!ConnectionUtils.isNetworkConnected(getActivity())) {
toast(R.string.connection_unavailable_couse_activity);
return;
}

showProgressDialog(progressDialogMessage, false, progressDialogIndeterminate);

UpdateCourseActivityTask task = new UpdateCourseActivityTask(getActivity(),
SessionManager.getUserId(getActivity()), apiEndpoint);
task.setUpdateActivityListener(CoursesListFragment.this);
task.execute(course);

task.execute(courses);
}

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if(key.equalsIgnoreCase(PrefsActivity.PREF_SHOW_SCHEDULE_REMINDERS) || key.equalsIgnoreCase(PrefsActivity.PREF_NO_SCHEDULE_REMINDERS)){
if (key.equalsIgnoreCase(PrefsActivity.PREF_SHOW_SCHEDULE_REMINDERS) || key.equalsIgnoreCase(PrefsActivity.PREF_NO_SCHEDULE_REMINDERS)) {
displayCourses();
}

}

@Override
public void onCourseDeletionComplete(BasicResult result) {
if (result.isSuccess()){
if (result.isSuccess()) {
Media.resetMediaScan(prefs);
}

Expand Down Expand Up @@ -335,18 +363,43 @@ public void onInstallFailed(String fileUrl, String message) {

/* UpdateActivityListener implementation */
public void updateActivityProgressUpdate(DownloadProgress dp) {
// no need to show download progress in this activity
getProgressDialog().setProgress(dp.getProgress());
getProgressDialog().setMessage(getString(R.string.updating_course_activity, dp.getMessage()));
}

public void updateActivityComplete(EntityResult<Course> result) {
Course course = result.getEntity();
public void updateActivityComplete(EntityResult<List<Course>> result) {
List<Course> courses = result.getEntity();

hideProgressDialog();

toast(getString(result.isSuccess() ? R.string.course_updating_success :
R.string.course_updating_error, (course!=null) ? course.getShortname() : ""));
if (courses.size() == 1) {
Course course = courses.get(0);
toast(getString(result.isSuccess() ? R.string.course_updating_success :
R.string.course_updating_error, (course != null) ? course.getShortname() : ""));
} else {
if (!result.isSuccess()) {
showCoursesActivityUpdateErrorDialog();
}
}


displayCourses();
}

private void showCoursesActivityUpdateErrorDialog() {
AlertDialog.Builder ab = new AlertDialog.Builder(getActivity());
ab.setMessage(R.string.error_unable_retrieve_course_activity);
ab.setPositiveButton(R.string.try_again, (dialog, which) -> runUpdateCoursesActivityProcess());

String updateActivityOnLoginOption = sharedPrefs.getString(PrefsActivity.PREF_UPDATE_ACTIVITY_ON_LOGIN, null);
boolean canContinue = TextUtilsJava.equals(updateActivityOnLoginOption, getString(R.string.update_activity_on_login_option_optional));

if (canContinue) {
ab.setNegativeButton(R.string.continue_anyway, (dialog, which) -> dialog.dismiss());
}

ab.setCancelable(false);
ab.show();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,8 @@ public void submitComplete(EntityResult<User> response) {

if (response.isSuccess()) {
User user = response.getEntity();
((WelcomeActivity) getActivity()).onSuccessUserAccess(user);
boolean mustUpdateCoursesActivity = !user.isLocalUser();
((WelcomeActivity) getActivity()).onSuccessUserAccess(user, mustUpdateCoursesActivity);

} else {
Context ctx = super.getActivity();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@

import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Patterns;
import android.view.LayoutInflater;
import android.view.View;
Expand Down Expand Up @@ -268,7 +267,7 @@ public void onSubmitComplete(User registeredUser) {
//Save the search tracker
new Tracker(super.getActivity()).saveRegisterTracker();

((WelcomeActivity) getActivity()).onSuccessUserAccess(registeredUser);
((WelcomeActivity) getActivity()).onSuccessUserAccess(registeredUser, false);

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@
import org.digitalcampus.oppia.model.DownloadProgress;
import org.digitalcampus.oppia.task.result.EntityResult;

import java.util.List;

public interface UpdateActivityListener extends APIKeyRequestListener {

void updateActivityComplete(EntityResult<Course> result);
void updateActivityComplete(EntityResult<List<Course>> result);
void updateActivityProgressUpdate(DownloadProgress dp);
}
9 changes: 9 additions & 0 deletions app/src/main/java/org/digitalcampus/oppia/model/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ public class User {

private Map<String, CustomValue> userCustomFields = new HashMap<>();

private boolean localUser;

public String getUsername() {
return username;
}
Expand Down Expand Up @@ -217,4 +219,11 @@ public List<Integer> getCohorts() {
return this.cohorts;
}

public boolean isLocalUser() {
return localUser;
}

public void setLocalUser(boolean localUser) {
this.localUser = localUser;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ protected EntityResult<User> doInBackground(User... params) {
localUser.getPasswordEncrypted().equals(user.getPasswordEncrypted())){
result.setSuccess(true);
result.setResultMessage(ctx.getString(R.string.login_complete));
result.getEntity().setLocalUser(true);
return result;
}
} catch (UserNotFoundException unfe) {
Expand Down
Loading