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

[BUG]: App got stuck during a student playthrough #5568

Open
seanlip opened this issue Nov 5, 2024 · 2 comments
Open

[BUG]: App got stuck during a student playthrough #5568

seanlip opened this issue Nov 5, 2024 · 2 comments
Labels
bug End user-perceivable behaviors which are not desirable. Impact: Medium Moderate perceived user impact (non-blocking bugs and general improvements). Work: Low Solution is clear and broken into good-first-issue-sized chunks.

Comments

@seanlip
Copy link
Member

seanlip commented Nov 5, 2024

Describe the bug

We received a report from a UXR study that the app hung in the middle of a lesson and the student wasn't able to go ahead. See screenshot below:

Screenshot from 2024-11-05 15-01-43

The learner spent some time retrying again and again, and was able to go ahead. (It's not stated what they actually did, but I assume they might have picked other options).

Steps To Reproduce

Not sure. This information was not provided in the report, but the question in the screenshot is from Fractions.

Expected Behavior

If a response is selected, the submit button should not be disabled.

Screenshots/Videos

Screenshot from 2024-11-05 15-01-43

What device/emulator are you using?

Not known

Which Android version is your device/emulator running?

Not known

Which version of the Oppia Android app are you using?

0.13-beta-dcde7b359e

Additional Context

No response

@seanlip seanlip added bug End user-perceivable behaviors which are not desirable. triage needed labels Nov 5, 2024
@adhiamboperes adhiamboperes added Impact: Medium Moderate perceived user impact (non-blocking bugs and general improvements). Work: Low Solution is clear and broken into good-first-issue-sized chunks. and removed triage needed labels Nov 5, 2024
@agallop
Copy link

agallop commented Dec 24, 2024

Hey @seanlip, I want to contribute to Oppia android and I started trying to reproduce this (with no success), but I compile what I've looked at myself. Maybe it'll be helpful if it gets reproduced. I've only been able to disabled the button when it is expected to be disabled.

Screenshot_20241223-163536

It looks like the submit button is enabled by default and only gets disabled when an error is shown.

StateFragmentPresenter.kt:455

  /** Updates submit button UI as active if pendingAnswerError null else inactive. */
  fun updateSubmitButton(pendingAnswerError: String?, inputAnswerAvailable: Boolean) {
    if (inputAnswerAvailable) {
      stateViewModel.setCanSubmitAnswer(pendingAnswerError == null)
    } else {
      stateViewModel.setCanSubmitAnswer(canSubmitAnswer = false)
    }
  }

inputAnswerAvailable looks to set to true in the callsites I looked at.

I noticed the code above gets called twice when selecting an answer when the button is disabled. I would expect it to only update once, but i don't know if that's important

Stack trace 1

at org.oppia.android.app.player.state.StateFragmentPresenter.updateSubmitButton(StateFragmentPresenter.kt:463)
at org.oppia.android.app.player.state.StateFragment.onPendingAnswerErrorOrAvailabilityCheck(StateFragment.kt:143)
at org.oppia.android.app.player.state.itemviewmodel.SelectionInteractionViewModel$callback$1.onPropertyChanged(SelectionInteractionViewModel.kt:101)
at androidx.databinding.PropertyChangeRegistry$1.onNotifyCallback(PropertyChangeRegistry.java:30)
at androidx.databinding.PropertyChangeRegistry$1.onNotifyCallback(PropertyChangeRegistry.java:26)
at androidx.databinding.CallbackRegistry.notifyCallbacks(CallbackRegistry.java:201)
at androidx.databinding.CallbackRegistry.notifyFirst64(CallbackRegistry.java:122)
at androidx.databinding.CallbackRegistry.notifyRemainder(CallbackRegistry.java:169)
at androidx.databinding.CallbackRegistry.notifyRecurse(CallbackRegistry.java:145)
at androidx.databinding.CallbackRegistry.notifyCallbacks(CallbackRegistry.java:91)
at androidx.databinding.BaseObservable.notifyChange(BaseObservable.java:60)
at androidx.databinding.ObservableField.set(ObservableField.java:92)
at org.oppia.android.app.player.state.itemviewmodel.SelectionInteractionViewModel.checkPendingAnswerError(SelectionInteractionViewModel.kt:180)
at org.oppia.android.app.player.state.itemviewmodel.SelectionInteractionViewModel.updateSelection(SelectionInteractionViewModel.kt:206)
at org.oppia.android.app.player.state.itemviewmodel.SelectionInteractionContentViewModel.handleItemClicked(SelectionInteractionContentViewModel.kt:20)
at org.oppia.android.databinding.MultipleChoiceInteractionItemsBindingImpl._internalCallbackOnClick(MultipleChoiceInteractionItemsBindingImpl.java:234)
at org.oppia.android.generated.callback.OnClickListener.onClick(OnClickListener.java:11)
at android.view.View.performClick(View.java:7931)
at android.view.View.performClickInternal(View.java:7908)
at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
at android.view.View$PerformClick.run(View.java:30990)
at android.os.Handler.handleCallback(Handler.java:959)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loopOnce(Looper.java:232)
at android.os.Looper.loop(Looper.java:317)
at android.app.ActivityThread.main(ActivityThread.java:8592)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:878)

