Urgent: Recurrent Kobocollect error when reviewing form

I am part of a research team working on a nationwide poverty survey in Lebanon. We’ve finalized the form and tested it with a group of 70 data collectors.

The form works well except for the fact that after we save it and try to review the filled questions on the tablet, we get the following error: “Unfortunately, KoboCollect has stopped”.

I attached a screen shot of it and of the form we are using. This is very problematic as supervisors will be reviewing the filled data on a daily basis with data collectors before the forms are submitted.

The survey starts on July 18 and the team is working hard on trying to fix the error in our form. We’ve noticed that the error is definitely related to our repeated groups, since once we remove them the error goes away.

Is anyone able to help us in finding a way to keep the repeated groups and solve the error to be able to review the forms and edit them?

Thank you,

Alexandra

Poverty 15072016.xls (283 KB)

Hi Alexandra,

I wasn’t able to reproduce the issue on my end yet using your form. Since you say it’s only happening when you review the form content after saving the draft (and based on some repeat group responses), it seems that you should be able to submit them though.

I assume this never happened in training / piloting? If there are specific steps you know will always reproduce the issue please let us know.

Can you modify the work flow so that your teams submit the data without the secondary verification?

Best,

Tino

···

On Fri, Jul 15, 2016, 20:41 alexandra irani alexand...@gmail.com wrote:

I am part of a research team working on a nationwide poverty survey in Lebanon. We’ve finalized the form and tested it with a group of 70 data collectors.

The form works well except for the fact that after we save it and try to review the filled questions on the tablet, we get the following error: “Unfortunately, KoboCollect has stopped”.

I attached a screen shot of it and of the form we are using. This is very problematic as supervisors will be reviewing the filled data on a daily basis with data collectors before the forms are submitted.

The survey starts on July 18 and the team is working hard on trying to fix the error in our form. We’ve noticed that the error is definitely related to our repeated groups, since once we remove them the error goes away.

Is anyone able to help us in finding a way to keep the repeated groups and solve the error to be able to review the forms and edit them?

Thank you,

Alexandra

You received this message because you are subscribed to the Google Groups “Kobo Users” group.

To unsubscribe from this group and stop receiving emails from it, send an email to kobo-users+...@googlegroups.com.

To post to this group, send email to kobo-...@googlegroups.com.

Visit this group at https://groups.google.com/group/kobo-users.

For more options, visit https://groups.google.com/d/optout.

Hi Alexander,
Hi Tino,

I was able to reproduce the problem. I have attached a XML file that can be used to reproduce. The last question that is displayed before the crash happens is “How many direct relatives are abroad? (related to the respondent)”, so it’s definitely something inside the following repeat that leads to the crash. To reproduce, fill the survey with minimum data to get it completed and into the instances.db of KoboCollect, by answering e.g.

Beirut → Beirut → Mazraa foncière → 1 → random date → random time → 1 → 101 → 200 → No → No one in my household is Lebanese → Complete → random time

When you save the survey, it will create a folder with a XML file inside on your device, e.g.

/sdcard/odk/instances/Poverty Survey v2_2016-07-16_13-57-04/Poverty Survey v2_2016-07-16_13-57-04.xml

Replace this XML with the one I have attached to reproduce the crash, by renaming it to the name of the XML file on your device, and then placing it into the folder, e.g.

adb push Poverty\ Survey\ v2_2016-07-16_13-57-04.xml /sdcard/odk/instances/Poverty\ Survey\ v2_2016-07-16_13-57-04/

If you now edit the saved survey, it will use the replaced XML and will crash at the repeat.

Here is the Android logcat output:

