ankidroid / Anki-Android

AnkiDroid: Anki flashcards on Android. Your secret trick to achieve superhuman information retention.
GNU General Public License v3.0
8.59k stars 2.22k forks source link

Crash 2.15.0beta1 CardTemplateEditor$CardTemplateFragment.getCurrentTemplate #8822

Closed mikehardy closed 3 years ago

mikehardy commented 3 years ago
Reproduction Steps

Unfortunately nothing in the logcat on this report, so it will have to be deduced from the crash trace working backwards

This was seen on 2.15alpha48 but I don't remember this code changing before beta, it should still be a valid issue

Expected Result

Never crashes ever

Actual Result
com.ichi2.utils.JSONException: org.json.JSONException: Index 2 out of range [0..2)
at com.ichi2.utils.JSONArray.get(JSONArray.java:2)
at org.json.JSONArray.getJSONObject(JSONArray.java:523)
at com.ichi2.utils.JSONArray.getJSONObject(JSONArray.java:2)
at com.ichi2.anki.CardTemplateEditor$CardTemplateFragment.getCurrentTemplate(CardTemplateEditor.java:2)
at com.ichi2.anki.CardTemplateEditor$CardTemplateFragment.onCreateOptionsMenu(CardTemplateEditor.java:7)
at androidx.fragment.app.Fragment.performCreateOptionsMenu(Fragment.java:3)
at androidx.fragment.app.FragmentManager.dispatchCreateOptionsMenu(FragmentManager.java:3)
at androidx.fragment.app.FragmentController.dispatchCreateOptionsMenu(FragmentController.java:1)
at androidx.fragment.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:2)
at androidx.appcompat.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:1)
at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.onCreatePanelMenu(AppCompatDelegateImpl.java:2)
at androidx.appcompat.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:1)
at androidx.appcompat.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:5)
at androidx.appcompat.app.ToolbarActionBar$1.run(ToolbarActionBar.java:1)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1010)
at android.view.Choreographer.doCallbacks(Choreographer.java:809)
at android.view.Choreographer.doFrame(Choreographer.java:740)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:995)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8512)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
Debug info
-- | --
ANDROID_VERSION | 11
APP_VERSION_CODE | 321500148
APP_VERSION_NAME | 2.15alpha48
AVAILABLE_MEM_SIZE | 182676721664
BRAND | samsung
BUILD | BOARDexynos9820BOOTLOADERG977NKSU4FUCDBRANDsamsungCPU_ABIarm64-v8aCPU_ABI2DEVICEbeyondx | BOARD | exynos9820 | BOOTLOADER | G977NKSU4FUCD | BRAND | samsung | CPU_ABI | arm64-v8a | CPU_ABI2 |   | DEVICE | beyondx
BOARD | exynos9820
BOOTLOADER | G977NKSU4FUCD
BRAND | samsung
CPU_ABI | arm64-v8a
CPU_ABI2 |  
DEVICE | beyondx
Research

Enter an [x] character to confirm the points below:

Akshay0701 commented 3 years ago

~I am not able to reproduce this crash now.~

Akshay0701 commented 3 years ago

in method onCreateOptionsMenu we are directly fetching from json without any exception handling

JSONObject template = getCurrentTemplate();

    private JSONObject getCurrentTemplate() {
                int currentCardTemplateIndex = getCurrentCardTemplateIndex();
                return mTemplateEditor.getTempModel().getModel().getJSONArray("tmpls").getJSONObject(currentCardTemplateIndex);
            }

I think this is the main cause