/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.messaging.datamodel.action; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; import android.provider.Telephony.Threads; import android.provider.Telephony.ThreadsColumns; import com.android.messaging.Factory; import com.android.messaging.mmslib.SqliteWrapper; import com.android.messaging.util.DebugUtils; import com.android.messaging.util.LogUtil; public class LogTelephonyDatabaseAction extends Action implements Parcelable { // Because we use sanitizePII, we should also use BUGLE_TAG private static final String TAG = LogUtil.BUGLE_TAG; private static final String[] ALL_THREADS_PROJECTION = { Threads._ID, Threads.DATE, Threads.MESSAGE_COUNT, Threads.RECIPIENT_IDS, Threads.SNIPPET, Threads.SNIPPET_CHARSET, Threads.READ, Threads.ERROR, Threads.HAS_ATTACHMENT }; // Constants from the Telephony Database private static final int ID = 0; private static final int DATE = 1; private static final int MESSAGE_COUNT = 2; private static final int RECIPIENT_IDS = 3; private static final int SNIPPET = 4; private static final int SNIPPET_CHAR_SET = 5; private static final int READ = 6; private static final int ERROR = 7; private static final int HAS_ATTACHMENT = 8; /** * Log telephony data to logcat */ public static void dumpDatabase() { final LogTelephonyDatabaseAction action = new LogTelephonyDatabaseAction(); action.start(); } private LogTelephonyDatabaseAction() { } @Override protected Object executeAction() { final Context context = Factory.get().getApplicationContext(); if (!DebugUtils.isDebugEnabled()) { LogUtil.e(TAG, "Can't log telephony database unless debugging is enabled"); return null; } if (!LogUtil.isLoggable(TAG, LogUtil.DEBUG)) { LogUtil.w(TAG, "Can't log telephony database unless DEBUG is turned on for TAG: " + TAG); return null; } LogUtil.d(TAG, "\n"); LogUtil.d(TAG, "Dump of canoncial_addresses table"); LogUtil.d(TAG, "*********************************"); Cursor cursor = SqliteWrapper.query(context, context.getContentResolver(), Uri.parse("content://mms-sms/canonical-addresses"), null, null, null, null); if (cursor == null) { LogUtil.w(TAG, "null Cursor in content://mms-sms/canonical-addresses"); } else { try { while (cursor.moveToNext()) { long id = cursor.getLong(0); String number = cursor.getString(1); LogUtil.d(TAG, LogUtil.sanitizePII("id: " + id + " number: " + number)); } } finally { cursor.close(); } } LogUtil.d(TAG, "\n"); LogUtil.d(TAG, "Dump of threads table"); LogUtil.d(TAG, "*********************"); cursor = SqliteWrapper.query(context, context.getContentResolver(), Threads.CONTENT_URI.buildUpon().appendQueryParameter("simple", "true").build(), ALL_THREADS_PROJECTION, null, null, "date ASC"); try { while (cursor.moveToNext()) { LogUtil.d(TAG, LogUtil.sanitizePII("threadId: " + cursor.getLong(ID) + " " + ThreadsColumns.DATE + " : " + cursor.getLong(DATE) + " " + ThreadsColumns.MESSAGE_COUNT + " : " + cursor.getInt(MESSAGE_COUNT) + " " + ThreadsColumns.SNIPPET + " : " + cursor.getString(SNIPPET) + " " + ThreadsColumns.READ + " : " + cursor.getInt(READ) + " " + ThreadsColumns.ERROR + " : " + cursor.getInt(ERROR) + " " + ThreadsColumns.HAS_ATTACHMENT + " : " + cursor.getInt(HAS_ATTACHMENT) + " " + ThreadsColumns.RECIPIENT_IDS + " : " + cursor.getString(RECIPIENT_IDS))); } } finally { cursor.close(); } return null; } private LogTelephonyDatabaseAction(final Parcel in) { super(in); } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { @Override public LogTelephonyDatabaseAction createFromParcel(final Parcel in) { return new LogTelephonyDatabaseAction(in); } @Override public LogTelephonyDatabaseAction[] newArray(final int size) { return new LogTelephonyDatabaseAction[size]; } }; @Override public void writeToParcel(final Parcel parcel, final int flags) { writeActionToParcel(parcel, flags); } }