Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 558cdbd2 authored by Tony Huang's avatar Tony Huang
Browse files

Fix crash bug about photo picking

1. Add null check on isPhotoPiching because apps might send null
   mine type extra.
2. Add min check of column count in getSpanSize to avoid the size
   larger than it column count.

Fix: 129136569
Fix: 129138063
Test: manual
Test: atest DocumentsUIGoogleTest
Change-Id: I7da4c3f181b6a3d07e538b9dba687a6866ed83ae
parent 19a67e20
Loading
Loading
Loading
Loading
+3 −2
Original line number Original line Diff line number Diff line
@@ -16,12 +16,13 @@


package com.android.documentsui.base;
package com.android.documentsui.base;


import androidx.annotation.IntDef;
import android.content.Intent;
import android.content.Intent;
import android.os.Parcel;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Parcelable;
import android.util.SparseArray;
import android.util.SparseArray;


import androidx.annotation.IntDef;

import com.android.documentsui.services.FileOperationService;
import com.android.documentsui.services.FileOperationService;
import com.android.documentsui.services.FileOperationService.OpType;
import com.android.documentsui.services.FileOperationService.OpType;
import com.android.documentsui.sorting.SortModel;
import com.android.documentsui.sorting.SortModel;
@@ -130,7 +131,7 @@ public class State implements android.os.Parcelable {
     * @return True, if acceptMimes are all image type and action is file picking.
     * @return True, if acceptMimes are all image type and action is file picking.
     */
     */
    public boolean isPhotoPicking() {
    public boolean isPhotoPicking() {
        if (action != ACTION_GET_CONTENT && action != ACTION_OPEN) {
        if (action != ACTION_GET_CONTENT && action != ACTION_OPEN || acceptMimes == null) {
            return false;
            return false;
        }
        }


+6 −3
Original line number Original line Diff line number Diff line
@@ -16,9 +16,10 @@


package com.android.documentsui.dirlist;
package com.android.documentsui.dirlist;


import android.view.ViewGroup;

import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver;
import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver;
import android.view.ViewGroup;


import com.android.documentsui.Model;
import com.android.documentsui.Model;
import com.android.documentsui.Model.Update;
import com.android.documentsui.Model.Update;
@@ -72,17 +73,19 @@ final class DirectoryAddonsAdapter extends DocumentsAdapter {
        return new GridLayoutManager.SpanSizeLookup() {
        return new GridLayoutManager.SpanSizeLookup() {
            @Override
            @Override
            public int getSpanSize(int position) {
            public int getSpanSize(int position) {
                final int columnCount = mEnv.getColumnCount();
                // Make layout whitespace span the grid. This has the effect of breaking
                // Make layout whitespace span the grid. This has the effect of breaking
                // grid rows whenever layout whitespace is encountered.
                // grid rows whenever layout whitespace is encountered.
                if (getItemViewType(position) == ITEM_TYPE_SECTION_BREAK
                if (getItemViewType(position) == ITEM_TYPE_SECTION_BREAK
                        || getItemViewType(position) == ITEM_TYPE_HEADER_MESSAGE
                        || getItemViewType(position) == ITEM_TYPE_HEADER_MESSAGE
                        || getItemViewType(position) == ITEM_TYPE_INFLATED_MESSAGE) {
                        || getItemViewType(position) == ITEM_TYPE_INFLATED_MESSAGE) {
                    return mEnv.getColumnCount();
                    return columnCount;
                } else if (mEnv.getDisplayState().isPhotoPicking()
                } else if (mEnv.getDisplayState().isPhotoPicking()
                        && mEnv.getDisplayState().derivedMode == State.MODE_GRID) {
                        && mEnv.getDisplayState().derivedMode == State.MODE_GRID) {
                    // If on photo picking state and grid mode,
                    // If on photo picking state and grid mode,
                    // the UI should show 3 images a row or 2 folders a row.
                    // the UI should show 3 images a row or 2 folders a row.
                    return getItemViewType(position) == ITEM_TYPE_DIRECTORY ? 3 : 2;
                    return getItemViewType(position) == ITEM_TYPE_DIRECTORY
                            ? Math.min(columnCount, 3) : Math.min(columnCount, 2);
                } else {
                } else {
                    return 1;
                    return 1;
                }
                }
+7 −6
Original line number Original line Diff line number Diff line
@@ -22,9 +22,6 @@ import static com.android.documentsui.base.SharedMinimal.VERBOSE;
import static com.android.documentsui.base.State.MODE_GRID;
import static com.android.documentsui.base.State.MODE_GRID;
import static com.android.documentsui.base.State.MODE_LIST;
import static com.android.documentsui.base.State.MODE_LIST;


import androidx.annotation.DimenRes;
import androidx.annotation.FractionRes;
import androidx.annotation.IntDef;
import android.app.ActivityManager;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Context;
import android.content.Intent;
import android.content.Intent;
@@ -47,6 +44,9 @@ import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.ImageView;


import androidx.annotation.DimenRes;
import androidx.annotation.FractionRes;
import androidx.annotation.IntDef;
import androidx.annotation.Nullable;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentActivity;
@@ -56,8 +56,8 @@ import androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails;
import androidx.recyclerview.selection.MutableSelection;
import androidx.recyclerview.selection.MutableSelection;
import androidx.recyclerview.selection.Selection;
import androidx.recyclerview.selection.Selection;
import androidx.recyclerview.selection.SelectionTracker;
import androidx.recyclerview.selection.SelectionTracker;
import androidx.recyclerview.selection.StorageStrategy;
import androidx.recyclerview.selection.SelectionTracker.SelectionPredicate;
import androidx.recyclerview.selection.SelectionTracker.SelectionPredicate;
import androidx.recyclerview.selection.StorageStrategy;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup;
import androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView;
@@ -166,6 +166,7 @@ public class DirectoryFragment extends Fragment implements SwipeRefreshLayout.On
    private DocumentClipper mClipper;
    private DocumentClipper mClipper;
    private GridLayoutManager mLayout;
    private GridLayoutManager mLayout;
    private int mColumnCount = 1;  // This will get updated when layout changes.
    private int mColumnCount = 1;  // This will get updated when layout changes.
    private int mColumnUnit = 1;


    private float mLiveScale = 1.0f;
    private float mLiveScale = 1.0f;
    private @ViewMode int mMode;
    private @ViewMode int mMode;
@@ -597,8 +598,8 @@ public class DirectoryFragment extends Fragment implements SwipeRefreshLayout.On
        // Clamp so that we always lay out the grid with at least 2 columns by default.
        // Clamp so that we always lay out the grid with at least 2 columns by default.
        // If on photo picking state, the UI should show 3 images a row or 2 folders a row,
        // If on photo picking state, the UI should show 3 images a row or 2 folders a row,
        // so use 6 columns by default and set folder size to 3 and document size is to 2.
        // so use 6 columns by default and set folder size to 3 and document size is to 2.
        int minColumnCount = mState.isPhotoPicking() ? 6 : 2;
        mColumnUnit = mState.isPhotoPicking() ? 3 : 1;
        int columnCount = Math.max(minColumnCount,
        int columnCount = mColumnUnit * Math.max(2,
                (mRecView.getWidth() - viewPadding) / (cellWidth + cellMargin));
                (mRecView.getWidth() - viewPadding) / (cellWidth + cellMargin));


        // Finally with our grid count logic firmly in place, we apply any live scaling
        // Finally with our grid count logic firmly in place, we apply any live scaling
+10 −0
Original line number Original line Diff line number Diff line
@@ -133,4 +133,14 @@ public class StateTest {


        assertFalse(mState.isPhotoPicking());
        assertFalse(mState.isPhotoPicking());
    }
    }

    @Test
    public void testPhotoPicking_nullExrta() {
        final String[] mimeTypes = null;
        mIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
        mState.initAcceptMimes(mIntent, "*/*");
        mState.action = State.ACTION_GET_CONTENT;

        assertFalse(mState.isPhotoPicking());
    }
}
}