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