Skip to content

Commit

Permalink
Display a progress dialog when printing is being prepared
Browse files Browse the repository at this point in the history
  • Loading branch information
grzesiek2010 committed Nov 30, 2023
1 parent 9f3200c commit 6f6ba4c
Show file tree
Hide file tree
Showing 7 changed files with 55 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1248,7 +1248,7 @@ private ODKView createODKView(boolean advancingPage, FormEntryPrompt[] prompts,
odkViewLifecycle
);

return new ODKView(this, prompts, groups, advancingPage, formSaveViewModel, waitingForDataRegistry, viewModelAudioPlayer, audioRecorder, formEntryViewModel, internalRecordingRequester, externalAppRecordingRequester, audioHelperFactory.create(this));
return new ODKView(this, prompts, groups, advancingPage, formSaveViewModel, waitingForDataRegistry, viewModelAudioPlayer, audioRecorder, formEntryViewModel, internalRecordingRequester, externalAppRecordingRequester, audioHelperFactory.create(this), scheduler);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@
import org.odk.collect.android.widgets.utilities.WaitingForDataRegistry;
import org.odk.collect.androidshared.system.IntentLauncher;
import org.odk.collect.androidshared.ui.ToastUtils;
import org.odk.collect.async.Scheduler;
import org.odk.collect.audioclips.PlaybackFailedException;
import org.odk.collect.audiorecorder.recording.AudioRecorder;
import org.odk.collect.permissions.PermissionListener;
Expand Down Expand Up @@ -142,7 +143,7 @@ public class ODKView extends SwipeHandler.View implements OnLongClickListener, W
* @param groups the group hierarchy that this question or field list is in
* @param advancingPage whether this view is being created after a forward swipe through the
*/
public ODKView(ComponentActivity context, final FormEntryPrompt[] questionPrompts, FormEntryCaption[] groups, boolean advancingPage, QuestionMediaManager questionMediaManager, WaitingForDataRegistry waitingForDataRegistry, AudioPlayer audioPlayer, AudioRecorder audioRecorder, FormEntryViewModel formEntryViewModel, InternalRecordingRequester internalRecordingRequester, ExternalAppRecordingRequester externalAppRecordingRequester, AudioHelper audioHelper) {
public ODKView(ComponentActivity context, final FormEntryPrompt[] questionPrompts, FormEntryCaption[] groups, boolean advancingPage, QuestionMediaManager questionMediaManager, WaitingForDataRegistry waitingForDataRegistry, AudioPlayer audioPlayer, AudioRecorder audioRecorder, FormEntryViewModel formEntryViewModel, InternalRecordingRequester internalRecordingRequester, ExternalAppRecordingRequester externalAppRecordingRequester, AudioHelper audioHelper, Scheduler scheduler) {
super(context);
viewLifecycle = ((ScreenContext) context).getViewLifecycle();

Expand Down Expand Up @@ -182,7 +183,8 @@ public ODKView(ComponentActivity context, final FormEntryPrompt[] questionPrompt
viewLifecycle,
new FileRequesterImpl(intentLauncher, externalAppIntentProvider, formController),
new StringRequesterImpl(intentLauncher, externalAppIntentProvider, formController),
formController
formController,
scheduler
);

widgets = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,45 @@ import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.activity.ComponentActivity
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.google.android.material.button.MaterialButton
import org.javarosa.core.model.data.IAnswerData
import org.javarosa.form.api.FormEntryPrompt
import org.odk.collect.android.R
import org.odk.collect.android.formentry.questions.QuestionDetails
import org.odk.collect.android.utilities.QuestionMediaManager
import org.odk.collect.android.widgets.utilities.PrintableHtmlParser
import org.odk.collect.androidshared.livedata.MutableNonNullLiveData
import org.odk.collect.async.Scheduler
import org.odk.collect.material.MaterialProgressDialogFragment
import org.odk.collect.printer.HtmlPrinter

class PrinterWidget(
context: Context,
questionDetails: QuestionDetails,
private val scheduler: Scheduler,
private val questionMediaManager: QuestionMediaManager,
private val printableHtmlParser: PrintableHtmlParser,
private val htmlPrinter: HtmlPrinter
) : QuestionWidget(context, questionDetails) {

private val viewModel = ViewModelProvider(getContext() as ComponentActivity)[PrinterWidgetViewModel::class.java]

init {
render()

MaterialProgressDialogFragment.showOn(
context as AppCompatActivity,
viewModel.isLoading,
context.supportFragmentManager
) {
MaterialProgressDialogFragment().also { dialog ->
dialog.message = context.getString(org.odk.collect.strings.R.string.loading)
}
}
}

override fun onCreateAnswerView(context: Context, prompt: FormEntryPrompt, answerFontSize: Int): View {
Expand All @@ -45,8 +66,20 @@ class PrinterWidget(

private fun print() {
formEntryPrompt.answerText?.let {
val content = printableHtmlParser.parse(it, questionMediaManager)
htmlPrinter.print(context, content)
scheduler.immediate(
background = {
viewModel.isLoading.postValue(true)
printableHtmlParser.parse(it, questionMediaManager)
},
foreground = { content ->
htmlPrinter.print(context, content)
viewModel.isLoading.value = false
}
)
}
}
}

class PrinterWidgetViewModel : ViewModel() {
val isLoading = MutableNonNullLiveData(false)
}
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
import org.odk.collect.android.widgets.utilities.WaitingForDataRegistry;
import org.odk.collect.androidshared.system.CameraUtils;
import org.odk.collect.androidshared.system.IntentLauncherImpl;
import org.odk.collect.async.Scheduler;
import org.odk.collect.audiorecorder.recording.AudioRecorder;
import org.odk.collect.permissions.PermissionsProvider;
import org.odk.collect.printer.HtmlPrinter;
Expand Down Expand Up @@ -93,6 +94,8 @@ public class WidgetFactory {
private final StringRequester stringRequester;
private final FormController formController;

private final Scheduler scheduler;

public WidgetFactory(Activity activity,
boolean readOnlyOverride,
boolean useExternalRecorder,
Expand All @@ -105,7 +108,8 @@ public WidgetFactory(Activity activity,
LifecycleOwner viewLifecycle,
FileRequester fileRequester,
StringRequester stringRequester,
FormController formController) {
FormController formController,
Scheduler scheduler) {
this.activity = activity;
this.readOnlyOverride = readOnlyOverride;
this.useExternalRecorder = useExternalRecorder;
Expand All @@ -119,6 +123,7 @@ public WidgetFactory(Activity activity,
this.fileRequester = fileRequester;
this.stringRequester = stringRequester;
this.formController = formController;
this.scheduler = scheduler;
}

public QuestionWidget createWidgetFromPrompt(FormEntryPrompt prompt, PermissionsProvider permissionsProvider) {
Expand Down Expand Up @@ -180,7 +185,7 @@ public QuestionWidget createWidgetFromPrompt(FormEntryPrompt prompt, Permissions
if (query != null) {
questionWidget = getSelectOneWidget(appearance, questionDetails);
} else if (appearance.equals(Appearances.PRINTER)) {
questionWidget = new PrinterWidget(activity, questionDetails, questionMediaManager, new PrintableHtmlParser(new QRCodeCreatorImpl()), new HtmlPrinter());
questionWidget = new PrinterWidget(activity, questionDetails, scheduler, questionMediaManager, new PrintableHtmlParser(new QRCodeCreatorImpl()), new HtmlPrinter());
} else if (appearance.startsWith(Appearances.PRINTER)) {
questionWidget = new ExPrinterWidget(activity, questionDetails, waitingForDataRegistry);
} else if (appearance.startsWith(Appearances.EX)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package org.odk.collect.android.support

import android.view.View
import androidx.fragment.app.FragmentActivity
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.LifecycleOwner
import org.odk.collect.android.utilities.ScreenContext

class WidgetTestActivity : FragmentActivity(), ScreenContext {
class WidgetTestActivity : AppCompatActivity(), ScreenContext {
@JvmField
val viewsRegisterForContextMenu = mutableListOf<View>()

override fun getActivity(): FragmentActivity {
override fun getActivity(): AppCompatActivity {
return this
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@ import org.odk.collect.android.utilities.QuestionMediaManager
import org.odk.collect.android.widgets.base.QuestionWidgetTest
import org.odk.collect.android.widgets.utilities.PrintableHtmlParser
import org.odk.collect.printer.HtmlPrinter
import org.odk.collect.testshared.FakeScheduler

class PrinterWidgetTest : QuestionWidgetTest<PrinterWidget, IAnswerData>() {
private val scheduler = FakeScheduler()
private val questionMediaManager = mock<QuestionMediaManager>()
private val printableHtmlParser = mock<PrintableHtmlParser>()
private val htmlPrinter = mock<HtmlPrinter>()

override fun createWidget() = PrinterWidget(activity, QuestionDetails(formEntryPrompt), questionMediaManager, printableHtmlParser, htmlPrinter)
override fun createWidget() = PrinterWidget(activity, QuestionDetails(formEntryPrompt), scheduler, questionMediaManager, printableHtmlParser, htmlPrinter)

@Test
fun `clicking the button should trigger printing parsed html document if answer exists`() {
Expand All @@ -32,6 +34,7 @@ class PrinterWidgetTest : QuestionWidgetTest<PrinterWidget, IAnswerData>() {

val widget = createWidget()
widget.findViewById<MaterialButton>(R.id.printer_button).performClick()
scheduler.runBackground()

verify(htmlPrinter).print(activity, "test content")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public class WidgetFactoryTest {
@Before
public void setup() {
Activity activity = CollectHelpers.buildThemedActivity(WidgetTestActivity.class).get();
widgetFactory = new WidgetFactory(activity, false, false, null, null, null, null, mock(FormEntryViewModel.class), null, null, null, null, null);
widgetFactory = new WidgetFactory(activity, false, false, null, null, null, null, mock(FormEntryViewModel.class), null, null, null, null, null, null);
}

@Test
Expand Down

0 comments on commit 6f6ba4c

Please sign in to comment.