1d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/* 2d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Copyright (C) 2015 The Android Open Source Project 3d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 4d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Licensed under the Apache License, Version 2.0 (the "License"); 5d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * you may not use this file except in compliance with the License. 6d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * You may obtain a copy of the License at 7d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 8d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * http://www.apache.org/licenses/LICENSE-2.0 9d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 10d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Unless required by applicable law or agreed to in writing, software 11d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * distributed under the License is distributed on an "AS IS" BASIS, 12d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * See the License for the specific language governing permissions and 14d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * limitations under the License. 15d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 16d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 17d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpackage com.android.messaging.datamodel.action; 18d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 19d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.content.Context; 20d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.database.Cursor; 21d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.net.Uri; 22d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.os.Parcel; 23d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.os.Parcelable; 24d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.provider.Telephony.Threads; 25d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.provider.Telephony.ThreadsColumns; 26d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 27d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.Factory; 28d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.mmslib.SqliteWrapper; 29d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.DebugUtils; 30d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.LogUtil; 31d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 32d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpublic class LogTelephonyDatabaseAction extends Action implements Parcelable { 33d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // Because we use sanitizePII, we should also use BUGLE_TAG 34d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private static final String TAG = LogUtil.BUGLE_TAG; 35d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 36d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private static final String[] ALL_THREADS_PROJECTION = { 37d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Threads._ID, 38d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Threads.DATE, 39d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Threads.MESSAGE_COUNT, 40d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Threads.RECIPIENT_IDS, 41d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Threads.SNIPPET, 42d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Threads.SNIPPET_CHARSET, 43d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Threads.READ, 44d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Threads.ERROR, 45d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Threads.HAS_ATTACHMENT }; 46d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 47d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // Constants from the Telephony Database 48d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private static final int ID = 0; 49d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private static final int DATE = 1; 50d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private static final int MESSAGE_COUNT = 2; 51d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private static final int RECIPIENT_IDS = 3; 52d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private static final int SNIPPET = 4; 53d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private static final int SNIPPET_CHAR_SET = 5; 54d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private static final int READ = 6; 55d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private static final int ERROR = 7; 56d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private static final int HAS_ATTACHMENT = 8; 57d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 58d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 59d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Log telephony data to logcat 60d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 61d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public static void dumpDatabase() { 62d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final LogTelephonyDatabaseAction action = new LogTelephonyDatabaseAction(); 63d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd action.start(); 64d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 65d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 66d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private LogTelephonyDatabaseAction() { 67d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 68d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 69d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 70d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd protected Object executeAction() { 71d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final Context context = Factory.get().getApplicationContext(); 72d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 73d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (!DebugUtils.isDebugEnabled()) { 74d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd LogUtil.e(TAG, "Can't log telephony database unless debugging is enabled"); 75d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return null; 76d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 77d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 78d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (!LogUtil.isLoggable(TAG, LogUtil.DEBUG)) { 79d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd LogUtil.w(TAG, "Can't log telephony database unless DEBUG is turned on for TAG: " + 80d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd TAG); 81d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return null; 82d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 83d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 84d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd LogUtil.d(TAG, "\n"); 85d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd LogUtil.d(TAG, "Dump of canoncial_addresses table"); 86d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd LogUtil.d(TAG, "*********************************"); 87d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 88d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Cursor cursor = SqliteWrapper.query(context, context.getContentResolver(), 89d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Uri.parse("content://mms-sms/canonical-addresses"), null, null, null, null); 90d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 91d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (cursor == null) { 92d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd LogUtil.w(TAG, "null Cursor in content://mms-sms/canonical-addresses"); 93d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } else { 94d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd try { 95d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd while (cursor.moveToNext()) { 96d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd long id = cursor.getLong(0); 97d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd String number = cursor.getString(1); 98d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd LogUtil.d(TAG, LogUtil.sanitizePII("id: " + id + " number: " + number)); 99d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 100d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } finally { 101d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd cursor.close(); 102d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 103d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 104d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 105d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd LogUtil.d(TAG, "\n"); 106d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd LogUtil.d(TAG, "Dump of threads table"); 107d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd LogUtil.d(TAG, "*********************"); 108d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 109d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd cursor = SqliteWrapper.query(context, context.getContentResolver(), 110d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Threads.CONTENT_URI.buildUpon().appendQueryParameter("simple", "true").build(), 111d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd ALL_THREADS_PROJECTION, null, null, "date ASC"); 112d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd try { 113d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd while (cursor.moveToNext()) { 114d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd LogUtil.d(TAG, LogUtil.sanitizePII("threadId: " + cursor.getLong(ID) + 115d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd " " + ThreadsColumns.DATE + " : " + cursor.getLong(DATE) + 116d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd " " + ThreadsColumns.MESSAGE_COUNT + " : " + cursor.getInt(MESSAGE_COUNT) + 117d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd " " + ThreadsColumns.SNIPPET + " : " + cursor.getString(SNIPPET) + 118d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd " " + ThreadsColumns.READ + " : " + cursor.getInt(READ) + 119d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd " " + ThreadsColumns.ERROR + " : " + cursor.getInt(ERROR) + 120d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd " " + ThreadsColumns.HAS_ATTACHMENT + " : " + 121d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd cursor.getInt(HAS_ATTACHMENT) + 122d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd " " + ThreadsColumns.RECIPIENT_IDS + " : " + 123d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd cursor.getString(RECIPIENT_IDS))); 124d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 125d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } finally { 126d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd cursor.close(); 127d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 128d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 129d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return null; 130d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 131d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 132d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private LogTelephonyDatabaseAction(final Parcel in) { 133d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd super(in); 134d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 135d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 136d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public static final Parcelable.Creator<LogTelephonyDatabaseAction> CREATOR 137d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd = new Parcelable.Creator<LogTelephonyDatabaseAction>() { 138d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 139d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public LogTelephonyDatabaseAction createFromParcel(final Parcel in) { 140d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return new LogTelephonyDatabaseAction(in); 141d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 142d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 143d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 144d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public LogTelephonyDatabaseAction[] newArray(final int size) { 145d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return new LogTelephonyDatabaseAction[size]; 146d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 147d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd }; 148d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 149d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 150d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void writeToParcel(final Parcel parcel, final int flags) { 151d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd writeActionToParcel(parcel, flags); 152d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 153d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd} 154