Merge "Added dump for TelephonyProvider"
diff --git a/src/com/android/providers/telephony/TelephonyProvider.java b/src/com/android/providers/telephony/TelephonyProvider.java
index 4b0f2b4..ce76521 100644
--- a/src/com/android/providers/telephony/TelephonyProvider.java
+++ b/src/com/android/providers/telephony/TelephonyProvider.java
@@ -108,6 +108,7 @@
 import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.provider.Telephony;
+import android.service.carrier.IApnSourceService;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.telephony.TelephonyProtoEnums;
@@ -116,41 +117,42 @@
 import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.AtomicFile;
+import android.util.IndentingPrintWriter;
+import android.util.LocalLog;
 import android.util.Log;
 import android.util.Pair;
 import android.util.Xml;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.telephony.PhoneFactory;
 import com.android.internal.telephony.TelephonyStatsLog;
 import com.android.internal.util.XmlUtils;
-import android.service.carrier.IApnSourceService;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.FileDescriptor;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.InputStream;
-import java.lang.Integer;
+import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
-import java.util.zip.CheckedInputStream;
 import java.util.zip.CRC32;
+import java.util.zip.CheckedInputStream;
 
 public class TelephonyProvider extends ContentProvider
 {
@@ -281,6 +283,8 @@
 
     private boolean mManagedApnEnforced;
 
+    private final LocalLog mLocalLog = new LocalLog(128);
+
     /**
      * Mobile country codes where there is a high likelyhood that the MNC has 3 digits
      * and need one more prefix zero to set correct mobile network code value.
@@ -3041,13 +3045,6 @@
     @Override
     public boolean onCreate() {
         mOpenHelper = new DatabaseHelper(getContext());
-
-        try {
-            PhoneFactory.addLocalLog(TAG, 64);
-        } catch (IllegalArgumentException e) {
-            // ignore
-        }
-
         boolean isNewBuild = false;
         String newBuildId = SystemProperties.get("ro.build.id", null);
         SharedPreferences sp = getContext().getSharedPreferences(BUILD_ID_FILE,
@@ -3117,9 +3114,9 @@
         }
     }
 
-    private static void localLog(String logMsg) {
+    private void localLog(String logMsg) {
         Log.d(TAG, logMsg);
-        PhoneFactory.localLog(TAG, logMsg);
+        mLocalLog.log(logMsg);
     }
 
     private synchronized boolean isManagedApnEnforced() {
@@ -5452,4 +5449,72 @@
                     new String[]{subId});
         }
     }
+
+    /**
+     * Dump the database table.
+     *
+     * @param tableName Table name.
+     * @param pw Print writer.
+     */
+    private void dumpTable(@NonNull String tableName, @NonNull IndentingPrintWriter pw) {
+        try (Cursor cursor = getReadableDatabase().query(false, tableName, null,
+                null, null, null, null, null, null)) {
+            pw.println(tableName + " table:");
+            pw.increaseIndent();
+            while (cursor != null && cursor.moveToNext()) {
+                List<String> columnStrings = new ArrayList<>();
+                String str = "";
+                for (int i = 0; i < cursor.getColumnCount(); i++) {
+                    str = cursor.getColumnName(i) + "=";
+                    int type = cursor.getType(i);
+                    try {
+                        switch (type) {
+                            case 0 /*FIELD_TYPE_NULL*/:
+                                str += "null";
+                                break;
+                            case 1 /*FIELD_TYPE_INTEGER*/:
+                                str += cursor.getInt(i);
+                                break;
+                            case 2 /*FIELD_TYPE_FLOAT*/:
+                                str += cursor.getFloat(i);
+                                break;
+                            case 3 /*FIELD_TYPE_STRING*/:
+                                str += cursor.getString(i);
+                                break;
+                            case 4 /*FIELD_TYPE_BLOB*/:
+                                str += "[blob]";
+                                break;
+                            default:
+                                str += "unknown";
+                                break;
+                        }
+                    } catch (Exception e) {
+                        str += "exception";
+                    }
+                    columnStrings.add(str);
+                }
+                pw.println(TextUtils.join(", ", columnStrings));
+            }
+            pw.decreaseIndent();
+        } catch (Exception ex) {
+            pw.println("Exception while dumping the table " + tableName + ", ex=" + ex);
+        }
+    }
+
+    @Override
+    public void dump(FileDescriptor fd, PrintWriter printWriter, String[] args) {
+        IndentingPrintWriter pw = new IndentingPrintWriter(printWriter, "  ");
+        pw.println(TAG + ":");
+        pw.increaseIndent();
+        pw.println("Database:");
+        pw.increaseIndent();
+        dumpTable(SIMINFO_TABLE, pw);
+        dumpTable(CARRIERS_TABLE, pw);
+        pw.decreaseIndent();
+        pw.println("Local log:");
+        pw.increaseIndent();
+        mLocalLog.dump(pw);
+        pw.decreaseIndent();
+        pw.decreaseIndent();
+    }
 }