Skip to content

Commit

Permalink
Fix several bugs, especially an IndexOutOfBoundsException issue.
Browse files Browse the repository at this point in the history
The root cause was the length of `listNovelItemInfo` was not always matching the length of `listNovelItemAid`.

Full stack trace:

```
          Fatal Exception: java.lang.IndexOutOfBoundsException: Index 7 out of bounds for length 7
       at jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
       at jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
       at jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266)
       at java.util.Objects.checkIndex(Objects.java:359)
       at java.util.ArrayList.get(ArrayList.java:434)
       at org.mewx.wenku8.fragment.FavFragment$1$2.onPositive(FavFragment.java:50)
       at com.afollestad.materialdialogs.MaterialDialog.onClick(MaterialDialog.java:69)
       at android.view.View.performClick(View.java:8043)
       at android.widget.TextView.performClick(TextView.java:17816)
       at android.view.View.performClickInternal(View.java:8020)
       at android.view.View.-$$Nest$mperformClickInternal()
       at android.view.View$PerformClick.run(View.java:31850)
       at android.os.Handler.handleCallback(Handler.java:958)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loopOnce(Looper.java:230)
       at android.os.Looper.loop(Looper.java:319)
       at android.app.ActivityThread.main(ActivityThread.java:8893)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:608)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)
```
  • Loading branch information
MewX committed Jul 24, 2024
1 parent 00a102d commit 8726482
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,8 @@ public class FavFragment extends Fragment implements MyItemClickListener, MyItem
private int timecount;

// novel list info
private List<Integer> listNovelItemAid = null; // aid list
private List<NovelItemInfoUpdate> listNovelItemInfo = null; // info list
private final List<Integer> listNovelItemAid = new ArrayList<>(); // aid list
private final List<NovelItemInfoUpdate> listNovelItemInfo = new ArrayList<>(); // info list