E/InputEventReceiver(25442): Exception dispatching input event.
D/AndroidRuntime(25442): Shutting down VM
E/AndroidRuntime(25442): FATAL EXCEPTION: main
E/AndroidRuntime(25442): Process: org.koboc.collect.android, PID: 25442
E/AndroidRuntime(25442): java.lang.NullPointerException: Attempt to invoke virtual method ‘java.lang.String java.lang.String.replaceAll(java.lang.String, java.lang.String)’ on a null object reference
E/AndroidRuntime(25442): at org.koboc.collect.android.utilities.TextUtils.markdownToHtml(TextUtils.java:35)
E/AndroidRuntime(25442): at org.koboc.collect.android.utilities.TextUtils.textToHtml(TextUtils.java:108)
E/AndroidRuntime(25442): at org.koboc.collect.android.views.HierarchyElementView.setPrimaryText(HierarchyElementView.java:75)
E/AndroidRuntime(25442): at org.koboc.collect.android.adapters.HierarchyListAdapter.getView(HierarchyListAdapter.java:64)
E/AndroidRuntime(25442): at android.widget.AbsListView.obtainView(AbsListView.java:2349)
E/AndroidRuntime(25442): at android.widget.ListView.makeAndAddView(ListView.java:1864)
E/AndroidRuntime(25442): at android.widget.ListView.fillDown(ListView.java:698)
E/AndroidRuntime(25442): at android.widget.ListView.fillGap(ListView.java:662)
E/AndroidRuntime(25442): at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5007)
E/AndroidRuntime(25442): at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3424)
E/AndroidRuntime(25442): at android.widget.AbsListView.onTouchMove(AbsListView.java:3807)
E/AndroidRuntime(25442): at android.widget.AbsListView.onTouchEvent(AbsListView.java:3638)
E/AndroidRuntime(25442): at android.view.View.dispatchTouchEvent(View.java:8480)
E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2400)
E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2093)
E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
E/AndroidRuntime(25442): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2625)
E/AndroidRuntime(25442): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1770)
E/AndroidRuntime(25442): at android.app.Activity.dispatchTouchEvent(Activity.java:2742)
E/AndroidRuntime(25442): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2586)
E/AndroidRuntime(25442): at android.view.View.dispatchPointerEvent(View.java:8675)
E/AndroidRuntime(25442): at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4129)
E/AndroidRuntime(25442): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3995)
E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3550)
E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3603)
E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3569)
E/AndroidRuntime(25442): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3686)
E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3577)
E/AndroidRuntime(25442): at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3743)
E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3550)
E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3603)
E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3569)
E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3577)
E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3550)
E/AndroidRuntime(25442): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5813)
E/AndroidRuntime(25442): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5787)
E/AndroidRuntime(25442): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5758)
E/AndroidRuntime(25442): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5903)
E/AndroidRuntime(25442): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
E/AndroidRuntime(25442): at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
E/AndroidRuntime(25442): at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176)
E/AndroidRuntime(25442): at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:5874)
E/AndroidRuntime(25442): at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java
W/ActivityManager( 2163): Force finishing activity 1 org.koboc.collect.android/.activities.FormHierarchyActivity

So it looks like the app encounters a string that doesn’t exist when it tries to replace something. Unfortunately I don’t have time to look into this further right now.
My hunch is that it may be related to the ${NAME} variable sometimes existing in the default language, but not in Arabic and vice versa, e.g. “Current educational attainment:” and “Did ${NAME} work for wage (cash or in-kind) even for one hour during last week?”.

I would try to make sure that ${NAME} is used equally in both languages, maybe that already fixes the form.

@Tino: Actually we have a QA use-case as well. What do you think about using the “_status” attribute for this? It could be set to “submitted” per default, and next to the “edit” and “delete” buttons in Enketo there could be “approve” and “reject” buttons that just change this attribute. That would be a quick way to implement something like a simple workflow for reviewing forms.

Best Regards,

Jesaja

Poverty Survey v2_2016-07-16_13-57-04.xml (7.92 KB)

···

On Sat, Jul 16, 2016 at 12:33 PM, Tino Kreutzer tino.k...@kobotoolbox.org wrote:

Hi Alexandra,

I wasn’t able to reproduce the issue on my end yet using your form. Since you say it’s only happening when you review the form content after saving the draft (and based on some repeat group responses), it seems that you should be able to submit them though.

I assume this never happened in training / piloting? If there are specific steps you know will always reproduce the issue please let us know.

Can you modify the work flow so that your teams submit the data without the secondary verification?

Best,

Tino

On Fri, Jul 15, 2016, 20:41 alexandra irani alexand...@gmail.com wrote:

I am part of a research team working on a nationwide poverty survey in Lebanon. We’ve finalized the form and tested it with a group of 70 data collectors.

The form works well except for the fact that after we save it and try to review the filled questions on the tablet, we get the following error: “Unfortunately, KoboCollect has stopped”.

I attached a screen shot of it and of the form we are using. This is very problematic as supervisors will be reviewing the filled data on a daily basis with data collectors before the forms are submitted.

The survey starts on July 18 and the team is working hard on trying to fix the error in our form. We’ve noticed that the error is definitely related to our repeated groups, since once we remove them the error goes away.

Is anyone able to help us in finding a way to keep the repeated groups and solve the error to be able to review the forms and edit them?

Thank you,

Alexandra

