Skip to content

Commit

Permalink
Merge pull request #1290 from jbc25/oppia-1104-autodownload-course-ac…
Browse files Browse the repository at this point in the history
…tivity

Oppia 1104 autodownload course activity
  • Loading branch information
alexlittle committed Oct 25, 2022
2 parents 0b00bad + 44d6b1f commit 112955e
Show file tree
Hide file tree
Showing 18 changed files with 279 additions and 116 deletions.
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

0 comments on commit 112955e

Please sign in to comment.