public static FavFragment newInstance() {
return new FavFragment();
Expand Down Expand Up @@ -100,7 +100,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
mRecyclerView.setLayoutManager(mLayoutManager);

mSwipeRefreshLayout.setColorSchemeColors(getResources().getColor(R.color.myAccentColor));
mSwipeRefreshLayout.setOnRefreshListener(() -> new AsyncLoadAllCloud().execute(1));
mSwipeRefreshLayout.setOnRefreshListener(() -> new AsyncLoadAllFromCloud().execute(1));

return rootView;
}
Expand All @@ -112,7 +112,7 @@ public void onItemClick(View view, int position) {
intent.putExtra("aid", listNovelItemAid.get(position));
intent.putExtra("from", "fav");
intent.putExtra("title", ((TextView) view.findViewById(R.id.novel_title)).getText());
GlobalConfig.accessToLocalBookshelf(listNovelItemAid.get(position)); // sort event
GlobalConfig.moveBookToTheTopOfBookshelf(listNovelItemAid.get(position)); // sort event

if(Build.VERSION.SDK_INT < 21) {
startActivity(intent);
Expand Down Expand Up @@ -151,11 +151,9 @@ public void onSelection(MaterialDialog dialog, View view, int which, CharSequenc
public void onPositive(MaterialDialog dialog) {
super.onPositive(dialog);
int aid = listNovelItemAid.get(position);
List<VolumeList> listVolume;
String novelFullVolume;
novelFullVolume = GlobalConfig.loadFullFileFromSaveFolder("intro", aid + "-volume.xml");
String novelFullVolume = GlobalConfig.loadFullFileFromSaveFolder("intro", aid + "-volume.xml");
if(novelFullVolume.isEmpty()) return;
listVolume = Wenku8Parser.getVolumeList(novelFullVolume);
List<VolumeList> listVolume = Wenku8Parser.getVolumeList(novelFullVolume);
if(listVolume.isEmpty()) return;
cleanVolumesCache(listVolume);
}
Expand All @@ -173,10 +171,11 @@ public void onPositive(MaterialDialog dialog) {
@Override
public void onPositive(MaterialDialog dialog) {
super.onPositive(dialog);
// delete operation, delete from cloud first, if succeed then delete from local
AsyncRemoveBookFromCloud arbfc = new AsyncRemoveBookFromCloud();
arbfc.execute(listNovelItemAid.get(position));
// Delete operation: delete from in-memory index and cloud first.
// Then, the async task will remove the deleted book from local bookshelf.
int aid = listNovelItemAid.get(position);
listNovelItemAid.remove(position);
new AsyncRemoveBookFromCloud().execute(aid);
refreshList(timecount ++);
}
})
Expand Down Expand Up @@ -207,7 +206,7 @@ private void cleanVolumesCache(List<VolumeList> listVolume) {
private void refreshList(int time) {
if(time == 0) {
mSwipeRefreshLayout.setRefreshing(true);
new AsyncLoadAllCloud().execute();
new AsyncLoadAllFromCloud().execute();
}
else {
loadAllLocal();
Expand All @@ -219,17 +218,15 @@ private void loadAllLocal() {
boolean datasetChanged = false;

// init
listNovelItemAid = GlobalConfig.getLocalBookshelfList();
if (listNovelItemInfo == null) {
listNovelItemInfo = new ArrayList<>();
}
listNovelItemAid.clear();
listNovelItemAid.addAll(GlobalConfig.getLocalBookshelfList());

// load all meta file
// load all metadata file
aids:
for (int j = 0; j < listNovelItemAid.size(); j++) {
final Integer aid = listNovelItemAid.get(j);
int aid = listNovelItemAid.get(j);
// See if it's in the list already. Expecting the list will not be more than 100.
for (int i = 0; i < listNovelItemInfo.size(); i++) {
for (int i = j; i < listNovelItemInfo.size(); i++) {
final NovelItemInfoUpdate info = listNovelItemInfo.get(i);
if (info.aid == aid) {
// Found but in the same place.
Expand Down Expand Up @@ -257,6 +254,10 @@ private void loadAllLocal() {
datasetChanged = true;
listNovelItemInfo.add(j, info);
}
// Trim everything after aid.size().
if (listNovelItemInfo.size() > listNovelItemAid.size()) {
listNovelItemInfo.subList(listNovelItemAid.size(), listNovelItemInfo.size()).clear();
}

// result
if(retValue != 0) {
Expand All @@ -278,7 +279,7 @@ private void loadAllLocal() {
mSwipeRefreshLayout.setRefreshing(false);
}

private class AsyncLoadAllCloud extends AsyncTask<Integer, Integer, Wenku8Error.ErrorCode> {
private class AsyncLoadAllFromCloud extends AsyncTask<Integer, Integer, Wenku8Error.ErrorCode> {
private MaterialDialog md;
private boolean isLoading; // check in "doInBackground" to make sure to continue or not
private boolean forceLoad = false;
Expand Down Expand Up @@ -526,11 +527,9 @@ protected Wenku8Error.ErrorCode doInBackground(Integer... params) {
return Wenku8Error.ErrorCode.SYSTEM_1_SUCCEEDED;
} else {
return Wenku8Error.ErrorCode.LOCAL_BOOK_REMOVE_FAILED;
//Toast.makeText(NovelInfoActivity.this, getResources().getString(R.string.bookshelf_error), Toast.LENGTH_SHORT).show();
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return Wenku8Error.ErrorCode.BYTE_TO_STRING_EXCEPTION;
}
}
Expand All @@ -540,11 +539,12 @@ protected void onPostExecute(Wenku8Error.ErrorCode err) {
super.onPostExecute(err);

md.dismiss();
if(err == Wenku8Error.ErrorCode.SYSTEM_1_SUCCEEDED) {
if (err == Wenku8Error.ErrorCode.SYSTEM_1_SUCCEEDED) {
Toast.makeText(getActivity(), getResources().getString(R.string.bookshelf_removed), Toast.LENGTH_SHORT).show();
}
else
loadAllLocal();
} else {
Toast.makeText(getActivity(), err.toString(), Toast.LENGTH_SHORT).show();
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -362,12 +362,14 @@ public static void addToLocalBookshelf(int aid) {
}

public static void removeFromLocalBookshelf(int aid) {
if (bookshelf == null)
if (bookshelf == null) {
loadLocalBookShelf();
}

int i = bookshelf.indexOf(aid);
if (i != -1)
if (i != -1) {
bookshelf.remove(i);
}

writeLocalBookShelf();
}
Expand All @@ -380,18 +382,20 @@ public static ArrayList<Integer> getLocalBookshelfList() {
}

public static boolean testInLocalBookshelf(int aid) {
if (bookshelf == null)
if (bookshelf == null) {
loadLocalBookShelf();
}

return bookshelf.indexOf(aid) != -1;
return bookshelf.contains(aid);
}

public static void accessToLocalBookshelf(int aid) {
int temp = bookshelf.indexOf(aid);
if (aid == -1)
public static void moveBookToTheTopOfBookshelf(int aid) {
int i = bookshelf.indexOf(aid);
if (i == -1) {
return;
}

bookshelf.remove(temp);
bookshelf.remove(i);
bookshelf.add(0, aid);

writeLocalBookShelf();
Expand Down

0 comments on commit 8726482

Please sign in to comment.