You received this message because you are subscribed to the Google Groups “Kobo Users” group.

To unsubscribe from this group and stop receiving emails from it, send an email to kobo-users+...@googlegroups.com.

To post to this group, send email to kobo-...@googlegroups.com.

Visit this group at https://groups.google.com/group/kobo-users.

For more options, visit https://groups.google.com/d/optout.

You received this message because you are subscribed to the Google Groups “Kobo Users” group.

To unsubscribe from this group and stop receiving emails from it, send an email to kobo-users+...@googlegroups.com.

To post to this group, send email to kobo-...@googlegroups.com.

Visit this group at https://groups.google.com/group/kobo-users.

For more options, visit https://groups.google.com/d/optout.

As Jesaja noted the problem seems to relate to the use of $(name) inside the group. The (name)$ in Arabic may be the problem. There was also a known bug in using constraints inside repeat groups (which I think was fixed) so I wonder if this is the same issue?

Simple tests would be to change the Arabic first. If that does not work, remove $(name) from every question, just as a test.

···

Hi Alexander,

Hi Tino,

I was able to reproduce the problem. I have attached a XML file that can be used to reproduce. The last question that is displayed before the crash happens is “How many direct relatives are abroad? (related to the respondent)”, so it’s definitely something inside the following repeat that leads to the crash. To reproduce, fill the survey with minimum data to get it completed and into the instances.db of KoboCollect, by answering e.g.

Beirut → Beirut → Mazraa foncière → 1 → random date → random time → 1 → 101 → 200 → No → No one in my household is Lebanese → Complete → random time

When you save the survey, it will create a folder with a XML file inside on your device, e.g.

/sdcard/odk/instances/Poverty Survey v2_2016-07-16_13-57-04/Poverty Survey v2_2016-07-16_13-57-04.xml

Replace this XML with the one I have attached to reproduce the crash, by renaming it to the name of the XML file on your device, and then placing it into the folder, e.g.

adb push Poverty\ Survey\ v2_2016-07-16_13-57-04.xml /sdcard/odk/instances/Poverty\ Survey\ v2_2016-07-16_13-57-04/

If you now edit the saved survey, it will use the replaced XML and will crash at the repeat.

Here is the Android logcat output:

E/InputEventReceiver(25442): Exception dispatching input event.

D/AndroidRuntime(25442): Shutting down VM

E/AndroidRuntime(25442): FATAL EXCEPTION: main

E/AndroidRuntime(25442): Process: org.koboc.collect.android, PID: 25442

E/AndroidRuntime(25442): java.lang.NullPointerException: Attempt to invoke virtual method ‘java.lang.String java.lang.String.replaceAll(java.lang.String, java.lang.String)’ on a null object reference

E/AndroidRuntime(25442): at org.koboc.collect.android.utilities.TextUtils.markdownToHtml(TextUtils.java:35)

E/AndroidRuntime(25442): at org.koboc.collect.android.utilities.TextUtils.textToHtml(TextUtils.java:108)

E/AndroidRuntime(25442): at org.koboc.collect.android.views.HierarchyElementView.setPrimaryText(HierarchyElementView.java:75)

E/AndroidRuntime(25442): at org.koboc.collect.android.adapters.HierarchyListAdapter.getView(HierarchyListAdapter.java:64)

E/AndroidRuntime(25442): at android.widget.AbsListView.obtainView(AbsListView.java:2349)

E/AndroidRuntime(25442): at android.widget.ListView.makeAndAddView(ListView.java:1864)

E/AndroidRuntime(25442): at android.widget.ListView.fillDown(ListView.java:698)

E/AndroidRuntime(25442): at android.widget.ListView.fillGap(ListView.java:662)

E/AndroidRuntime(25442): at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5007)

E/AndroidRuntime(25442): at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3424)

E/AndroidRuntime(25442): at android.widget.AbsListView.onTouchMove(AbsListView.java:3807)

E/AndroidRuntime(25442): at android.widget.AbsListView.onTouchEvent(AbsListView.java:3638)

E/AndroidRuntime(25442): at android.view.View.dispatchTouchEvent(View.java:8480)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2400)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2093)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)

E/AndroidRuntime(25442): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2625)

E/AndroidRuntime(25442): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1770)

E/AndroidRuntime(25442): at android.app.Activity.dispatchTouchEvent(Activity.java:2742)

E/AndroidRuntime(25442): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2586)

E/AndroidRuntime(25442): at android.view.View.dispatchPointerEvent(View.java:8675)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4129)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3995)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3550)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3603)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3569)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3686)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3577)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3743)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3550)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3603)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3569)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3577)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3550)

