OSDN Git Service

Fixed ApnEditor crash issue
authorPengquan Meng <mpq@google.com>
Wed, 11 Apr 2018 19:53:03 +0000 (12:53 -0700)
committerPengquan Meng <mpq@google.com>
Sat, 14 Apr 2018 00:55:15 +0000 (17:55 -0700)
This root caused is that we closed the managed cursor which lifecycle is
managed by Activity.

Actually, we don't need the managed cursor in this case, just use the
normal cursor and close it after we got the apn data from the database.

Bug: 77894798
Test: make ROBOTEST_FILTER=ApnEditorTest -j40 RunSettingsRoboTests
Change-Id: I6eb80bbd53354e00e871e974f520668dcbceac63

src/com/android/settings/network/ApnEditor.java
tests/robotests/src/com/android/settings/network/ApnEditorTest.java

index 61f1243..d0ecb71 100644 (file)
@@ -1195,12 +1195,19 @@ public class ApnEditor extends SettingsPreferenceFragment
         }
     }
 
-    private ApnData getApnDataFromUri(Uri uri) {
-        ApnData apnData;
-        try (Cursor cursor = getActivity().managedQuery(
-                uri, sProjection, null /* selection */, null /* sortOrder */)) {
-            cursor.moveToFirst();
-            apnData = new ApnData(uri, cursor);
+    @VisibleForTesting
+    ApnData getApnDataFromUri(Uri uri) {
+        ApnData apnData = null;
+        try (Cursor cursor = getContentResolver().query(
+                uri,
+                sProjection,
+                null /* selection */,
+                null /* selectionArgs */,
+                null /* sortOrder */)) {
+            if (cursor != null) {
+                cursor.moveToFirst();
+                apnData = new ApnData(uri, cursor);
+            }
         }
 
         if (apnData == null) {
index f3315e5..1b34fd3 100644 (file)
@@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 
@@ -116,6 +117,24 @@ public class ApnEditorTest {
     }
 
     @Test
+    public void testApnEditor_doesNotUseManagedQuery() {
+        mApnEditorUT.getApnDataFromUri(Mockito.mock(Uri.class));
+
+        verify(mActivity, never()).managedQuery(
+                any(Uri.class),
+                any(String[].class),
+                any(String.class),
+                any(String.class));
+
+        verify(mActivity, never()).managedQuery(
+                any(Uri.class),
+                any(String[].class),
+                any(String.class),
+                any(String[].class),
+                any(String.class));
+  }
+
+    @Test
     public void testSetStringValue_valueChanged_shouldSetValue() {
         // GIVEN an APN value which is different than the APN value in database
         final String apnKey = "apn";