Skip to content

Commit

Permalink
Move change language logic to view model
Browse files Browse the repository at this point in the history
  • Loading branch information
seadowg committed Dec 18, 2023
1 parent 3420cbf commit c6721eb
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import org.odk.collect.android.formentry.saving.FormSaveViewModel
import org.odk.collect.android.instancemanagement.autosend.AutoSendSettingsProvider
import org.odk.collect.android.projects.ProjectsDataService
import org.odk.collect.android.utilities.ApplicationConstants
import org.odk.collect.android.utilities.FormsRepositoryProvider
import org.odk.collect.android.utilities.InstancesRepositoryProvider
import org.odk.collect.android.utilities.MediaUtils
import org.odk.collect.async.Scheduler
Expand All @@ -46,7 +47,8 @@ class FormEntryViewModelFactory(
private val fusedLocationClient: LocationClient,
private val permissionsProvider: PermissionsProvider,
private val autoSendSettingsProvider: AutoSendSettingsProvider,
private val instancesRepositoryProvider: InstancesRepositoryProvider
private val instancesRepositoryProvider: InstancesRepositoryProvider,
private val formsRepositoryProvider: FormsRepositoryProvider
) : AbstractSavedStateViewModelFactory(owner, null) {

override fun <T : ViewModel> create(
Expand All @@ -61,7 +63,8 @@ class FormEntryViewModelFactory(
System::currentTimeMillis,
scheduler,
formSessionRepository,
sessionId
sessionId,
formsRepositoryProvider.get(projectId)
)

FormSaveViewModel::class.java -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,6 @@
import org.odk.collect.audiorecorder.recording.AudioRecorder;
import org.odk.collect.externalapp.ExternalAppUtils;
import org.odk.collect.forms.Form;
import org.odk.collect.forms.FormsRepository;
import org.odk.collect.forms.instances.Instance;
import org.odk.collect.location.LocationClient;
import org.odk.collect.material.MaterialProgressDialogFragment;
Expand Down Expand Up @@ -238,9 +237,6 @@ public class FormFillingActivity extends LocalizedActivity implements AnimationL

private static final String TAG_MEDIA_LOADING_FRAGMENT = "media_loading_fragment";

// Identifies the gp of the form used to launch form entry
public static final String KEY_FORMPATH = "formpath";

// Identifies whether this is a new form, or reloading a form after a screen
// rotation (or similar)
private static final String NEWFORM = "newform";
Expand All @@ -260,8 +256,6 @@ public class FormFillingActivity extends LocalizedActivity implements AnimationL

// Random ID
private static final int DELETE_REPEAT = 654321;

private String formPath;
private String saveName;

private Animation inAnimation;
Expand Down Expand Up @@ -307,7 +301,6 @@ public void allowSwiping(boolean doSwipe) {

@Inject
FormsRepositoryProvider formsRepositoryProvider;
private FormsRepository formsRepository;

@Inject
PropertyManager propertyManager;
Expand Down Expand Up @@ -429,7 +422,8 @@ public void onCreate(Bundle savedInstanceState) {
fusedLocatonClient,
permissionsProvider,
autoSendSettingsProvider,
instancesRepositoryProvider
instancesRepositoryProvider,
formsRepositoryProvider
);

this.getSupportFragmentManager().setFragmentFactory(new FragmentFactoryBuilder()
Expand All @@ -454,8 +448,6 @@ public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

formsRepository = formsRepositoryProvider.get();

setContentView(R.layout.form_entry);
setupViewModels(viewModelFactory);

Expand Down Expand Up @@ -625,9 +617,6 @@ private void formControllerAvailable(@NonNull FormController formController, @No

private void setupFields(Bundle savedInstanceState) {
if (savedInstanceState != null) {
if (savedInstanceState.containsKey(KEY_FORMPATH)) {
formPath = savedInstanceState.getString(KEY_FORMPATH);
}
if (savedInstanceState.containsKey(KEY_XPATH)) {
startingXPath = savedInstanceState.getString(KEY_XPATH);
Timber.i("startingXPath is: %s", startingXPath);
Expand Down Expand Up @@ -744,7 +733,6 @@ protected void onSaveInstanceState(Bundle outState) {

outState.putString(KEY_SESSION_ID, sessionId);

outState.putString(KEY_FORMPATH, formPath);
FormController formController = getFormController();
if (formController != null) {
outState.putString(KEY_XPATH,
Expand Down Expand Up @@ -1711,19 +1699,10 @@ private void createLanguageDialog() {
alertDialog = new MaterialAlertDialogBuilder(this)
.setSingleChoiceItems(languages, selected,
(dialog, whichButton) -> {
scheduler.immediate(true, () -> {
Form form = formsRepository.getOneByPath(formPath);
if (form != null) {
formsRepository.save(new Form.Builder(form)
.language(languages[whichButton])
.build()
);
}
});
formEntryViewModel.changeLanguage(languages[whichButton]);
formEntryViewModel.updateAnswersForScreen(getAnswers(), false);

getFormController().setLanguage(languages[whichButton]);
dialog.dismiss();
formEntryViewModel.updateAnswersForScreen(getAnswers(), false);
onScreenRefresh();
})
.setTitle(getString(org.odk.collect.strings.R.string.change_language))
Expand Down Expand Up @@ -1947,8 +1926,7 @@ public void loadingComplete(FormLoaderTask task, FormDef formDef, String warning
final FormController formController = task.getFormController();
Instance instance = task.getInstance();
Form form = task.getForm();

formPath = form.getFormFilePath();
String formPath = form.getFormFilePath();

if (formController != null) {
formLoaderTask.setFormLoaderListener(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
import org.odk.collect.android.projects.ProjectsDataService;
import org.odk.collect.android.utilities.ApplicationConstants;
import org.odk.collect.android.utilities.FormEntryPromptUtils;
import org.odk.collect.android.utilities.FormsRepositoryProvider;
import org.odk.collect.android.utilities.HtmlUtils;
import org.odk.collect.android.utilities.InstancesRepositoryProvider;
import org.odk.collect.android.utilities.MediaUtils;
Expand Down Expand Up @@ -179,6 +180,9 @@ public class FormHierarchyActivity extends LocalizedActivity implements DeleteRe
@Inject
public InstancesRepositoryProvider instancesRepositoryProvider;

@Inject
public FormsRepositoryProvider formsRepositoryProvider;

protected final OnBackPressedCallback onBackPressedCallback = new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
Expand Down Expand Up @@ -210,7 +214,8 @@ public void onCreate(Bundle savedInstanceState) {
fusedLocationClient,
permissionsProvider,
autoSendSettingsProvider,
instancesRepositoryProvider
instancesRepositoryProvider,
formsRepositoryProvider
);

this.getSupportFragmentManager().setFragmentFactory(new FragmentFactoryBuilder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
import org.odk.collect.androidshared.livedata.NonNullLiveData;
import org.odk.collect.async.Cancellable;
import org.odk.collect.async.Scheduler;
import org.odk.collect.forms.Form;
import org.odk.collect.forms.FormsRepository;

import java.io.FileNotFoundException;
import java.util.HashMap;
Expand All @@ -50,6 +52,7 @@ public class FormEntryViewModel extends ViewModel implements SelectChoiceLoader
@NonNull
private final FormSessionRepository formSessionRepository;
private final String sessionId;
private Form form;

@Nullable
private FormController formController;
Expand All @@ -61,20 +64,23 @@ public class FormEntryViewModel extends ViewModel implements SelectChoiceLoader
private AnswerListener answerListener;

private final Cancellable formSessionObserver;
private final FormsRepository formsRepository;

@SuppressWarnings("WeakerAccess")
public FormEntryViewModel(Supplier<Long> clock, Scheduler scheduler, FormSessionRepository formSessionRepository, String sessionId) {
public FormEntryViewModel(Supplier<Long> clock, Scheduler scheduler, FormSessionRepository formSessionRepository, String sessionId, FormsRepository formsRepository) {
this.clock = clock;
this.scheduler = scheduler;
this.formSessionRepository = formSessionRepository;

this.sessionId = sessionId;
formSessionObserver = observe(formSessionRepository.get(this.sessionId), formSession -> {
this.formController = formSession.getFormController();
this.form = formSession.getForm();

boolean hasBackgroundRecording = formController.getFormDef().hasAction(RecordAudioActionHandler.ELEMENT_NAME);
this.hasBackgroundRecording.setValue(hasBackgroundRecording);
});
this.formsRepository = formsRepository;
}

public String getSessionId() {
Expand Down Expand Up @@ -317,6 +323,17 @@ public void validate() {
);
}

public void changeLanguage(String newLanguage) {
formController.setLanguage(newLanguage);

scheduler.immediate(true, () -> {
formsRepository.save(new Form.Builder(form)
.language(newLanguage)
.build()
);
});
}

public interface AnswerListener {
void onAnswer(FormIndex index, IAnswerData answer);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@
import org.odk.collect.android.javarosawrapper.FormController;
import org.odk.collect.android.support.MockFormEntryPromptBuilder;
import org.odk.collect.androidshared.data.Consumable;
import org.odk.collect.forms.FormsRepository;
import org.odk.collect.formstest.InMemFormsRepository;
import org.odk.collect.testshared.FakeScheduler;

import java.io.IOException;
Expand All @@ -52,6 +54,7 @@ public class FormEntryViewModelTest {
private AuditEventLogger auditEventLogger;
private FakeScheduler scheduler;
private final FormSessionRepository formSessionRepository = new InMemFormSessionRepository();
private final FormsRepository formsRepository = new InMemFormsRepository();

@Rule
public InstantTaskExecutorRule instantTaskExecutorRule = new InstantTaskExecutorRule();
Expand All @@ -69,7 +72,7 @@ public void setup() {
scheduler = new FakeScheduler();

formSessionRepository.set("blah", formController, mock());
viewModel = new FormEntryViewModel(mock(Supplier.class), scheduler, formSessionRepository, "blah");
viewModel = new FormEntryViewModel(mock(Supplier.class), scheduler, formSessionRepository, "blah", formsRepository);
}

@Test
Expand Down

0 comments on commit c6721eb

Please sign in to comment.