E/AndroidRuntime(25442): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5813)

E/AndroidRuntime(25442): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5787)

E/AndroidRuntime(25442): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5758)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5903)

E/AndroidRuntime(25442): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)

E/AndroidRuntime(25442): at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)

E/AndroidRuntime(25442): at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176)

E/AndroidRuntime(25442): at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:5874)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java

W/ActivityManager( 2163): Force finishing activity 1 org.koboc.collect.android/.activities.FormHierarchyActivity

So it looks like the app encounters a string that doesn’t exist when it tries to replace something. Unfortunately I don’t have time to look into this further right now.

My hunch is that it may be related to the ${NAME} variable sometimes existing in the default language, but not in Arabic and vice versa, e.g. “Current educational attainment:” and “Did ${NAME} work for wage (cash or in-kind) even for one hour during last week?”.

I would try to make sure that ${NAME} is used equally in both languages, maybe that already fixes the form.

@Tino: Actually we have a QA use-case as well. What do you think about using the “_status” attribute for this? It could be set to “submitted” per default, and next to the “edit” and “delete” buttons in Enketo there could be “approve” and “reject” buttons that just change this attribute. That would be a quick way to implement something like a simple workflow for reviewing forms.

Best Regards,

Jesaja

On Sat, Jul 16, 2016 at 12:33 PM, Tino Kreutzer tino.k...@kobotoolbox.org wrote:

Hi Alexandra,

I wasn’t able to reproduce the issue on my end yet using your form. Since you say it’s only happening when you review the form content after saving the draft (and based on some repeat group responses), it seems that you should be able to submit them though.

I assume this never happened in training / piloting? If there are specific steps you know will always reproduce the issue please let us know.

Can you modify the work flow so that your teams submit the data without the secondary verification?

Best,

Tino

On Fri, Jul 15, 2016, 20:41 alexandra irani alexand...@gmail.com wrote:

I am part of a research team working on a nationwide poverty survey in Lebanon. We’ve finalized the form and tested it with a group of 70 data collectors.

The form works well except for the fact that after we save it and try to review the filled questions on the tablet, we get the following error: “Unfortunately, KoboCollect has stopped”.

I attached a screen shot of it and of the form we are using. This is very problematic as supervisors will be reviewing the filled data on a daily basis with data collectors before the forms are submitted.

The survey starts on July 18 and the team is working hard on trying to fix the error in our form. We’ve noticed that the error is definitely related to our repeated groups, since once we remove them the error goes away.

Is anyone able to help us in finding a way to keep the repeated groups and solve the error to be able to review the forms and edit them?

Thank you,

Alexandra

You received this message because you are subscribed to the Google Groups “Kobo Users” group.

To unsubscribe from this group and stop receiving emails from it, send an email to kobo-users+unsu...@googlegroups.com.

To post to this group, send email to
kobo-...@googlegroups.com.

Visit this group at
https://groups.google.com/group/kobo-users
.

For more options, visit
https://groups.google.com/d/optout
.

You received this message because you are subscribed to the Google Groups “Kobo Users” group.

To unsubscribe from this group and stop receiving emails from it, send an email to kobo-users+unsu...@googlegroups.com.

To post to this group, send email to
kobo-...@googlegroups.com.

Visit this group at
https://groups.google.com/group/kobo-users
.

For more options, visit
https://groups.google.com/d/optout
.

You received this message because you are subscribed to the Google Groups “Kobo Users” group.

To unsubscribe from this group and stop receiving emails from it, send an email to kobo-users+unsu...@googlegroups.com.

To post to this group, send email to
kobo-...@googlegroups.com.

Visit this group at
https://groups.google.com/group/kobo-users
.

For more options, visit
https://groups.google.com/d/optout
.

Just to show what I meant with my suggestions regarding the “_status” attribute above, I have attached a screenshot. What do you think?

Sorry for hijacking your thread Alexandra, hope you get the form working with Patrick’s and my suggestions. :slight_smile:

···

On Sat, Jul 16, 2016 at 3:15 PM, Vinck, Patrick pvi...@hsph.harvard.edu wrote:

As Jesaja noted the problem seems to relate to the use of $(name) inside the group. The (name)$ in Arabic may be the problem. There was also a known bug in using constraints inside repeat groups (which I think was fixed) so I wonder if this is the same issue?

Simple tests would be to change the Arabic first. If that does not work, remove $(name) from every question, just as a test.

