From 90e0ff0884432c79cb12c039a663ee43d465c95d Mon Sep 17 00:00:00 2001 From: Tomasz Mikolajewski Date: Thu, 7 Apr 2016 11:12:07 +0900 Subject: [PATCH] Do not crash when selecting a lot of files. Bug: 27208679 Change-Id: I3763e190bf8a014274895a349b9739672f3e2224 --- .../dirlist/DirectoryFragment.java | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java index 20316fff31b4d..85164572d795a 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java @@ -44,6 +44,7 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; +import android.os.Parcel; import android.os.Parcelable; import android.provider.DocumentsContract; import android.provider.DocumentsContract.Document; @@ -224,7 +225,8 @@ public class DirectoryFragment extends Fragment mStateKey = buildStateKey(mRoot, mDocument); mQuery = args.getString(Shared.EXTRA_QUERY); mType = args.getInt(Shared.EXTRA_TYPE); - mSelection = args.getParcelable(Shared.EXTRA_SELECTION); + final Selection selection = args.getParcelable(Shared.EXTRA_SELECTION); + mSelection = selection != null ? selection : new Selection(); mSearchMode = args.getBoolean(Shared.EXTRA_SEARCH_MODE); mIconHelper = new IconHelper(context, MODE_GRID); @@ -288,14 +290,25 @@ public class DirectoryFragment extends Fragment outState.putParcelable(Shared.EXTRA_ROOT, mRoot); outState.putParcelable(Shared.EXTRA_DOC, mDocument); outState.putString(Shared.EXTRA_QUERY, mQuery); - outState.putParcelable(Shared.EXTRA_SELECTION, mSelection); - outState.putBoolean(Shared.EXTRA_SEARCH_MODE, mSearchMode); + // Workaround. To avoid crash, write only up to 512 KB of selection. + // If more files are selected, then the selection will be lost. + final Parcel parcel = Parcel.obtain(); + try { + mSelection.writeToParcel(parcel, 0); + if (parcel.dataSize() <= 512 * 1024) { + outState.putParcelable(Shared.EXTRA_SELECTION, mSelection); + } + } finally { + parcel.recycle(); + } + + outState.putBoolean(Shared.EXTRA_SEARCH_MODE, mSearchMode); } @Override public void onActivityResult(@RequestCode int requestCode, int resultCode, Intent data) { - switch(requestCode) { + switch (requestCode) { case REQUEST_COPY_DESTINATION: handleCopyResult(resultCode, data); break;