From b17ef6f91e4de3fd6f71dc165489db62c0160c13 Mon Sep 17 00:00:00 2001 From: Chaohui Wang Date: Wed, 28 Jun 2023 19:13:42 +0800 Subject: [PATCH] Fix cursor is empty in ApnEditor If cursor.moveToFirst() returns false, the cursor is empty which cause crash. Check whether the curse is empty to fix. Fix: 288716180 Test: manual - on ApnEditor page Test: m RunSettingsRoboTests Change-Id: If850cd3feca3d3d520a653c2490d1049a8a87fdc --- .../settings/network/apn/ApnEditor.java | 3 +-- .../settings/network/apn/ApnEditorTest.java | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/network/apn/ApnEditor.java b/src/com/android/settings/network/apn/ApnEditor.java index 25d8e841a9c..68855f0cfa8 100644 --- a/src/com/android/settings/network/apn/ApnEditor.java +++ b/src/com/android/settings/network/apn/ApnEditor.java @@ -1440,8 +1440,7 @@ public class ApnEditor extends SettingsPreferenceFragment null /* selection */, null /* selectionArgs */, null /* sortOrder */)) { - if (cursor != null) { - cursor.moveToFirst(); + if (cursor != null && cursor.moveToFirst()) { apnData = new ApnData(uri, cursor); } } diff --git a/tests/robotests/src/com/android/settings/network/apn/ApnEditorTest.java b/tests/robotests/src/com/android/settings/network/apn/ApnEditorTest.java index f03b6d8cad3..242ec682f88 100644 --- a/tests/robotests/src/com/android/settings/network/apn/ApnEditorTest.java +++ b/tests/robotests/src/com/android/settings/network/apn/ApnEditorTest.java @@ -17,6 +17,7 @@ package com.android.settings.network.apn; import static com.google.common.truth.Truth.assertThat; + import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; @@ -27,6 +28,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.content.ContentResolver; import android.content.ContentValues; @@ -41,15 +43,18 @@ import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; + import androidx.fragment.app.FragmentActivity; import androidx.preference.EditTextPreference; import androidx.preference.ListPreference; import androidx.preference.MultiSelectListPreference; import androidx.preference.SwitchPreference; + import com.android.settings.R; import com.android.settings.network.ProxySubscriptionManager; import com.android.settings.network.apn.ApnEditor.ApnData; import com.android.settings.testutils.shadow.ShadowFragment; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -156,6 +161,19 @@ public class ApnEditorTest { any(String.class)); } + @Test + public void getApnDataFromUri_emptyCursor_returnsNull() { + var mockContentResolver = mock(ContentResolver.class); + var mockCursor = mock(Cursor.class); + doReturn(mockContentResolver).when(mActivity).getContentResolver(); + when(mockContentResolver.query(any(), any(), any(), any(), any())).thenReturn(mockCursor); + when(mockCursor.moveToFirst()).thenReturn(false); + + var apnData = mApnEditorUT.getApnDataFromUri(mock(Uri.class)); + + assertThat(apnData).isNull(); + } + @Test public void testSetStringValue_valueChanged_shouldSetValue() { // GIVEN an APN value which is different than the APN value in database