From: kobo-...@googlegroups.com [mailto:kobo-...@googlegroups.com] On Behalf Of Jesaja Everling

Sent: Saturday, July 16, 2016 7:37 AM

To: kobo-...@googlegroups.com

Subject: Re: [KoBo Users] Urgent: Recurrent Kobocollect error when reviewing form

Hi Alexander,

Hi Tino,

I was able to reproduce the problem. I have attached a XML file that can be used to reproduce. The last question that is displayed before the crash happens is “How many direct relatives are abroad? (related to the respondent)”, so it’s definitely something inside the following repeat that leads to the crash. To reproduce, fill the survey with minimum data to get it completed and into the instances.db of KoboCollect, by answering e.g.

Beirut → Beirut → Mazraa foncière → 1 → random date → random time → 1 → 101 → 200 → No → No one in my household is Lebanese → Complete → random time

When you save the survey, it will create a folder with a XML file inside on your device, e.g.

/sdcard/odk/instances/Poverty Survey v2_2016-07-16_13-57-04/Poverty Survey v2_2016-07-16_13-57-04.xml

Replace this XML with the one I have attached to reproduce the crash, by renaming it to the name of the XML file on your device, and then placing it into the folder, e.g.

adb push Poverty\ Survey\ v2_2016-07-16_13-57-04.xml /sdcard/odk/instances/Poverty\ Survey\ v2_2016-07-16_13-57-04/

If you now edit the saved survey, it will use the replaced XML and will crash at the repeat.

Here is the Android logcat output:

E/InputEventReceiver(25442): Exception dispatching input event.

D/AndroidRuntime(25442): Shutting down VM

E/AndroidRuntime(25442): FATAL EXCEPTION: main

E/AndroidRuntime(25442): Process: org.koboc.collect.android, PID: 25442

E/AndroidRuntime(25442): java.lang.NullPointerException: Attempt to invoke virtual method ‘java.lang.String java.lang.String.replaceAll(java.lang.String, java.lang.String)’ on a null object reference

E/AndroidRuntime(25442): at org.koboc.collect.android.utilities.TextUtils.markdownToHtml(TextUtils.java:35)

E/AndroidRuntime(25442): at org.koboc.collect.android.utilities.TextUtils.textToHtml(TextUtils.java:108)

E/AndroidRuntime(25442): at org.koboc.collect.android.views.HierarchyElementView.setPrimaryText(HierarchyElementView.java:75)

E/AndroidRuntime(25442): at org.koboc.collect.android.adapters.HierarchyListAdapter.getView(HierarchyListAdapter.java:64)

E/AndroidRuntime(25442): at android.widget.AbsListView.obtainView(AbsListView.java:2349)

E/AndroidRuntime(25442): at android.widget.ListView.makeAndAddView(ListView.java:1864)

E/AndroidRuntime(25442): at android.widget.ListView.fillDown(ListView.java:698)

E/AndroidRuntime(25442): at android.widget.ListView.fillGap(ListView.java:662)

E/AndroidRuntime(25442): at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5007)

E/AndroidRuntime(25442): at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3424)

E/AndroidRuntime(25442): at android.widget.AbsListView.onTouchMove(AbsListView.java:3807)

E/AndroidRuntime(25442): at android.widget.AbsListView.onTouchEvent(AbsListView.java:3638)

E/AndroidRuntime(25442): at android.view.View.dispatchTouchEvent(View.java:8480)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2400)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2093)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)

E/AndroidRuntime(25442): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2625)

E/AndroidRuntime(25442): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1770)

E/AndroidRuntime(25442): at android.app.Activity.dispatchTouchEvent(Activity.java:2742)

E/AndroidRuntime(25442): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2586)

E/AndroidRuntime(25442): at android.view.View.dispatchPointerEvent(View.java:8675)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4129)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3995)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3550)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3603)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3569)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3686)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3577)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3743)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3550)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3603)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3569)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3577)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3550)

E/AndroidRuntime(25442): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5813)

E/AndroidRuntime(25442): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5787)

E/AndroidRuntime(25442): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5758)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5903)

E/AndroidRuntime(25442): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)

E/AndroidRuntime(25442): at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)

E/AndroidRuntime(25442): at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176)

E/AndroidRuntime(25442): at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:5874)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java

W/ActivityManager( 2163): Force finishing activity 1 org.koboc.collect.android/.activities.FormHierarchyActivity

So it looks like the app encounters a string that doesn’t exist when it tries to replace something. Unfortunately I don’t have time to look into this further right now.

