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

Commit 804ebf75 authored by Steve McKay's avatar Steve McKay Committed by android-build-merger
Browse files

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

am: a3b936aa

* commit 'a3b936aa':
  Guard against NPE in equals checks.
parents babb1ca5 a3b936aa
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;