170be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulzpackage com.android.bluetooth.tests;
270be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz
35a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.io.FileInputStream;
45a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.io.FileNotFoundException;
55a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.io.FileOutputStream;
65a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.io.IOException;
75a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.io.InputStream;
85a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.io.UnsupportedEncodingException;
970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulzimport java.text.SimpleDateFormat;
105a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.util.ArrayList;
1170be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulzimport java.util.Date;
125a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.util.LinkedHashMap;
1370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz
145a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.annotation.TargetApi;
155a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.content.ContentResolver;
165a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.content.ContentValues;
175a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.content.Context;
185a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.database.Cursor;
195a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.net.Uri;
205a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.os.Bundle;
215a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.os.Debug;
225a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.os.ParcelFileDescriptor;
235a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.provider.BaseColumns;
245a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.provider.Telephony.Mms;
255a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.provider.Telephony.MmsSms;
265a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.provider.Telephony.Threads;
275a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.test.AndroidTestCase;
285a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.util.Log;
2970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz
305a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.map.BluetoothMapMasInstance;
315a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.map.BluetoothMapAccountItem;
325a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.map.BluetoothMapAccountLoader;
335a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.map.BluetoothMapAppParams;
345a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.map.BluetoothMapContent;
355a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.map.BluetoothMapFolderElement;
365a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.map.BluetoothMapMessageListing;
375a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.map.BluetoothMapUtils;
385a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.map.BluetoothMapUtils.TYPE;
395a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.map.MapContact;
405a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.map.SmsMmsContacts;
415a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.mapapi.BluetoothMapContract;
4270be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz
4370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulzpublic class BluetoothMapContentTest extends AndroidTestCase {
445a60e47497f21f64e6d79420dc4c56c1907df22akschulz
4570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz    private static final String TAG = "BluetoothMapContentTest";
4670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz
4770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz    private static final boolean D = true;
4870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz
4970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz    private Context mContext;
5070be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz    private ContentResolver mResolver;
515a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private SmsMmsContacts mContacts = new SmsMmsContacts();
5270be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz
535a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private BluetoothMapFolderElement mCurrentFolder;
545a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private BluetoothMapAccountItem mAccount = null;
555a60e47497f21f64e6d79420dc4c56c1907df22akschulz
565a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private static final int MAS_ID = 0;
575a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private static final int REMOTE_FEATURE_MASK = 0x07FFFFFF;
585a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private static final BluetoothMapMasInstance mMasInstance =
595a60e47497f21f64e6d79420dc4c56c1907df22akschulz            new MockMasInstance(MAS_ID, REMOTE_FEATURE_MASK);
605a60e47497f21f64e6d79420dc4c56c1907df22akschulz
6170be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz
625a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private Uri mEmailUri = null;
635a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private Uri mEmailMessagesUri = null;
645a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private Uri mEmailFolderUri = null;
655a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private Uri mEmailAccountUri = null;
665a60e47497f21f64e6d79420dc4c56c1907df22akschulz
675a60e47497f21f64e6d79420dc4c56c1907df22akschulz    static final String[] EMAIL_ACCOUNT_PROJECTION = new String[] {
685a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapContract.MessageColumns.FOLDER_ID,
695a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapContract.MessageColumns.ACCOUNT_ID,
7070be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz    };
7170be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz
725a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private void printAccountInfo(Cursor c) {
735a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (D) Log.d(TAG, BluetoothMapContract.MessageColumns.ACCOUNT_ID + " : " +
745a60e47497f21f64e6d79420dc4c56c1907df22akschulz                c.getInt(c.getColumnIndex(BluetoothMapContract.MessageColumns.ACCOUNT_ID)) );
755a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
765a60e47497f21f64e6d79420dc4c56c1907df22akschulz
775a60e47497f21f64e6d79420dc4c56c1907df22akschulz    static final String[] BT_MESSAGE_ID_PROJECTION = new String[] {
785a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapContract.MessageColumns._ID,
795a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapContract.MessageColumns.DATE,
8070be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz    };
8170be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz
825a60e47497f21f64e6d79420dc4c56c1907df22akschulz    static final String[] BT_MESSAGE_PROJECTION = BluetoothMapContract.BT_MESSAGE_PROJECTION;
835a60e47497f21f64e6d79420dc4c56c1907df22akschulz
845a60e47497f21f64e6d79420dc4c56c1907df22akschulz    static final String[] BT_ACCOUNT_PROJECTION = BluetoothMapContract.BT_ACCOUNT_PROJECTION;
855a60e47497f21f64e6d79420dc4c56c1907df22akschulz
865a60e47497f21f64e6d79420dc4c56c1907df22akschulz    static final String[] BT_FOLDER_PROJECTION = BluetoothMapContract.BT_FOLDER_PROJECTION;
875a60e47497f21f64e6d79420dc4c56c1907df22akschulz
885a60e47497f21f64e6d79420dc4c56c1907df22akschulz    BluetoothMapAccountLoader loader;
895a60e47497f21f64e6d79420dc4c56c1907df22akschulz    LinkedHashMap<BluetoothMapAccountItem, ArrayList<BluetoothMapAccountItem>> mFullList;
905a60e47497f21f64e6d79420dc4c56c1907df22akschulz
915a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public BluetoothMapContentTest() {
925a60e47497f21f64e6d79420dc4c56c1907df22akschulz        super();
935a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
945a60e47497f21f64e6d79420dc4c56c1907df22akschulz
955a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private void initTestSetup(){
965a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mContext = this.getContext();
975a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mResolver = mContext.getContentResolver();
985a60e47497f21f64e6d79420dc4c56c1907df22akschulz
995a60e47497f21f64e6d79420dc4c56c1907df22akschulz        // find enabled account
1005a60e47497f21f64e6d79420dc4c56c1907df22akschulz        loader    = new BluetoothMapAccountLoader(mContext);
1015a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mFullList = loader.parsePackages(false);
1025a60e47497f21f64e6d79420dc4c56c1907df22akschulz        String accountId = getEnabledAccount();
1035a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Uri tmpEmailUri = Uri.parse("content://com.android.email.bluetoothprovider/");
1045a60e47497f21f64e6d79420dc4c56c1907df22akschulz
1055a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mEmailUri = Uri.withAppendedPath(tmpEmailUri, accountId + "/");
1065a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mEmailMessagesUri = Uri.parse(mEmailUri + BluetoothMapContract.TABLE_MESSAGE);
1075a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mEmailFolderUri = Uri.parse(mEmailUri + BluetoothMapContract.TABLE_FOLDER);
1085a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mEmailAccountUri = Uri.parse(tmpEmailUri + BluetoothMapContract.TABLE_ACCOUNT);
1095a60e47497f21f64e6d79420dc4c56c1907df22akschulz
1105a60e47497f21f64e6d79420dc4c56c1907df22akschulz        buildFolderStructure();
1115a60e47497f21f64e6d79420dc4c56c1907df22akschulz
1125a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
1135a60e47497f21f64e6d79420dc4c56c1907df22akschulz
1145a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public String getEnabledAccount(){
1155a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if(D)Log.d(TAG,"getEnabledAccountItems()\n");
1165a60e47497f21f64e6d79420dc4c56c1907df22akschulz        String account = null;
1175a60e47497f21f64e6d79420dc4c56c1907df22akschulz        for(BluetoothMapAccountItem app:mFullList.keySet()){
1185a60e47497f21f64e6d79420dc4c56c1907df22akschulz            ArrayList<BluetoothMapAccountItem> accountList = mFullList.get(app);
1195a60e47497f21f64e6d79420dc4c56c1907df22akschulz            for(BluetoothMapAccountItem acc: accountList){
1205a60e47497f21f64e6d79420dc4c56c1907df22akschulz                mAccount = acc;
1215a60e47497f21f64e6d79420dc4c56c1907df22akschulz                account = acc.getId();
1225a60e47497f21f64e6d79420dc4c56c1907df22akschulz                break;
1235a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
1245a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
1255a60e47497f21f64e6d79420dc4c56c1907df22akschulz        return account;
1265a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
1275a60e47497f21f64e6d79420dc4c56c1907df22akschulz
1285a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private void buildFolderStructure(){
1295a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mCurrentFolder = new BluetoothMapFolderElement("root", null); // This will be the root element
1305a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapFolderElement tmpFolder;
1315a60e47497f21f64e6d79420dc4c56c1907df22akschulz        tmpFolder = mCurrentFolder.addFolder("telecom"); // root/telecom
1325a60e47497f21f64e6d79420dc4c56c1907df22akschulz        tmpFolder = tmpFolder.addFolder("msg");          // root/telecom/msg
1335a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if(mEmailFolderUri != null) {
1345a60e47497f21f64e6d79420dc4c56c1907df22akschulz            addEmailFolders(tmpFolder);
1355a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
1365a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
1375a60e47497f21f64e6d79420dc4c56c1907df22akschulz
1385a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private void addEmailFolders(BluetoothMapFolderElement parentFolder) {
1395a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapFolderElement newFolder;
1405a60e47497f21f64e6d79420dc4c56c1907df22akschulz        String where = BluetoothMapContract.FolderColumns.PARENT_FOLDER_ID +
1415a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        " = " + parentFolder.getFolderId();
1425a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Cursor c = mContext.getContentResolver().query(mEmailFolderUri,
1435a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        BluetoothMapContract.BT_FOLDER_PROJECTION, where, null, null);
1445a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (c != null) {
1455a60e47497f21f64e6d79420dc4c56c1907df22akschulz            c.moveToPosition(-1);
1465a60e47497f21f64e6d79420dc4c56c1907df22akschulz            while (c.moveToNext()) {
1475a60e47497f21f64e6d79420dc4c56c1907df22akschulz                String name = c.getString(c.getColumnIndex(BluetoothMapContract.FolderColumns.NAME));
1485a60e47497f21f64e6d79420dc4c56c1907df22akschulz                long id = c.getLong(c.getColumnIndex(BluetoothMapContract.FolderColumns._ID));
1495a60e47497f21f64e6d79420dc4c56c1907df22akschulz                newFolder = parentFolder.addEmailFolder(name, id);
1505a60e47497f21f64e6d79420dc4c56c1907df22akschulz                addEmailFolders(newFolder); // Use recursion to add any sub folders
1515a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
1525a60e47497f21f64e6d79420dc4c56c1907df22akschulz            c.close();
1535a60e47497f21f64e6d79420dc4c56c1907df22akschulz        } else {
1545a60e47497f21f64e6d79420dc4c56c1907df22akschulz            if (D) Log.d(TAG, "addEmailFolders(): no elements found");
1555a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
1565a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
1575a60e47497f21f64e6d79420dc4c56c1907df22akschulz
1585a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private BluetoothMapFolderElement getInbox() {
1595a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapFolderElement tmpFolderElement = null;
1605a60e47497f21f64e6d79420dc4c56c1907df22akschulz
1615a60e47497f21f64e6d79420dc4c56c1907df22akschulz        tmpFolderElement = mCurrentFolder.getSubFolder("telecom");
1625a60e47497f21f64e6d79420dc4c56c1907df22akschulz        tmpFolderElement = tmpFolderElement.getSubFolder("msg");
1635a60e47497f21f64e6d79420dc4c56c1907df22akschulz        tmpFolderElement = tmpFolderElement.getSubFolder("inbox");
1645a60e47497f21f64e6d79420dc4c56c1907df22akschulz        return tmpFolderElement;
1655a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
1665a60e47497f21f64e6d79420dc4c56c1907df22akschulz
1675a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private BluetoothMapFolderElement getOutbox() {
1685a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapFolderElement tmpFolderElement = null;
1695a60e47497f21f64e6d79420dc4c56c1907df22akschulz
1705a60e47497f21f64e6d79420dc4c56c1907df22akschulz        tmpFolderElement = mCurrentFolder.getSubFolder("telecom");
1715a60e47497f21f64e6d79420dc4c56c1907df22akschulz        tmpFolderElement = tmpFolderElement.getSubFolder("msg");
1725a60e47497f21f64e6d79420dc4c56c1907df22akschulz        tmpFolderElement = tmpFolderElement.getSubFolder("outbox");
1735a60e47497f21f64e6d79420dc4c56c1907df22akschulz        return tmpFolderElement;
1745a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
1755a60e47497f21f64e6d79420dc4c56c1907df22akschulz
1765a60e47497f21f64e6d79420dc4c56c1907df22akschulz
17770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz    private String getDateTimeString(long timestamp) {
17870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd'T'HHmmss");
17970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz        Date date = new Date(timestamp);
18070be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz        return format.format(date); // Format to YYYYMMDDTHHMMSS local time
18170be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz    }
18270be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz
1835a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private void printCursor(Cursor c) {
1845a60e47497f21f64e6d79420dc4c56c1907df22akschulz        StringBuilder sb = new StringBuilder();
1855a60e47497f21f64e6d79420dc4c56c1907df22akschulz        sb.append("\nprintCursor:\n");
1865a60e47497f21f64e6d79420dc4c56c1907df22akschulz        for(int i = 0; i < c.getColumnCount(); i++) {
1875a60e47497f21f64e6d79420dc4c56c1907df22akschulz            if(c.getColumnName(i).equals(BluetoothMapContract.MessageColumns.DATE)){
1885a60e47497f21f64e6d79420dc4c56c1907df22akschulz                sb.append("  ").append(c.getColumnName(i))
1895a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    .append(" : ").append(getDateTimeString(c.getLong(i))).append("\n");
1905a60e47497f21f64e6d79420dc4c56c1907df22akschulz            } else {
1915a60e47497f21f64e6d79420dc4c56c1907df22akschulz                sb.append("  ").append(c.getColumnName(i))
1925a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    .append(" : ").append(c.getString(i)).append("\n");
1935a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
1945a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
1955a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Log.d(TAG, sb.toString());
1965a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
1975a60e47497f21f64e6d79420dc4c56c1907df22akschulz
1985a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private void dumpMessageContent(Cursor c) {
1995a60e47497f21f64e6d79420dc4c56c1907df22akschulz        long id = c.getLong(c.getColumnIndex(BluetoothMapContract.MessageColumns._ID));
2005a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Uri uri = Uri.parse(mEmailMessagesUri + "/" + id
2015a60e47497f21f64e6d79420dc4c56c1907df22akschulz                + "/" + BluetoothMapContract.FILE_MSG_NO_ATTACHMENTS);
2025a60e47497f21f64e6d79420dc4c56c1907df22akschulz        FileInputStream is = null;
2035a60e47497f21f64e6d79420dc4c56c1907df22akschulz        ParcelFileDescriptor fd = null;
2045a60e47497f21f64e6d79420dc4c56c1907df22akschulz        int count;
2055a60e47497f21f64e6d79420dc4c56c1907df22akschulz        try {
2065a60e47497f21f64e6d79420dc4c56c1907df22akschulz            fd = mResolver.openFileDescriptor(uri, "r");
2075a60e47497f21f64e6d79420dc4c56c1907df22akschulz            is = new FileInputStream(fd.getFileDescriptor());
2085a60e47497f21f64e6d79420dc4c56c1907df22akschulz            byte[] buffer = new byte[1024];
2095a60e47497f21f64e6d79420dc4c56c1907df22akschulz
2105a60e47497f21f64e6d79420dc4c56c1907df22akschulz            while((count = is.read(buffer)) != -1) {
2115a60e47497f21f64e6d79420dc4c56c1907df22akschulz                Log.d(TAG, new String(buffer,0, count));
2125a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
2135a60e47497f21f64e6d79420dc4c56c1907df22akschulz
2145a60e47497f21f64e6d79420dc4c56c1907df22akschulz
2155a60e47497f21f64e6d79420dc4c56c1907df22akschulz        } catch (FileNotFoundException e) {
2165a60e47497f21f64e6d79420dc4c56c1907df22akschulz            Log.w(TAG, e);
2175a60e47497f21f64e6d79420dc4c56c1907df22akschulz        } catch (IOException e) {
2185a60e47497f21f64e6d79420dc4c56c1907df22akschulz            Log.w(TAG, e);
2195a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
2205a60e47497f21f64e6d79420dc4c56c1907df22akschulz        finally {
2215a60e47497f21f64e6d79420dc4c56c1907df22akschulz            try {
2225a60e47497f21f64e6d79420dc4c56c1907df22akschulz               if(is != null)
2235a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    is.close();
2245a60e47497f21f64e6d79420dc4c56c1907df22akschulz            } catch (IOException e) {}
2255a60e47497f21f64e6d79420dc4c56c1907df22akschulz               try {
2265a60e47497f21f64e6d79420dc4c56c1907df22akschulz                if(fd != null)
2275a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    fd.close();
2285a60e47497f21f64e6d79420dc4c56c1907df22akschulz            } catch (IOException e) {}
2295a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
2305a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
2315a60e47497f21f64e6d79420dc4c56c1907df22akschulz
2325a60e47497f21f64e6d79420dc4c56c1907df22akschulz    /**
2335a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * Create a new message in the database outbox, based on the content of c.
2345a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * @param c
2355a60e47497f21f64e6d79420dc4c56c1907df22akschulz     */
2365a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private void writeMessageContent(Cursor c) {
2375a60e47497f21f64e6d79420dc4c56c1907df22akschulz        long id = c.getLong(c.getColumnIndex(BluetoothMapContract.MessageColumns._ID));
2385a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Uri uri = Uri.parse(mEmailMessagesUri + "/" + id + "/"
2395a60e47497f21f64e6d79420dc4c56c1907df22akschulz                + BluetoothMapContract.FILE_MSG_NO_ATTACHMENTS);
2405a60e47497f21f64e6d79420dc4c56c1907df22akschulz        FileInputStream is = null;
2415a60e47497f21f64e6d79420dc4c56c1907df22akschulz        ParcelFileDescriptor fd = null;
2425a60e47497f21f64e6d79420dc4c56c1907df22akschulz        FileOutputStream os = null;
2435a60e47497f21f64e6d79420dc4c56c1907df22akschulz        ParcelFileDescriptor fdOut = null;
2445a60e47497f21f64e6d79420dc4c56c1907df22akschulz
2455a60e47497f21f64e6d79420dc4c56c1907df22akschulz        ContentValues newMessage = new ContentValues();
2465a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapFolderElement outFolder = getOutbox();
2475a60e47497f21f64e6d79420dc4c56c1907df22akschulz        newMessage.put(BluetoothMapContract.MessageColumns.FOLDER_ID, outFolder.getFolderId());
2485a60e47497f21f64e6d79420dc4c56c1907df22akschulz        // Now insert the empty message into outbox (Maybe it should be draft first, and then a move?)
2495a60e47497f21f64e6d79420dc4c56c1907df22akschulz        // TODO: Examine if we need to set some additional flags, e.g. visable?
2505a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Uri uriOut = mResolver.insert(mEmailMessagesUri, newMessage);
2515a60e47497f21f64e6d79420dc4c56c1907df22akschulz        int count;
2525a60e47497f21f64e6d79420dc4c56c1907df22akschulz        try {
2535a60e47497f21f64e6d79420dc4c56c1907df22akschulz            fd = mResolver.openFileDescriptor(uri, "r");
2545a60e47497f21f64e6d79420dc4c56c1907df22akschulz            is = new FileInputStream(fd.getFileDescriptor());
2555a60e47497f21f64e6d79420dc4c56c1907df22akschulz            fdOut = mResolver.openFileDescriptor(uri, "w");
2565a60e47497f21f64e6d79420dc4c56c1907df22akschulz            os = new FileOutputStream(fdOut.getFileDescriptor());
2575a60e47497f21f64e6d79420dc4c56c1907df22akschulz            byte[] buffer = new byte[1024];
2585a60e47497f21f64e6d79420dc4c56c1907df22akschulz
2595a60e47497f21f64e6d79420dc4c56c1907df22akschulz            while((count = is.read(buffer)) != -1) {
2605a60e47497f21f64e6d79420dc4c56c1907df22akschulz                Log.d(TAG, new String(buffer,0, count));
2615a60e47497f21f64e6d79420dc4c56c1907df22akschulz                os.write(buffer, 0, count);
2625a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
2635a60e47497f21f64e6d79420dc4c56c1907df22akschulz        } catch (FileNotFoundException e) {
2645a60e47497f21f64e6d79420dc4c56c1907df22akschulz            Log.w(TAG, e);
2655a60e47497f21f64e6d79420dc4c56c1907df22akschulz        } catch (IOException e) {
2665a60e47497f21f64e6d79420dc4c56c1907df22akschulz            Log.w(TAG, e);
2675a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
2685a60e47497f21f64e6d79420dc4c56c1907df22akschulz        finally {
2695a60e47497f21f64e6d79420dc4c56c1907df22akschulz            try {
2705a60e47497f21f64e6d79420dc4c56c1907df22akschulz               if(is != null)
2715a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    is.close();
2725a60e47497f21f64e6d79420dc4c56c1907df22akschulz            } catch (IOException e) {}
2735a60e47497f21f64e6d79420dc4c56c1907df22akschulz               try {
2745a60e47497f21f64e6d79420dc4c56c1907df22akschulz                if(fd != null)
2755a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    fd.close();
2765a60e47497f21f64e6d79420dc4c56c1907df22akschulz            } catch (IOException e) {}
2775a60e47497f21f64e6d79420dc4c56c1907df22akschulz               try {
2785a60e47497f21f64e6d79420dc4c56c1907df22akschulz                   if(os != null)
2795a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        os.close();
2805a60e47497f21f64e6d79420dc4c56c1907df22akschulz                } catch (IOException e) {}
2815a60e47497f21f64e6d79420dc4c56c1907df22akschulz                   try {
2825a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    if(fdOut != null)
2835a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        fdOut.close();
2845a60e47497f21f64e6d79420dc4c56c1907df22akschulz                } catch (IOException e) {}
2855a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
2865a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
2875a60e47497f21f64e6d79420dc4c56c1907df22akschulz
2885a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private void writeMessage(Cursor c) {
2895a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Log.d(TAG, "c.getCount() = " + c.getCount());
2905a60e47497f21f64e6d79420dc4c56c1907df22akschulz            c.moveToPosition(-1);
2915a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (c.moveToNext()) {
2925a60e47497f21f64e6d79420dc4c56c1907df22akschulz            writeMessageContent(c);
2935a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
2945a60e47497f21f64e6d79420dc4c56c1907df22akschulz        c.close();
2955a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
2965a60e47497f21f64e6d79420dc4c56c1907df22akschulz
2975a60e47497f21f64e6d79420dc4c56c1907df22akschulz
2985a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private void dumpCursor(Cursor c) {
2995a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Log.d(TAG, "c.getCount() = " + c.getCount());
3005a60e47497f21f64e6d79420dc4c56c1907df22akschulz        c.moveToPosition(-1);
3015a60e47497f21f64e6d79420dc4c56c1907df22akschulz        while (c.moveToNext()) {
3025a60e47497f21f64e6d79420dc4c56c1907df22akschulz            printCursor(c);
3035a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
3045a60e47497f21f64e6d79420dc4c56c1907df22akschulz        c.close();
3055a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
3065a60e47497f21f64e6d79420dc4c56c1907df22akschulz
3075a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private void callBluetoothProvider() {
3085a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Log.d(TAG, "**** Test call into email provider ****");
3095a60e47497f21f64e6d79420dc4c56c1907df22akschulz        int accountId = 0;
3105a60e47497f21f64e6d79420dc4c56c1907df22akschulz        int mailboxId = 0;
3115a60e47497f21f64e6d79420dc4c56c1907df22akschulz
3125a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Log.d(TAG, "contentUri = " + mEmailMessagesUri);
3135a60e47497f21f64e6d79420dc4c56c1907df22akschulz
3145a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Cursor c = mResolver.query(mEmailMessagesUri, EMAIL_ACCOUNT_PROJECTION,
3155a60e47497f21f64e6d79420dc4c56c1907df22akschulz                null, null, "_id DESC");
31670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz        if (c != null) {
31770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz            Log.d(TAG, "c.getCount() = " + c.getCount());
31870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz            c.moveToPosition(-1);
31970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz            while (c.moveToNext()) {
3205a60e47497f21f64e6d79420dc4c56c1907df22akschulz                printAccountInfo(c);
3215a60e47497f21f64e6d79420dc4c56c1907df22akschulz                mailboxId = c.getInt(c.getColumnIndex(
3225a60e47497f21f64e6d79420dc4c56c1907df22akschulz                                BluetoothMapContract.MessageColumns.FOLDER_ID));
3235a60e47497f21f64e6d79420dc4c56c1907df22akschulz                accountId = c.getInt(c.getColumnIndex(
3245a60e47497f21f64e6d79420dc4c56c1907df22akschulz                                BluetoothMapContract.MessageColumns.ACCOUNT_ID));
32570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz            }
3265a60e47497f21f64e6d79420dc4c56c1907df22akschulz           c.close();
32770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz        } else {
32870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz            Log.d(TAG, "query failed");
32970be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz        }
3305a60e47497f21f64e6d79420dc4c56c1907df22akschulz
3315a60e47497f21f64e6d79420dc4c56c1907df22akschulz        final Bundle extras = new Bundle(2);
3325a60e47497f21f64e6d79420dc4c56c1907df22akschulz        /* TODO: find mailbox from DB */
3335a60e47497f21f64e6d79420dc4c56c1907df22akschulz        extras.putLong(BluetoothMapContract.EXTRA_UPDATE_FOLDER_ID, mailboxId);
3345a60e47497f21f64e6d79420dc4c56c1907df22akschulz        extras.putLong(BluetoothMapContract.EXTRA_UPDATE_ACCOUNT_ID, accountId);
3355a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Bundle myBundle = mResolver.call(mEmailUri, BluetoothMapContract.METHOD_UPDATE_FOLDER,
3365a60e47497f21f64e6d79420dc4c56c1907df22akschulz                                            null, extras);
33770be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz    }
33870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz
3395a60e47497f21f64e6d79420dc4c56c1907df22akschulz
3405a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public void testMsgListing() {
3415a60e47497f21f64e6d79420dc4c56c1907df22akschulz        initTestSetup();
3425a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapContent mBtMapContent = new BluetoothMapContent(mContext, mAccount,
3435a60e47497f21f64e6d79420dc4c56c1907df22akschulz                mMasInstance);
3445a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapAppParams appParams = new BluetoothMapAppParams();
3455a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Log.d(TAG, "**** testMsgListing **** ");
3465a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapFolderElement fe = getInbox();
3475a60e47497f21f64e6d79420dc4c56c1907df22akschulz
3485a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (fe != null) {
3495a60e47497f21f64e6d79420dc4c56c1907df22akschulz            if (D) Log.d(TAG, "folder name=" + fe.getName());
3505a60e47497f21f64e6d79420dc4c56c1907df22akschulz
3515a60e47497f21f64e6d79420dc4c56c1907df22akschulz            appParams.setFilterMessageType(0x0B);
3525a60e47497f21f64e6d79420dc4c56c1907df22akschulz            appParams.setMaxListCount(1024);
3535a60e47497f21f64e6d79420dc4c56c1907df22akschulz            appParams.setStartOffset(0);
3545a60e47497f21f64e6d79420dc4c56c1907df22akschulz
3555a60e47497f21f64e6d79420dc4c56c1907df22akschulz            BluetoothMapMessageListing msgListing = mBtMapContent.msgListing(fe, appParams);
3565a60e47497f21f64e6d79420dc4c56c1907df22akschulz            int listCount = msgListing.getCount();
3575a60e47497f21f64e6d79420dc4c56c1907df22akschulz            int msgListingSize = mBtMapContent.msgListingSize(fe, appParams);
3585a60e47497f21f64e6d79420dc4c56c1907df22akschulz
3595a60e47497f21f64e6d79420dc4c56c1907df22akschulz            if (listCount == msgListingSize) {
3605a60e47497f21f64e6d79420dc4c56c1907df22akschulz                Log.d(TAG, "testMsgListing - " + listCount );
3615a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
3625a60e47497f21f64e6d79420dc4c56c1907df22akschulz            else {
3635a60e47497f21f64e6d79420dc4c56c1907df22akschulz                Log.d(TAG, "testMsgListing - None");
3645a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
3655a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
3665a60e47497f21f64e6d79420dc4c56c1907df22akschulz        else {
3675a60e47497f21f64e6d79420dc4c56c1907df22akschulz            Log.d(TAG, "testMsgListing - failed ");
3685a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
3695a60e47497f21f64e6d79420dc4c56c1907df22akschulz
3705a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
3715a60e47497f21f64e6d79420dc4c56c1907df22akschulz
3725a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public void testMsgListingUnread() {
3735a60e47497f21f64e6d79420dc4c56c1907df22akschulz        initTestSetup();
3745a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapContent mBtMapContent = new BluetoothMapContent(mContext, mAccount,
3755a60e47497f21f64e6d79420dc4c56c1907df22akschulz                mMasInstance);
3765a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapAppParams appParams = new BluetoothMapAppParams();
3775a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Log.d(TAG, "**** testMsgListingUnread **** ");
3785a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapFolderElement fe = getInbox();
3795a60e47497f21f64e6d79420dc4c56c1907df22akschulz
3805a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (fe != null) {
3815a60e47497f21f64e6d79420dc4c56c1907df22akschulz
3825a60e47497f21f64e6d79420dc4c56c1907df22akschulz            appParams.setFilterReadStatus(0x01);
3835a60e47497f21f64e6d79420dc4c56c1907df22akschulz            appParams.setFilterMessageType(0x0B);
3845a60e47497f21f64e6d79420dc4c56c1907df22akschulz            appParams.setMaxListCount(1024);
3855a60e47497f21f64e6d79420dc4c56c1907df22akschulz            appParams.setStartOffset(0);
3865a60e47497f21f64e6d79420dc4c56c1907df22akschulz
3875a60e47497f21f64e6d79420dc4c56c1907df22akschulz            BluetoothMapMessageListing msgListing = mBtMapContent.msgListing(fe, appParams);
3885a60e47497f21f64e6d79420dc4c56c1907df22akschulz
3895a60e47497f21f64e6d79420dc4c56c1907df22akschulz            int listCount = msgListing.getCount();
3905a60e47497f21f64e6d79420dc4c56c1907df22akschulz            if (msgListing.getCount() > 0) {
3915a60e47497f21f64e6d79420dc4c56c1907df22akschulz                Log.d(TAG, "testMsgListingUnread - " + listCount );
3925a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
3935a60e47497f21f64e6d79420dc4c56c1907df22akschulz            else {
3945a60e47497f21f64e6d79420dc4c56c1907df22akschulz                Log.d(TAG, "testMsgListingUnread - None");
3955a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
3965a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
3975a60e47497f21f64e6d79420dc4c56c1907df22akschulz        else {
3985a60e47497f21f64e6d79420dc4c56c1907df22akschulz            Log.d(TAG, "testMsgListingUnread - getInbox failed ");
3995a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
4005a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
4015a60e47497f21f64e6d79420dc4c56c1907df22akschulz
4025a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public void testMsgListingWithOriginator() {
4035a60e47497f21f64e6d79420dc4c56c1907df22akschulz        initTestSetup();
4045a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapContent mBtMapContent = new BluetoothMapContent(mContext, mAccount,
4055a60e47497f21f64e6d79420dc4c56c1907df22akschulz                mMasInstance);
4065a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapAppParams appParams = new BluetoothMapAppParams();
4075a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Log.d(TAG, "**** testMsgListingUnread **** ");
4085a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapFolderElement fe = getInbox();
4095a60e47497f21f64e6d79420dc4c56c1907df22akschulz
4105a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (fe != null) {
4115a60e47497f21f64e6d79420dc4c56c1907df22akschulz
4125a60e47497f21f64e6d79420dc4c56c1907df22akschulz            appParams.setFilterOriginator("*scsc.*");
4135a60e47497f21f64e6d79420dc4c56c1907df22akschulz            appParams.setFilterMessageType(0x0B);
4145a60e47497f21f64e6d79420dc4c56c1907df22akschulz            appParams.setMaxListCount(1024);
4155a60e47497f21f64e6d79420dc4c56c1907df22akschulz            appParams.setStartOffset(0);
4165a60e47497f21f64e6d79420dc4c56c1907df22akschulz
4175a60e47497f21f64e6d79420dc4c56c1907df22akschulz            BluetoothMapMessageListing msgListing = mBtMapContent.msgListing(fe, appParams);
4185a60e47497f21f64e6d79420dc4c56c1907df22akschulz
4195a60e47497f21f64e6d79420dc4c56c1907df22akschulz            int listCount = msgListing.getCount();
4205a60e47497f21f64e6d79420dc4c56c1907df22akschulz            if (msgListing.getCount() > 0) {
4215a60e47497f21f64e6d79420dc4c56c1907df22akschulz                Log.d(TAG, "testMsgListingWithOriginator - " + listCount );
4225a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
4235a60e47497f21f64e6d79420dc4c56c1907df22akschulz            else {
4245a60e47497f21f64e6d79420dc4c56c1907df22akschulz                Log.d(TAG, "testMsgListingWithOriginator - None");
4255a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
4265a60e47497f21f64e6d79420dc4c56c1907df22akschulz        } else {
4275a60e47497f21f64e6d79420dc4c56c1907df22akschulz            Log.d(TAG, "testMsgListingWithOriginator - getInbox failed ");
4285a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
4295a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
4305a60e47497f21f64e6d79420dc4c56c1907df22akschulz
4315a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public void testGetMessages() {
4325a60e47497f21f64e6d79420dc4c56c1907df22akschulz        initTestSetup();
4335a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapContent mBtMapContent = new BluetoothMapContent(mContext, mAccount,
4345a60e47497f21f64e6d79420dc4c56c1907df22akschulz                mMasInstance);
4355a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapAppParams appParams = new BluetoothMapAppParams();
4365a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Log.d(TAG, "**** testGetMessages **** ");
4375a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapFolderElement fe = getInbox();
4385a60e47497f21f64e6d79420dc4c56c1907df22akschulz
4395a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (fe != null) {
4405a60e47497f21f64e6d79420dc4c56c1907df22akschulz            appParams.setAttachment(0);
4415a60e47497f21f64e6d79420dc4c56c1907df22akschulz            appParams.setCharset(BluetoothMapContent.MAP_MESSAGE_CHARSET_UTF8);
4425a60e47497f21f64e6d79420dc4c56c1907df22akschulz
4435a60e47497f21f64e6d79420dc4c56c1907df22akschulz            //get message handles
4445a60e47497f21f64e6d79420dc4c56c1907df22akschulz            Cursor c = mResolver.query(mEmailMessagesUri, BT_MESSAGE_ID_PROJECTION,
4455a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    null, null, "_id DESC");
4465a60e47497f21f64e6d79420dc4c56c1907df22akschulz            if (c != null) {
4475a60e47497f21f64e6d79420dc4c56c1907df22akschulz                c.moveToPosition(-1);
4485a60e47497f21f64e6d79420dc4c56c1907df22akschulz                while (c.moveToNext()) {
4495a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    Long id = c.getLong(c.getColumnIndex(BluetoothMapContract.MessageColumns._ID));
4505a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    String handle = BluetoothMapUtils.getMapHandle(id, TYPE.EMAIL);
4515a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    try {
4525a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        // getMessage
4535a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        byte[] bytes = mBtMapContent.getMessage(handle, appParams, fe, "1.1");
4545a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        Log.d(TAG, "testGetMessages id=" + id + ", handle=" + handle +
4555a60e47497f21f64e6d79420dc4c56c1907df22akschulz                                ", length=" + bytes.length );
4565a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        String testPrint = new String(bytes);
4575a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        Log.d(TAG, "testGetMessage (only dump first part):\n" + testPrint );
4585a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    } catch (UnsupportedEncodingException e) {
4595a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        Log.w(TAG, e);
4605a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    } finally {
4615a60e47497f21f64e6d79420dc4c56c1907df22akschulz
4625a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    }
4635a60e47497f21f64e6d79420dc4c56c1907df22akschulz                }
4645a60e47497f21f64e6d79420dc4c56c1907df22akschulz            } else {
4655a60e47497f21f64e6d79420dc4c56c1907df22akschulz                Log.d(TAG, "testGetMessages - no cursor ");
4665a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
4675a60e47497f21f64e6d79420dc4c56c1907df22akschulz        } else {
4685a60e47497f21f64e6d79420dc4c56c1907df22akschulz            Log.d(TAG, "testGetMessages - getInbox failed ");
4695a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
4705a60e47497f21f64e6d79420dc4c56c1907df22akschulz
4715a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
4725a60e47497f21f64e6d79420dc4c56c1907df22akschulz
4735a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public void testDumpAccounts() {
4745a60e47497f21f64e6d79420dc4c56c1907df22akschulz        initTestSetup();
4755a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Log.d(TAG, "**** testDumpAccounts **** \n from: " + mEmailAccountUri.toString());
4765a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Cursor c = mResolver.query(mEmailAccountUri, BT_ACCOUNT_PROJECTION, null, null, "_id DESC");
4775a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (c != null) {
4785a60e47497f21f64e6d79420dc4c56c1907df22akschulz            dumpCursor(c);
4795a60e47497f21f64e6d79420dc4c56c1907df22akschulz        } else {
4805a60e47497f21f64e6d79420dc4c56c1907df22akschulz            Log.d(TAG, "query failed");
4815a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
4825a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Log.w(TAG, "testDumpAccounts(): ThreadId: " + Thread.currentThread().getId());
4835a60e47497f21f64e6d79420dc4c56c1907df22akschulz
4845a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
4855a60e47497f21f64e6d79420dc4c56c1907df22akschulz
4865a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public void testAccountUpdate() {
4875a60e47497f21f64e6d79420dc4c56c1907df22akschulz        initTestSetup();
4885a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Log.d(TAG, "**** testAccountUpdate **** \n of: " + mEmailAccountUri.toString());
4895a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Cursor c = mResolver.query(mEmailAccountUri, BT_ACCOUNT_PROJECTION, null, null, "_id DESC");
4905a60e47497f21f64e6d79420dc4c56c1907df22akschulz
4915a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (c != null) {
4925a60e47497f21f64e6d79420dc4c56c1907df22akschulz            c.moveToPosition(-1);
4935a60e47497f21f64e6d79420dc4c56c1907df22akschulz            while (c.moveToNext()) {
4945a60e47497f21f64e6d79420dc4c56c1907df22akschulz                printCursor(c);
4955a60e47497f21f64e6d79420dc4c56c1907df22akschulz                Long id = c.getLong(c.getColumnIndex(BluetoothMapContract.AccountColumns._ID));
4965a60e47497f21f64e6d79420dc4c56c1907df22akschulz                int exposeFlag = c.getInt(
4975a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        c.getColumnIndex(BluetoothMapContract.AccountColumns.FLAG_EXPOSE));
4985a60e47497f21f64e6d79420dc4c56c1907df22akschulz                String where = BluetoothMapContract.AccountColumns._ID + " = " + id;
4995a60e47497f21f64e6d79420dc4c56c1907df22akschulz                ContentValues values = new ContentValues();
5005a60e47497f21f64e6d79420dc4c56c1907df22akschulz                if(exposeFlag == 1) {
5015a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    values.put(BluetoothMapContract.AccountColumns.FLAG_EXPOSE, (int) 0);
5025a60e47497f21f64e6d79420dc4c56c1907df22akschulz                } else {
5035a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    values.put(BluetoothMapContract.AccountColumns.FLAG_EXPOSE, (int) 1);
5045a60e47497f21f64e6d79420dc4c56c1907df22akschulz                }
5055a60e47497f21f64e6d79420dc4c56c1907df22akschulz                Log.i(TAG, "Calling update() with selection: " + where +
5065a60e47497f21f64e6d79420dc4c56c1907df22akschulz                           "values(exposeFlag): " +
5075a60e47497f21f64e6d79420dc4c56c1907df22akschulz                            values.getAsInteger(BluetoothMapContract.AccountColumns.FLAG_EXPOSE));
5085a60e47497f21f64e6d79420dc4c56c1907df22akschulz                mResolver.update(mEmailAccountUri, values, where, null);
5095a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
5105a60e47497f21f64e6d79420dc4c56c1907df22akschulz            c.close();
5115a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
5125a60e47497f21f64e6d79420dc4c56c1907df22akschulz
51370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz    }
51470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz
51570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz    public void testDumpMessages() {
5165a60e47497f21f64e6d79420dc4c56c1907df22akschulz        initTestSetup();
5175a60e47497f21f64e6d79420dc4c56c1907df22akschulz
5185a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (D) Log.d(TAG, "**** testDumpMessages **** \n uri=" + mEmailMessagesUri.toString());
5195a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapFolderElement fe = getInbox();
5205a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (fe != null)
5215a60e47497f21f64e6d79420dc4c56c1907df22akschulz        {
5225a60e47497f21f64e6d79420dc4c56c1907df22akschulz            String where ="";
5235a60e47497f21f64e6d79420dc4c56c1907df22akschulz            //where = BluetoothMapContract.MessageColumns.FOLDER_ID + " = " + fe.getEmailFolderId();
5245a60e47497f21f64e6d79420dc4c56c1907df22akschulz            Cursor c = mResolver.query(mEmailMessagesUri, BT_MESSAGE_PROJECTION,
5255a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    where, null, "_id DESC");
5265a60e47497f21f64e6d79420dc4c56c1907df22akschulz            if (c != null) {
5275a60e47497f21f64e6d79420dc4c56c1907df22akschulz                dumpCursor(c);
5285a60e47497f21f64e6d79420dc4c56c1907df22akschulz            } else {
5295a60e47497f21f64e6d79420dc4c56c1907df22akschulz                if (D) Log.d(TAG, "query failed");
5305a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
5315a60e47497f21f64e6d79420dc4c56c1907df22akschulz            if (D) Log.w(TAG, "dumpMessage(): ThreadId: " + Thread.currentThread().getId());
5325a60e47497f21f64e6d79420dc4c56c1907df22akschulz        } else {
5335a60e47497f21f64e6d79420dc4c56c1907df22akschulz            if (D) Log.w(TAG, "dumpMessage(): ThreadId: " + Thread.currentThread().getId());
5345a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
5355a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
5365a60e47497f21f64e6d79420dc4c56c1907df22akschulz
5375a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public void testDumpMessageContent() {
5385a60e47497f21f64e6d79420dc4c56c1907df22akschulz        initTestSetup();
5395a60e47497f21f64e6d79420dc4c56c1907df22akschulz
5405a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Log.d(TAG, "**** testDumpMessageContent **** from: " + mEmailMessagesUri.toString());
5415a60e47497f21f64e6d79420dc4c56c1907df22akschulz//        BluetoothMapFolderElement fe = getInbox();
5425a60e47497f21f64e6d79420dc4c56c1907df22akschulz//        String where = BluetoothMapContract.MessageColumns.FOLDER_ID + " = " + fe.getEmailFolderId();
5435a60e47497f21f64e6d79420dc4c56c1907df22akschulz//        where += " AND " + BluetoothMapContract.MessageColumns.FLAG_HIGH_PRIORITY + " = 0";
5445a60e47497f21f64e6d79420dc4c56c1907df22akschulz
5455a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Cursor c = mResolver.query(mEmailMessagesUri, BT_MESSAGE_PROJECTION, null, null, "_id DESC");
5465a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (c != null && c.moveToNext()) {
5475a60e47497f21f64e6d79420dc4c56c1907df22akschulz            dumpMessageContent(c);
5485a60e47497f21f64e6d79420dc4c56c1907df22akschulz        } else {
5495a60e47497f21f64e6d79420dc4c56c1907df22akschulz            Log.d(TAG, "query failed");
5505a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
5515a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Log.w(TAG, "dumpMessage(): ThreadId: " + Thread.currentThread().getId());
5525a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
5535a60e47497f21f64e6d79420dc4c56c1907df22akschulz
5545a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public void testWriteMessageContent() {
5555a60e47497f21f64e6d79420dc4c56c1907df22akschulz        initTestSetup();
5565a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Log.d(TAG, "**** testWriteMessageContent **** from: " + mEmailMessagesUri.toString());
5575a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapFolderElement fe = getInbox();
5585a60e47497f21f64e6d79420dc4c56c1907df22akschulz        String where = BluetoothMapContract.MessageColumns.FOLDER_ID + " = " + fe.getFolderId();
5595a60e47497f21f64e6d79420dc4c56c1907df22akschulz//        where += " AND " + BluetoothMapContract.MessageColumns.HIGH_PRIORITY + " = 0";
5605a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Cursor c = mResolver.query(mEmailMessagesUri, BT_MESSAGE_PROJECTION, where, null, "_id DESC");
5615a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (c != null) {
5625a60e47497f21f64e6d79420dc4c56c1907df22akschulz            writeMessage(c);
5635a60e47497f21f64e6d79420dc4c56c1907df22akschulz        } else {
5645a60e47497f21f64e6d79420dc4c56c1907df22akschulz            Log.d(TAG, "query failed");
5655a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
5665a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Log.w(TAG, "writeMessage(): ThreadId: " + Thread.currentThread().getId());
5675a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
5685a60e47497f21f64e6d79420dc4c56c1907df22akschulz
5695a60e47497f21f64e6d79420dc4c56c1907df22akschulz    /*
5705a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * Handle test cases
5715a60e47497f21f64e6d79420dc4c56c1907df22akschulz     */
5725a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private static final long HANDLE_TYPE_SMS_CDMA_MASK            = (((long)0x1)<<60);
5735a60e47497f21f64e6d79420dc4c56c1907df22akschulz
5745a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public void testHandle() {
5755a60e47497f21f64e6d79420dc4c56c1907df22akschulz        String handleStr = null;
5765a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Debug.startMethodTracing("str_format");
5775a60e47497f21f64e6d79420dc4c56c1907df22akschulz        for(long i = 0; i < 10000; i++) {
5785a60e47497f21f64e6d79420dc4c56c1907df22akschulz            handleStr = String.format("%016X",(i | HANDLE_TYPE_SMS_CDMA_MASK));
5795a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
5805a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Debug.stopMethodTracing();
5815a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Debug.startMethodTracing("getHandleString");
5825a60e47497f21f64e6d79420dc4c56c1907df22akschulz        for(long i = 0; i < 10000; i++) {
5835a60e47497f21f64e6d79420dc4c56c1907df22akschulz            handleStr = BluetoothMapUtils.getLongAsString(i | HANDLE_TYPE_SMS_CDMA_MASK);
5845a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
5855a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Debug.stopMethodTracing();
5865a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
5875a60e47497f21f64e6d79420dc4c56c1907df22akschulz
5885a60e47497f21f64e6d79420dc4c56c1907df22akschulz    /*
5895a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * Folder test cases
5905a60e47497f21f64e6d79420dc4c56c1907df22akschulz     */
5915a60e47497f21f64e6d79420dc4c56c1907df22akschulz
5925a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public void testDumpEmailFolders() {
5935a60e47497f21f64e6d79420dc4c56c1907df22akschulz        initTestSetup();
5945a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Debug.startMethodTracing();
5955a60e47497f21f64e6d79420dc4c56c1907df22akschulz        String where = null;
5965a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Cursor c = mResolver.query(mEmailFolderUri, BT_FOLDER_PROJECTION, where, null, "_id DESC");
5975a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (c != null) {
5985a60e47497f21f64e6d79420dc4c56c1907df22akschulz            dumpCursor(c);
5995a60e47497f21f64e6d79420dc4c56c1907df22akschulz            c.close();
6005a60e47497f21f64e6d79420dc4c56c1907df22akschulz        } else {
6015a60e47497f21f64e6d79420dc4c56c1907df22akschulz            Log.d(TAG, "query failed");
6025a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
6035a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Debug.stopMethodTracing();
6045a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
6055a60e47497f21f64e6d79420dc4c56c1907df22akschulz
6065a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public void testFolderPath() {
6075a60e47497f21f64e6d79420dc4c56c1907df22akschulz        initTestSetup();
6085a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Log.d(TAG, "**** testFolderPath **** ");
6095a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapFolderElement fe = getInbox();
6105a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapFolderElement folder = fe.getFolderById(fe.getFolderId());
6115a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if(folder == null) {
6125a60e47497f21f64e6d79420dc4c56c1907df22akschulz            Log.d(TAG, "**** testFolderPath unable to find the folder with id: " +
6135a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    fe.getFolderId());
6145a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
6155a60e47497f21f64e6d79420dc4c56c1907df22akschulz        else {
6165a60e47497f21f64e6d79420dc4c56c1907df22akschulz            Log.d(TAG, "**** testFolderPath found the folder with id: " +
6175a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    fe.getFolderId() + "\nFull path: " +
6185a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    folder.getFullPath());
6195a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
6205a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
6215a60e47497f21f64e6d79420dc4c56c1907df22akschulz
6225a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public void testFolderElement() {
6235a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Log.d(TAG, "**** testFolderElement **** ");
6245a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapFolderElement fe = new BluetoothMapFolderElement("root", null);
6255a60e47497f21f64e6d79420dc4c56c1907df22akschulz        fe = fe.addEmailFolder("MsG", 1);
6265a60e47497f21f64e6d79420dc4c56c1907df22akschulz        fe.addEmailFolder("Outbox", 100);
6275a60e47497f21f64e6d79420dc4c56c1907df22akschulz        fe.addEmailFolder("Sent", 200);
6285a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapFolderElement inbox = fe.addEmailFolder("Inbox", 300);
6295a60e47497f21f64e6d79420dc4c56c1907df22akschulz        fe.addEmailFolder("Draft", 400);
6305a60e47497f21f64e6d79420dc4c56c1907df22akschulz        fe.addEmailFolder("Deleted", 500);
6315a60e47497f21f64e6d79420dc4c56c1907df22akschulz        inbox.addEmailFolder("keep", 301);
6325a60e47497f21f64e6d79420dc4c56c1907df22akschulz        inbox.addEmailFolder("private", 302);
6335a60e47497f21f64e6d79420dc4c56c1907df22akschulz        inbox.addEmailFolder("junk", 303);
6345a60e47497f21f64e6d79420dc4c56c1907df22akschulz
6355a60e47497f21f64e6d79420dc4c56c1907df22akschulz        BluetoothMapFolderElement folder = fe.getFolderById(400);
6365a60e47497f21f64e6d79420dc4c56c1907df22akschulz        assertEquals("draft", folder.getName());
6375a60e47497f21f64e6d79420dc4c56c1907df22akschulz        assertEquals("private", fe.getFolderById(302).getName());
6385a60e47497f21f64e6d79420dc4c56c1907df22akschulz        assertEquals("junk", fe.getRoot().getFolderById(303).getName());
6395a60e47497f21f64e6d79420dc4c56c1907df22akschulz        assertEquals("msg/inbox/keep", fe.getFolderById(301).getFullPath());
6405a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
6415a60e47497f21f64e6d79420dc4c56c1907df22akschulz
6425a60e47497f21f64e6d79420dc4c56c1907df22akschulz    /*
6435a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * SMS test cases
6445a60e47497f21f64e6d79420dc4c56c1907df22akschulz     */
6455a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public void testAddSmsEntries() {
6465a60e47497f21f64e6d79420dc4c56c1907df22akschulz        int count = 1000;
6475a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mContext = this.getContext();
6485a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mResolver = mContext.getContentResolver();
6495a60e47497f21f64e6d79420dc4c56c1907df22akschulz        ContentValues values[] = new ContentValues[count];
6505a60e47497f21f64e6d79420dc4c56c1907df22akschulz        long date = System.currentTimeMillis();
6515a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Log.i(TAG, "Preparing messages...");
6525a60e47497f21f64e6d79420dc4c56c1907df22akschulz        for (int x=0;x<count;x++){
6535a60e47497f21f64e6d79420dc4c56c1907df22akschulz            //if (D) Log.d(TAG, "*** Adding dummy sms #"+x);
6545a60e47497f21f64e6d79420dc4c56c1907df22akschulz
6555a60e47497f21f64e6d79420dc4c56c1907df22akschulz            ContentValues item = new ContentValues(4);
6565a60e47497f21f64e6d79420dc4c56c1907df22akschulz            item.put("address", "1234");
6575a60e47497f21f64e6d79420dc4c56c1907df22akschulz            item.put("body", "test message "+x);
6585a60e47497f21f64e6d79420dc4c56c1907df22akschulz            item.put("date", date);
6595a60e47497f21f64e6d79420dc4c56c1907df22akschulz            item.put("read", "0");
6605a60e47497f21f64e6d79420dc4c56c1907df22akschulz
6615a60e47497f21f64e6d79420dc4c56c1907df22akschulz            values[x] = item;
6625a60e47497f21f64e6d79420dc4c56c1907df22akschulz            // Uri mUri = mResolver.insert(Uri.parse("content://sms"), item);
6635a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
6645a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Log.i(TAG, "Starting bulk insert...");
6655a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mResolver.bulkInsert(Uri.parse("content://sms"), values);
6665a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Log.i(TAG, "Bulk insert done.");
6675a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
6685a60e47497f21f64e6d79420dc4c56c1907df22akschulz
6695a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public void testAddSms() {
6705a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mContext = this.getContext();
6715a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mResolver = mContext.getContentResolver();
6725a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (D) Log.d(TAG, "*** Adding dummy sms #");
6735a60e47497f21f64e6d79420dc4c56c1907df22akschulz
6745a60e47497f21f64e6d79420dc4c56c1907df22akschulz        ContentValues item = new ContentValues();
6755a60e47497f21f64e6d79420dc4c56c1907df22akschulz        item.put("address", "1234");
6765a60e47497f21f64e6d79420dc4c56c1907df22akschulz        item.put("body", "test message");
6775a60e47497f21f64e6d79420dc4c56c1907df22akschulz        item.put("date", System.currentTimeMillis());
6785a60e47497f21f64e6d79420dc4c56c1907df22akschulz        item.put("read", "0");
6795a60e47497f21f64e6d79420dc4c56c1907df22akschulz
6805a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Uri mUri = mResolver.insert(Uri.parse("content://sms"), item);
6815a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
6825a60e47497f21f64e6d79420dc4c56c1907df22akschulz
6835a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public void testServiceSms() {
68470be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz        mContext = this.getContext();
68570be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz        mResolver = mContext.getContentResolver();
6865a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (D) Log.d(TAG, "*** Adding dummy sms #");
6875a60e47497f21f64e6d79420dc4c56c1907df22akschulz
6885a60e47497f21f64e6d79420dc4c56c1907df22akschulz        ContentValues item = new ContentValues();
6895a60e47497f21f64e6d79420dc4c56c1907df22akschulz        item.put("address", "C-Bonde");
6905a60e47497f21f64e6d79420dc4c56c1907df22akschulz        item.put("body", "test message");
6915a60e47497f21f64e6d79420dc4c56c1907df22akschulz        item.put("date", System.currentTimeMillis());
6925a60e47497f21f64e6d79420dc4c56c1907df22akschulz        item.put("read", "0");
6935a60e47497f21f64e6d79420dc4c56c1907df22akschulz
6945a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Uri mUri = mResolver.insert(Uri.parse("content://sms"), item);
6955a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
6965a60e47497f21f64e6d79420dc4c56c1907df22akschulz
6975a60e47497f21f64e6d79420dc4c56c1907df22akschulz    /*
6985a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * MMS content test cases
6995a60e47497f21f64e6d79420dc4c56c1907df22akschulz     */
7005a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public static final int MMS_FROM = 0x89;
7015a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public static final int MMS_TO = 0x97;
7025a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public static final int MMS_BCC = 0x81;
7035a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public static final int MMS_CC = 0x82;
7045a60e47497f21f64e6d79420dc4c56c1907df22akschulz
7055a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private void printMmsAddr(long id) {
7065a60e47497f21f64e6d79420dc4c56c1907df22akschulz        final String[] projection = null;
7075a60e47497f21f64e6d79420dc4c56c1907df22akschulz        String selection = new String("msg_id=" + id);
7085a60e47497f21f64e6d79420dc4c56c1907df22akschulz        String uriStr = String.format("content://mms/%d/addr", id);
7095a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Uri uriAddress = Uri.parse(uriStr);
7105a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Cursor c = mResolver.query(uriAddress, projection, selection, null, null);
7115a60e47497f21f64e6d79420dc4c56c1907df22akschulz
7125a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (c.moveToFirst()) {
7135a60e47497f21f64e6d79420dc4c56c1907df22akschulz            do {
7145a60e47497f21f64e6d79420dc4c56c1907df22akschulz                String add = c.getString(c.getColumnIndex("address"));
7155a60e47497f21f64e6d79420dc4c56c1907df22akschulz                Integer type = c.getInt(c.getColumnIndex("type"));
7165a60e47497f21f64e6d79420dc4c56c1907df22akschulz                if (type == MMS_TO) {
7175a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    if (D) Log.d(TAG, "   recipient: " + add + " (type: " + type + ")");
7185a60e47497f21f64e6d79420dc4c56c1907df22akschulz                } else if (type == MMS_FROM) {
7195a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    if (D) Log.d(TAG, "   originator: " + add + " (type: " + type + ")");
7205a60e47497f21f64e6d79420dc4c56c1907df22akschulz                } else {
7215a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    if (D) Log.d(TAG, "   address other: " + add + " (type: " + type + ")");
7225a60e47497f21f64e6d79420dc4c56c1907df22akschulz                }
7235a60e47497f21f64e6d79420dc4c56c1907df22akschulz                printCursor(c);
7245a60e47497f21f64e6d79420dc4c56c1907df22akschulz
7255a60e47497f21f64e6d79420dc4c56c1907df22akschulz            } while(c.moveToNext());
7265a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
7275a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
7285a60e47497f21f64e6d79420dc4c56c1907df22akschulz
7295a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private void printMmsPartImage(long partid) {
7305a60e47497f21f64e6d79420dc4c56c1907df22akschulz        String uriStr = String.format("content://mms/part/%d", partid);
7315a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Uri uriAddress = Uri.parse(uriStr);
7325a60e47497f21f64e6d79420dc4c56c1907df22akschulz        int ch;
7335a60e47497f21f64e6d79420dc4c56c1907df22akschulz        StringBuffer sb = new StringBuffer("");
7345a60e47497f21f64e6d79420dc4c56c1907df22akschulz        InputStream is = null;
7355a60e47497f21f64e6d79420dc4c56c1907df22akschulz
7365a60e47497f21f64e6d79420dc4c56c1907df22akschulz        try {
7375a60e47497f21f64e6d79420dc4c56c1907df22akschulz            is = mResolver.openInputStream(uriAddress);
7385a60e47497f21f64e6d79420dc4c56c1907df22akschulz
7395a60e47497f21f64e6d79420dc4c56c1907df22akschulz            while ((ch = is.read()) != -1) {
7405a60e47497f21f64e6d79420dc4c56c1907df22akschulz                sb.append((char)ch);
7415a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
7425a60e47497f21f64e6d79420dc4c56c1907df22akschulz            if (D) Log.d(TAG, sb.toString());
7435a60e47497f21f64e6d79420dc4c56c1907df22akschulz
7445a60e47497f21f64e6d79420dc4c56c1907df22akschulz        } catch (IOException e) {
7455a60e47497f21f64e6d79420dc4c56c1907df22akschulz            // do nothing for now
7465a60e47497f21f64e6d79420dc4c56c1907df22akschulz            e.printStackTrace();
7475a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
7485a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
7495a60e47497f21f64e6d79420dc4c56c1907df22akschulz
7505a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private void printMmsParts(long id) {
7515a60e47497f21f64e6d79420dc4c56c1907df22akschulz        final String[] projection = null;
7525a60e47497f21f64e6d79420dc4c56c1907df22akschulz        String selection = new String("mid=" + id);
7535a60e47497f21f64e6d79420dc4c56c1907df22akschulz        String uriStr = String.format("content://mms/%d/part", id);
7545a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Uri uriAddress = Uri.parse(uriStr);
7555a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Cursor c = mResolver.query(uriAddress, projection, selection, null, null);
7565a60e47497f21f64e6d79420dc4c56c1907df22akschulz
7575a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (c.moveToFirst()) {
7585a60e47497f21f64e6d79420dc4c56c1907df22akschulz            int i = 0;
7595a60e47497f21f64e6d79420dc4c56c1907df22akschulz            do {
7605a60e47497f21f64e6d79420dc4c56c1907df22akschulz                if (D) Log.d(TAG, "   part " + i++);
7615a60e47497f21f64e6d79420dc4c56c1907df22akschulz                printCursor(c);
7625a60e47497f21f64e6d79420dc4c56c1907df22akschulz
7635a60e47497f21f64e6d79420dc4c56c1907df22akschulz                /* if (ct.equals("image/jpeg")) { */
7645a60e47497f21f64e6d79420dc4c56c1907df22akschulz                /*     printMmsPartImage(partid); */
7655a60e47497f21f64e6d79420dc4c56c1907df22akschulz                /* } */
7665a60e47497f21f64e6d79420dc4c56c1907df22akschulz            } while(c.moveToNext());
7675a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
76870be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz    }
7695a60e47497f21f64e6d79420dc4c56c1907df22akschulz
7705a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public void dumpMmsTable() {
7715a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mContext = this.getContext();
7725a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mResolver = mContext.getContentResolver();
7735a60e47497f21f64e6d79420dc4c56c1907df22akschulz
7745a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (D) Log.d(TAG, "**** Dump of mms table ****");
7755a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Cursor c = mResolver.query(Mms.CONTENT_URI,
7765a60e47497f21f64e6d79420dc4c56c1907df22akschulz                null, null, null, "_id DESC");
7775a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (c != null) {
7785a60e47497f21f64e6d79420dc4c56c1907df22akschulz            if (D) Log.d(TAG, "c.getCount() = " + c.getCount());
7795a60e47497f21f64e6d79420dc4c56c1907df22akschulz            c.moveToPosition(-1);
7805a60e47497f21f64e6d79420dc4c56c1907df22akschulz            while (c.moveToNext()) {
7815a60e47497f21f64e6d79420dc4c56c1907df22akschulz                Log.d(TAG,"Message:");
7825a60e47497f21f64e6d79420dc4c56c1907df22akschulz                printCursor(c);
7835a60e47497f21f64e6d79420dc4c56c1907df22akschulz                long id = c.getLong(c.getColumnIndex(BaseColumns._ID));
7845a60e47497f21f64e6d79420dc4c56c1907df22akschulz                Log.d(TAG,"Address:");
7855a60e47497f21f64e6d79420dc4c56c1907df22akschulz                printMmsAddr(id);
7865a60e47497f21f64e6d79420dc4c56c1907df22akschulz                Log.d(TAG,"Parts:");
7875a60e47497f21f64e6d79420dc4c56c1907df22akschulz                printMmsParts(id);
7885a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
7895a60e47497f21f64e6d79420dc4c56c1907df22akschulz            c.close();
7905a60e47497f21f64e6d79420dc4c56c1907df22akschulz        } else {
7915a60e47497f21f64e6d79420dc4c56c1907df22akschulz            Log.d(TAG, "query failed");
7925a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
79370be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz    }
7945a60e47497f21f64e6d79420dc4c56c1907df22akschulz
7955a60e47497f21f64e6d79420dc4c56c1907df22akschulz    /**
7965a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * This dumps the thread database.
7975a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * Interesting how useful this is.
7985a60e47497f21f64e6d79420dc4c56c1907df22akschulz     *  - DATE is described to be the creation date of the thread. But it actually
7995a60e47497f21f64e6d79420dc4c56c1907df22akschulz     *    contains the time-date of the last activity of the thread.
8005a60e47497f21f64e6d79420dc4c56c1907df22akschulz     *  - RECIPIENTS is a list of the contacts related to the thread. The number can
8015a60e47497f21f64e6d79420dc4c56c1907df22akschulz     *    be found for both MMS and SMS in the "canonical-addresses" table.
8025a60e47497f21f64e6d79420dc4c56c1907df22akschulz     *  - The READ column tells if the thread have been read. (read = 1: no unread messages)
8035a60e47497f21f64e6d79420dc4c56c1907df22akschulz     *  - The snippet is a small piece of text from the last message, and could be used as thread
8045a60e47497f21f64e6d79420dc4c56c1907df22akschulz     *    name. Please however note that if we do this, the version-counter should change each
8055a60e47497f21f64e6d79420dc4c56c1907df22akschulz     *    time a message is added to the thread. But since it changes the read attribute and
8065a60e47497f21f64e6d79420dc4c56c1907df22akschulz     *    last activity, it changes anyway.
8075a60e47497f21f64e6d79420dc4c56c1907df22akschulz     *  -
8085a60e47497f21f64e6d79420dc4c56c1907df22akschulz     */
8095a60e47497f21f64e6d79420dc4c56c1907df22akschulz
8105a60e47497f21f64e6d79420dc4c56c1907df22akschulz
8115a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public void dumpThreadsTable() {
8125a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mContext = this.getContext();
8135a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mResolver = mContext.getContentResolver();
8145a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mContacts.clearCache();
8155a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Uri uri = Threads.CONTENT_URI.buildUpon().appendQueryParameter("simple", "true").build();
8165a60e47497f21f64e6d79420dc4c56c1907df22akschulz
8175a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (D) Log.d(TAG, "**** Dump of Threads table ****\nUri: " + uri);
8185a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Cursor c = mResolver.query(uri,
8195a60e47497f21f64e6d79420dc4c56c1907df22akschulz                null, null, null, "_id DESC");
8205a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (c != null) {
8215a60e47497f21f64e6d79420dc4c56c1907df22akschulz            if (D) Log.d(TAG, "c.getCount() = " + c.getCount());
8225a60e47497f21f64e6d79420dc4c56c1907df22akschulz            c.moveToPosition(-1);
8235a60e47497f21f64e6d79420dc4c56c1907df22akschulz            while (c.moveToNext()) {
8245a60e47497f21f64e6d79420dc4c56c1907df22akschulz                Log.d(TAG,"Threads:");
8255a60e47497f21f64e6d79420dc4c56c1907df22akschulz                printCursor(c);
8265a60e47497f21f64e6d79420dc4c56c1907df22akschulz                String ids = c.getString(c.getColumnIndex(Threads.RECIPIENT_IDS));
8275a60e47497f21f64e6d79420dc4c56c1907df22akschulz                Log.d(TAG,"Address:");
8285a60e47497f21f64e6d79420dc4c56c1907df22akschulz                printAddresses(ids);
8295a60e47497f21f64e6d79420dc4c56c1907df22akschulz/*                Log.d(TAG,"Parts:");
8305a60e47497f21f64e6d79420dc4c56c1907df22akschulz                printMmsParts(id);*/
8315a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
8325a60e47497f21f64e6d79420dc4c56c1907df22akschulz            c.close();
8335a60e47497f21f64e6d79420dc4c56c1907df22akschulz        } else {
8345a60e47497f21f64e6d79420dc4c56c1907df22akschulz            Log.d(TAG, "query failed");
8355a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
8365a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
8375a60e47497f21f64e6d79420dc4c56c1907df22akschulz
8385a60e47497f21f64e6d79420dc4c56c1907df22akschulz    /**
8395a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * This test shows the content of the canonicalAddresses table.
8405a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * Conclusion:
8415a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * The _id column matches the id's from the RECIPIENT_IDS column
8425a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * in the Threads table, hence are to be used to map from an id to
8435a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * a phone number, which then can be matched to a contact.
8445a60e47497f21f64e6d79420dc4c56c1907df22akschulz     */
8455a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public void dumpCanAddrTable() {
8465a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mContext = this.getContext();
8475a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mResolver = mContext.getContentResolver();
8485a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Uri uri = Uri.parse("content://mms-sms/canonical-addresses");
8495a60e47497f21f64e6d79420dc4c56c1907df22akschulz        uri = MmsSms.CONTENT_URI.buildUpon().appendPath("canonical-addresses").build();
8505a60e47497f21f64e6d79420dc4c56c1907df22akschulz        dumpUri(uri);
8515a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
8525a60e47497f21f64e6d79420dc4c56c1907df22akschulz
8535a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public void dumpUri(Uri uri) {
8545a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (D) Log.d(TAG, "**** Dump of table ****\nUri: " + uri);
8555a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Cursor c = mResolver.query(uri, null, null, null, null);
8565a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (c != null) {
8575a60e47497f21f64e6d79420dc4c56c1907df22akschulz            if (D) Log.d(TAG, "c.getCount() = " + c.getCount());
8585a60e47497f21f64e6d79420dc4c56c1907df22akschulz            c.moveToPosition(-1);
8595a60e47497f21f64e6d79420dc4c56c1907df22akschulz            while (c.moveToNext()) {
8605a60e47497f21f64e6d79420dc4c56c1907df22akschulz                Log.d(TAG,"Entry: " + c.getPosition());
8615a60e47497f21f64e6d79420dc4c56c1907df22akschulz                printCursor(c);
8625a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
8635a60e47497f21f64e6d79420dc4c56c1907df22akschulz            c.close();
8645a60e47497f21f64e6d79420dc4c56c1907df22akschulz        } else {
8655a60e47497f21f64e6d79420dc4c56c1907df22akschulz            Log.d(TAG, "query failed");
8665a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
8675a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
8685a60e47497f21f64e6d79420dc4c56c1907df22akschulz
8695a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private void printAddresses(String idsStr) {
8705a60e47497f21f64e6d79420dc4c56c1907df22akschulz        String[] ids = idsStr.split(" ");
8715a60e47497f21f64e6d79420dc4c56c1907df22akschulz        for (String id : ids) {
8725a60e47497f21f64e6d79420dc4c56c1907df22akschulz            long longId;
8735a60e47497f21f64e6d79420dc4c56c1907df22akschulz            try {
8745a60e47497f21f64e6d79420dc4c56c1907df22akschulz                longId = Long.parseLong(id);
8755a60e47497f21f64e6d79420dc4c56c1907df22akschulz                String addr = mContacts.getPhoneNumber(mResolver, longId);
8765a60e47497f21f64e6d79420dc4c56c1907df22akschulz                MapContact contact = mContacts.getContactNameFromPhone(addr, mResolver);
8775a60e47497f21f64e6d79420dc4c56c1907df22akschulz                Log.d(TAG, "  id " + id + ": " + addr + " - " + contact.getName()
8785a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        + "  X-BT-UID: " + contact.getXBtUidString());
8795a60e47497f21f64e6d79420dc4c56c1907df22akschulz            } catch (NumberFormatException ex) {
8805a60e47497f21f64e6d79420dc4c56c1907df22akschulz                // skip this id
8815a60e47497f21f64e6d79420dc4c56c1907df22akschulz                continue;
8825a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
8835a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
8845a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
8855a60e47497f21f64e6d79420dc4c56c1907df22akschulz
88670be005a18a35ec5fcb46152f0dfbe82156efa3aKim Schulz}
887