My hunch is that it may be related to the ${NAME} variable sometimes existing in the default language, but not in Arabic and vice versa, e.g. “Current educational attainment:” and “Did ${NAME} work for wage (cash or in-kind) even for one hour during last week?”.

I would try to make sure that ${NAME} is used equally in both languages, maybe that already fixes the form.

@Tino: Actually we have a QA use-case as well. What do you think about using the “_status” attribute for this? It could be set to “submitted” per default, and next to the “edit” and “delete” buttons in Enketo there could be “approve” and “reject” buttons that just change this attribute. That would be a quick way to implement something like a simple workflow for reviewing forms.

Best Regards,

Jesaja

On Sat, Jul 16, 2016 at 12:33 PM, Tino Kreutzer tino.k...@kobotoolbox.org wrote:

Hi Alexandra,

I wasn’t able to reproduce the issue on my end yet using your form. Since you say it’s only happening when you review the form content after saving the draft (and based on some repeat group responses), it seems that you should be able to submit them though.

I assume this never happened in training / piloting? If there are specific steps you know will always reproduce the issue please let us know.

Can you modify the work flow so that your teams submit the data without the secondary verification?

Best,

Tino

On Fri, Jul 15, 2016, 20:41 alexandra irani alexand...@gmail.com wrote:

I am part of a research team working on a nationwide poverty survey in Lebanon. We’ve finalized the form and tested it with a group of 70 data collectors.

The form works well except for the fact that after we save it and try to review the filled questions on the tablet, we get the following error: “Unfortunately, KoboCollect has stopped”.

I attached a screen shot of it and of the form we are using. This is very problematic as supervisors will be reviewing the filled data on a daily basis with data collectors before the forms are submitted.

The survey starts on July 18 and the team is working hard on trying to fix the error in our form. We’ve noticed that the error is definitely related to our repeated groups, since once we remove them the error goes away.

Is anyone able to help us in finding a way to keep the repeated groups and solve the error to be able to review the forms and edit them?

Thank you,

Alexandra

You received this message because you are subscribed to the Google Groups “Kobo Users” group.

To unsubscribe from this group and stop receiving emails from it, send an email to kobo-users+...@googlegroups.com.

To post to this group, send email to
kobo-...@googlegroups.com.

Visit this group at
https://groups.google.com/group/kobo-users
.

For more options, visit
https://groups.google.com/d/optout
.

You received this message because you are subscribed to the Google Groups “Kobo Users” group.

To unsubscribe from this group and stop receiving emails from it, send an email to kobo-users+...@googlegroups.com.

To post to this group, send email to
kobo-...@googlegroups.com.

Visit this group at
https://groups.google.com/group/kobo-users
.

For more options, visit
https://groups.google.com/d/optout
.

You received this message because you are subscribed to the Google Groups “Kobo Users” group.

To unsubscribe from this group and stop receiving emails from it, send an email to kobo-users+...@googlegroups.com.

To post to this group, send email to
kobo-...@googlegroups.com.

Visit this group at
https://groups.google.com/group/kobo-users
.

For more options, visit
https://groups.google.com/d/optout
.

You received this message because you are subscribed to the Google Groups “Kobo Users” group.

To unsubscribe from this group and stop receiving emails from it, send an email to kobo-users+...@googlegroups.com.

To post to this group, send email to kobo-...@googlegroups.com.

Visit this group at https://groups.google.com/group/kobo-users.

For more options, visit https://groups.google.com/d/optout.

Dear Jesaja, Patrick and Tino,

I really appreciate your instant help and feedback!

I’ve tried making sure that “Name” is consistently added in the English and Arabic versions of the question but the error persists. I am going to try and remove the questions related to direct family members abroad and keep as a last resort removing “Name” from the question as this facilitates the lives of data collectors and respondents tremendously.

Will get back with feedback in a few minutes.

Thanks again,

Alex

···

On Sat, Jul 16, 2016 at 3:25 PM, Jesaja Everling jeve...@gmail.com wrote:

Just to show what I meant with my suggestions regarding the “_status” attribute above, I have attached a screenshot. What do you think?

Sorry for hijacking your thread Alexandra, hope you get the form working with Patrick’s and my suggestions. :slight_smile:

You received this message because you are subscribed to a topic in the Google Groups “Kobo Users” group.

To unsubscribe from this topic, visit https://groups.google.com/d/topic/kobo-users/XDxTt5vkLKo/unsubscribe.

To unsubscribe from this group and all its topics, send an email to kobo-users+...@googlegroups.com.

