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

Commit a3b936aa authored by Steve McKay's avatar Steve McKay Committed by Android (Google) Code Review
Browse files

Merge "Guard against NPE in equals checks." into nyc-dev

parents 05bdf88b 30551a25
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -536,7 +536,11 @@ public class DirectoryFragment extends Fragment implements DocumentsAdapter.Envi
        @Override
        public void onItemStateChanged(String modelId, boolean selected) {
            final Cursor cursor = mModel.getItem(modelId);
            checkNotNull(cursor, "Cursor cannot be null.");
            if (cursor == null) {
                Log.e(TAG, "Model returned null cursor for document: " + modelId
                        + ". Ignoring state changed event.");
                return;
            }

            // TODO: Should this be happening in onSelectionChanged? Technically this callback is
            // triggered on "silent" selection updates (i.e. we might be reacting to unfinalized
+15 −7
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.ProtocolException;
import java.text.Collator;
import java.util.Objects;

/**
 * Representation of a {@link Document}.
@@ -263,16 +264,23 @@ public class DocumentInfo implements Durable, Parcelable {
        return derivedUri.hashCode() + mimeType.hashCode();
    }

    public boolean equals(Object other) {
        if (this == other) {
            return true;
        } else if (!(other instanceof DocumentInfo)) {
    public boolean equals(Object o) {
        if (o == null) {
            return false;
        }

        DocumentInfo that = (DocumentInfo) other;
        if (this == o) {
            return true;
        }

        if (o instanceof DocumentInfo) {
            DocumentInfo other = (DocumentInfo) o;
            // Uri + mime type should be totally unique.
        return derivedUri.equals(that.derivedUri) && mimeType.equals(that.mimeType);
            return Objects.equals(derivedUri, other.derivedUri)
                    && Objects.equals(mimeType, other.mimeType);
        }

        return false;
    }

    public static String getCursorString(Cursor cursor, String columnName) {
+13 −4
Original line number Diff line number Diff line
@@ -276,12 +276,21 @@ public class RootInfo implements Durable, Parcelable {

    @Override
    public boolean equals(Object o) {
        if (o instanceof RootInfo) {
            final RootInfo root = (RootInfo) o;
            return Objects.equals(authority, root.authority) && Objects.equals(rootId, root.rootId);
        } else {
        if (o == null) {
            return false;
        }

        if (this == o) {
            return true;
        }

        if (o instanceof RootInfo) {
            RootInfo other = (RootInfo) o;
            return Objects.equals(authority, other.authority)
                    && Objects.equals(rootId, other.rootId);
        }

        return false;
    }

    @Override
+39 −13
Original line number Diff line number Diff line
@@ -23,18 +23,44 @@ import com.android.documentsui.model.DocumentInfo;

@SmallTest
public class StateTest extends AndroidTestCase {
    public void testPushDocument() {
        final State state = new State();
        final DocumentInfo infoFirst = new DocumentInfo();
        infoFirst.displayName = "firstDirectory";
        final DocumentInfo infoSecond = new DocumentInfo();
        infoSecond.displayName = "secondDirectory";
        assertFalse(state.hasLocationChanged());
        state.pushDocument(infoFirst);
        state.pushDocument(infoSecond);
        assertTrue(state.hasLocationChanged());
        assertEquals("secondDirectory", state.stack.getFirst().displayName);
        state.popDocument();
        assertEquals("firstDirectory", state.stack.getFirst().displayName);

    private static final DocumentInfo DIR_1;
    private static final DocumentInfo DIR_2;

    private State mState;

    static {
        DIR_1 = new DocumentInfo();
        DIR_1.displayName = "firstDirectory";
        DIR_2 = new DocumentInfo();
        DIR_2.displayName = "secondDirectory";
    }

    @Override
    protected void setUp() throws Exception {
        mState = new State();
    }

    public void testInitialStateEmpty() {
        assertFalse(mState.hasLocationChanged());
    }

    public void testPushDocument_ChangesLocation() {
        mState.pushDocument(DIR_1);
        mState.pushDocument(DIR_2);
        assertTrue(mState.hasLocationChanged());
    }

    public void testPushDocument_ModifiesStack() {
        mState.pushDocument(DIR_1);
        mState.pushDocument(DIR_2);
        assertEquals(DIR_2, mState.stack.getFirst());
    }

    public void testPopDocument_ModifiesStack() {
        mState.pushDocument(DIR_1);
        mState.pushDocument(DIR_2);
        mState.popDocument();
        assertEquals(DIR_1, mState.stack.getFirst());
    }
}
+18 −12
Original line number Diff line number Diff line
@@ -22,30 +22,36 @@ import android.test.suitebuilder.annotation.SmallTest;
@SmallTest
public class DocumentInfoTest extends AndroidTestCase {

    private static final DocumentInfo TEST_DOC
            = createDocInfo("authority.a", "doc.1", "text/plain");

    public void testEquals() throws Exception {
        DocumentInfo doc = createDocInfo("authority.a", "doc.1", "text/plain");
        assertEquals(doc, doc);
        assertEquals(TEST_DOC, TEST_DOC);
        assertEquals(TEST_DOC, createDocInfo("authority.a", "doc.1", "text/plain"));
    }

    public void testEquals_HandlesNulls() throws Exception {
        assertFalse(TEST_DOC.equals(null));
    }

    public void testEquals_HandlesNullFields() throws Exception {
        assertFalse(TEST_DOC.equals(new DocumentInfo()));
        assertFalse(new DocumentInfo().equals(TEST_DOC));
    }

    public void testNotEquals_differentAuthority() throws Exception {
        DocumentInfo docA = createDocInfo("authority.a", "doc.1", "text/plain");
        DocumentInfo docB = createDocInfo("authority.b", "doc.1", "text/plain");
        assertFalse(docA.equals(docB));
        assertFalse(TEST_DOC.equals(createDocInfo("authority.b", "doc.1", "text/plain")));
    }

    public void testNotEquals_differentDocId() throws Exception {
        DocumentInfo docA = createDocInfo("authority.a", "doc.1", "text/plain");
        DocumentInfo docB = createDocInfo("authority.a", "doc.2", "text/plain");
        assertFalse(docA.equals(docB));
        assertFalse(TEST_DOC.equals(createDocInfo("authority.a", "doc.2", "text/plain")));
    }

    public void testNotEquals_differentMimetype() throws Exception {
        DocumentInfo docA = createDocInfo("authority.a", "doc.1", "text/plain");
        DocumentInfo docB = createDocInfo("authority.a", "doc.1", "image/png");
        assertFalse(docA.equals(docB));
        assertFalse(TEST_DOC.equals(createDocInfo("authority.a", "doc.1", "image/png")));
    }

    private DocumentInfo createDocInfo(String authority, String docId, String mimeType) {
    private static DocumentInfo createDocInfo(String authority, String docId, String mimeType) {
        DocumentInfo doc = new DocumentInfo();
        doc.authority = authority;
        doc.documentId = docId;