Stack trace 2

at org.oppia.android.app.player.state.StateFragmentPresenter.updateSubmitButton(StateFragmentPresenter.kt:463)
at org.oppia.android.app.player.state.StateFragment.onPendingAnswerErrorOrAvailabilityCheck(StateFragment.kt:143)
at org.oppia.android.app.player.state.itemviewmodel.SelectionInteractionViewModel$callback$1.onPropertyChanged(SelectionInteractionViewModel.kt:101)
at androidx.databinding.PropertyChangeRegistry$1.onNotifyCallback(PropertyChangeRegistry.java:30)
at androidx.databinding.PropertyChangeRegistry$1.onNotifyCallback(PropertyChangeRegistry.java:26)
at androidx.databinding.CallbackRegistry.notifyCallbacks(CallbackRegistry.java:201)
at androidx.databinding.CallbackRegistry.notifyFirst64(CallbackRegistry.java:122)
at androidx.databinding.CallbackRegistry.notifyRemainder(CallbackRegistry.java:169)
at androidx.databinding.CallbackRegistry.notifyRecurse(CallbackRegistry.java:145)
at androidx.databinding.CallbackRegistry.notifyCallbacks(CallbackRegistry.java:91)
at androidx.databinding.BaseObservable.notifyChange(BaseObservable.java:60)
at androidx.databinding.ObservableField.set(ObservableField.java:92)
at org.oppia.android.app.player.state.itemviewmodel.SelectionInteractionViewModel.updateIsAnswerAvailable(SelectionInteractionViewModel.kt:276)
at org.oppia.android.app.player.state.itemviewmodel.SelectionInteractionViewModel.updateSelection(SelectionInteractionViewModel.kt:220)
at org.oppia.android.app.player.state.itemviewmodel.SelectionInteractionContentViewModel.handleItemClicked(SelectionInteractionContentViewModel.kt:20)
at org.oppia.android.databinding.MultipleChoiceInteractionItemsBindingImpl._internalCallbackOnClick(MultipleChoiceInteractionItemsBindingImpl.java:234)
at org.oppia.android.generated.callback.OnClickListener.onClick(OnClickListener.java:11)
at android.view.View.performClick(View.java:7931)
at android.view.View.performClickInternal(View.java:7908)
at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
at android.view.View$PerformClick.run(View.java:30990)
at android.os.Handler.handleCallback(Handler.java:959)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loopOnce(Looper.java:232)
at android.os.Looper.loop(Looper.java:317)
at android.app.ActivityThread.main(ActivityThread.java:8592)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:878)

Some of the ways (not exhaustive) i tried to break it are:

  • Rotate the phone screen to make the activity reload from state
  • Minimizing the app and reopen
  • interact with the hint popup (since it's in the screenshot) while the button is disabled.
  • Get to this part in lesson, switch users, and go back to the lesson.

Side note, I noticed whie trying to break it is that the radio buttons are able to go from one selected to no selected, which is odd for a radio button. The radio buttons on the web app seem to function as expected.
https://github.com/user-attachments/assets/ae5f1c23-217c-4a0d-8da7-00422731224d

@BenHenning
Copy link
Member

This needs investigation before it can be fixed, and we need to release 0.14 in the next few days. Bumping to the next release milestone.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug End user-perceivable behaviors which are not desirable. Impact: Medium Moderate perceived user impact (non-blocking bugs and general improvements). Work: Low Solution is clear and broken into good-first-issue-sized chunks.
Development

No branches or pull requests

4 participants