To post to this group, send email to kobo-...@googlegroups.com.

Visit this group at https://groups.google.com/group/kobo-users.

For more options, visit https://groups.google.com/d/optout.

Alexandra Irani

Project Manager
AUB-UNDP Rapid Poverty Assessment for Lebanon

American University of Beirut/FAFS
Riad El-Solh 1107-2020
Beirut - Lebanon
Phone: +961 1 350 000 ext 4426, +961 3 327561

E-mail: alexand...@gmail.com

On Sat, Jul 16, 2016 at 3:15 PM, Vinck, Patrick pvi...@hsph.harvard.edu wrote:

As Jesaja noted the problem seems to relate to the use of $(name) inside the group. The (name)$ in Arabic may be the problem. There was also a known bug in using constraints inside repeat groups (which I think was fixed) so I wonder if this is the same issue?

Simple tests would be to change the Arabic first. If that does not work, remove $(name) from every question, just as a test.

From: kobo-...@googlegroups.com [mailto:kobo-...@googlegroups.com] On Behalf Of Jesaja Everling

Sent: Saturday, July 16, 2016 7:37 AM

To: kobo-...@googlegroups.com

Subject: Re: [KoBo Users] Urgent: Recurrent Kobocollect error when reviewing form

Hi Alexander,

Hi Tino,

I was able to reproduce the problem. I have attached a XML file that can be used to reproduce. The last question that is displayed before the crash happens is “How many direct relatives are abroad? (related to the respondent)”, so it’s definitely something inside the following repeat that leads to the crash. To reproduce, fill the survey with minimum data to get it completed and into the instances.db of KoboCollect, by answering e.g.

Beirut → Beirut → Mazraa foncière → 1 → random date → random time → 1 → 101 → 200 → No → No one in my household is Lebanese → Complete → random time

When you save the survey, it will create a folder with a XML file inside on your device, e.g.

/sdcard/odk/instances/Poverty Survey v2_2016-07-16_13-57-04/Poverty Survey v2_2016-07-16_13-57-04.xml

Replace this XML with the one I have attached to reproduce the crash, by renaming it to the name of the XML file on your device, and then placing it into the folder, e.g.

adb push Poverty\ Survey\ v2_2016-07-16_13-57-04.xml /sdcard/odk/instances/Poverty\ Survey\ v2_2016-07-16_13-57-04/

If you now edit the saved survey, it will use the replaced XML and will crash at the repeat.

Here is the Android logcat output:

E/InputEventReceiver(25442): Exception dispatching input event.

D/AndroidRuntime(25442): Shutting down VM

E/AndroidRuntime(25442): FATAL EXCEPTION: main

E/AndroidRuntime(25442): Process: org.koboc.collect.android, PID: 25442

E/AndroidRuntime(25442): java.lang.NullPointerException: Attempt to invoke virtual method ‘java.lang.String java.lang.String.replaceAll(java.lang.String, java.lang.String)’ on a null object reference

E/AndroidRuntime(25442): at org.koboc.collect.android.utilities.TextUtils.markdownToHtml(TextUtils.java:35)

E/AndroidRuntime(25442): at org.koboc.collect.android.utilities.TextUtils.textToHtml(TextUtils.java:108)

E/AndroidRuntime(25442): at org.koboc.collect.android.views.HierarchyElementView.setPrimaryText(HierarchyElementView.java:75)

E/AndroidRuntime(25442): at org.koboc.collect.android.adapters.HierarchyListAdapter.getView(HierarchyListAdapter.java:64)

E/AndroidRuntime(25442): at android.widget.AbsListView.obtainView(AbsListView.java:2349)

E/AndroidRuntime(25442): at android.widget.ListView.makeAndAddView(ListView.java:1864)

E/AndroidRuntime(25442): at android.widget.ListView.fillDown(ListView.java:698)

E/AndroidRuntime(25442): at android.widget.ListView.fillGap(ListView.java:662)

E/AndroidRuntime(25442): at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5007)

E/AndroidRuntime(25442): at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3424)

E/AndroidRuntime(25442): at android.widget.AbsListView.onTouchMove(AbsListView.java:3807)

E/AndroidRuntime(25442): at android.widget.AbsListView.onTouchEvent(AbsListView.java:3638)

E/AndroidRuntime(25442): at android.view.View.dispatchTouchEvent(View.java:8480)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2400)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2093)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)

E/AndroidRuntime(25442): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)

E/AndroidRuntime(25442): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2625)

E/AndroidRuntime(25442): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1770)

E/AndroidRuntime(25442): at android.app.Activity.dispatchTouchEvent(Activity.java:2742)

E/AndroidRuntime(25442): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2586)

E/AndroidRuntime(25442): at android.view.View.dispatchPointerEvent(View.java:8675)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4129)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3995)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3550)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3603)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3569)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3686)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3577)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3743)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3550)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3603)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3569)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3577)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3550)

E/AndroidRuntime(25442): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5813)

E/AndroidRuntime(25442): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5787)

E/AndroidRuntime(25442): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5758)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5903)

E/AndroidRuntime(25442): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)

E/AndroidRuntime(25442): at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)

E/AndroidRuntime(25442): at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176)

E/AndroidRuntime(25442): at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:5874)

E/AndroidRuntime(25442): at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java

W/ActivityManager( 2163): Force finishing activity 1 org.koboc.collect.android/.activities.FormHierarchyActivity

So it looks like the app encounters a string that doesn’t exist when it tries to replace something. Unfortunately I don’t have time to look into this further right now.

My hunch is that it may be related to the ${NAME} variable sometimes existing in the default language, but not in Arabic and vice versa, e.g. “Current educational attainment:” and “Did ${NAME} work for wage (cash or in-kind) even for one hour during last week?”.

I would try to make sure that ${NAME} is used equally in both languages, maybe that already fixes the form.

@Tino: Actually we have a QA use-case as well. What do you think about using the “_status” attribute for this? It could be set to “submitted” per default, and next to the “edit” and “delete” buttons in Enketo there could be “approve” and “reject” buttons that just change this attribute. That would be a quick way to implement something like a simple workflow for reviewing forms.

Best Regards,

Jesaja

On Sat, Jul 16, 2016 at 12:33 PM, Tino Kreutzer tino.k...@kobotoolbox.org wrote:

Hi Alexandra,

I wasn’t able to reproduce the issue on my end yet using your form. Since you say it’s only happening when you review the form content after saving the draft (and based on some repeat group responses), it seems that you should be able to submit them though.

I assume this never happened in training / piloting? If there are specific steps you know will always reproduce the issue please let us know.

Can you modify the work flow so that your teams submit the data without the secondary verification?

Best,

Tino

On Fri, Jul 15, 2016, 20:41 alexandra irani alexand...@gmail.com wrote:

I am part of a research team working on a nationwide poverty survey in Lebanon. We’ve finalized the form and tested it with a group of 70 data collectors.

The form works well except for the fact that after we save it and try to review the filled questions on the tablet, we get the following error: “Unfortunately, KoboCollect has stopped”.

I attached a screen shot of it and of the form we are using. This is very problematic as supervisors will be reviewing the filled data on a daily basis with data collectors before the forms are submitted.

The survey starts on July 18 and the team is working hard on trying to fix the error in our form. We’ve noticed that the error is definitely related to our repeated groups, since once we remove them the error goes away.

Is anyone able to help us in finding a way to keep the repeated groups and solve the error to be able to review the forms and edit them?

Thank you,

Alexandra

You received this message because you are subscribed to the Google Groups “Kobo Users” group.

To unsubscribe from this group and stop receiving emails from it, send an email to kobo-users+...@googlegroups.com.

To post to this group, send email to
kobo-...@googlegroups.com.

Visit this group at
https://groups.google.com/group/kobo-users
.

For more options, visit
https://groups.google.com/d/optout
.

You received this message because you are subscribed to the Google Groups “Kobo Users” group.

To unsubscribe from this group and stop receiving emails from it, send an email to kobo-users+...@googlegroups.com.

To post to this group, send email to
kobo-...@googlegroups.com.

Visit this group at
https://groups.google.com/group/kobo-users
.

For more options, visit
https://groups.google.com/d/optout
.

You received this message because you are subscribed to the Google Groups “Kobo Users” group.

To unsubscribe from this group and stop receiving emails from it, send an email to kobo-users+...@googlegroups.com.

To post to this group, send email to
kobo-...@googlegroups.com.

Visit this group at
https://groups.google.com/group/kobo-users
.

For more options, visit
https://groups.google.com/d/optout
.

You received this message because you are subscribed to the Google Groups “Kobo Users” group.

To unsubscribe from this group and stop receiving emails from it, send an email to kobo-users+...@googlegroups.com.

To post to this group, send email to kobo-...@googlegroups.com.

Visit this group at https://groups.google.com/group/kobo-users.

For more options, visit https://groups.google.com/d/optout.