15a60e47497f21f64e6d79420dc4c56c1907df22akschulz/*
25a60e47497f21f64e6d79420dc4c56c1907df22akschulz* Copyright (C) 2014 Samsung System LSI
35a60e47497f21f64e6d79420dc4c56c1907df22akschulz* Licensed under the Apache License, Version 2.0 (the "License");
45a60e47497f21f64e6d79420dc4c56c1907df22akschulz* you may not use this file except in compliance with the License.
55a60e47497f21f64e6d79420dc4c56c1907df22akschulz* You may obtain a copy of the License at
65a60e47497f21f64e6d79420dc4c56c1907df22akschulz*
75a60e47497f21f64e6d79420dc4c56c1907df22akschulz*      http://www.apache.org/licenses/LICENSE-2.0
85a60e47497f21f64e6d79420dc4c56c1907df22akschulz*
95a60e47497f21f64e6d79420dc4c56c1907df22akschulz* Unless required by applicable law or agreed to in writing, software
105a60e47497f21f64e6d79420dc4c56c1907df22akschulz* distributed under the License is distributed on an "AS IS" BASIS,
115a60e47497f21f64e6d79420dc4c56c1907df22akschulz* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
125a60e47497f21f64e6d79420dc4c56c1907df22akschulz* See the License for the specific language governing permissions and
135a60e47497f21f64e6d79420dc4c56c1907df22akschulz* limitations under the License.
145a60e47497f21f64e6d79420dc4c56c1907df22akschulz*/
155a60e47497f21f64e6d79420dc4c56c1907df22akschulz
165a60e47497f21f64e6d79420dc4c56c1907df22akschulzpackage com.android.bluetooth.map;
175a60e47497f21f64e6d79420dc4c56c1907df22akschulz
185a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.util.ArrayList;
195a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.util.LinkedHashMap;
205a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport java.util.List;
215a60e47497f21f64e6d79420dc4c56c1907df22akschulz
225a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.map.BluetoothMapAccountItem;
235a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.map.BluetoothMapUtils.TYPE;
245a60e47497f21f64e6d79420dc4c56c1907df22akschulz
255a60e47497f21f64e6d79420dc4c56c1907df22akschulz
265a60e47497f21f64e6d79420dc4c56c1907df22akschulz
275a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.content.ContentProviderClient;
285a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.content.ContentResolver;
295a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.content.Context;
305a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.content.Intent;
315a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.content.pm.ApplicationInfo;
325a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.content.pm.PackageInfo;
335a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.content.pm.PackageManager;
345a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.content.pm.PackageManager.NameNotFoundException;
355a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.content.pm.ProviderInfo;
365a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.content.pm.ResolveInfo;
375a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.database.Cursor;
385a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.net.Uri;
395a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.os.RemoteException;
405a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport com.android.bluetooth.mapapi.BluetoothMapContract;
415a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.text.format.DateUtils;
425a60e47497f21f64e6d79420dc4c56c1907df22akschulzimport android.util.Log;
435a60e47497f21f64e6d79420dc4c56c1907df22akschulz
445a60e47497f21f64e6d79420dc4c56c1907df22akschulz
455a60e47497f21f64e6d79420dc4c56c1907df22akschulzpublic class BluetoothMapAccountLoader {
465a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private static final String TAG = "BluetoothMapAccountLoader";
475a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private static final boolean D = BluetoothMapService.DEBUG;
485a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private static final boolean V = BluetoothMapService.VERBOSE;
495a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private Context mContext = null;
505a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private PackageManager mPackageManager = null;
515a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private ContentResolver mResolver;
525a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private int mAccountsEnabledCount = 0;
535a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private ContentProviderClient mProviderClient = null;
545a60e47497f21f64e6d79420dc4c56c1907df22akschulz    private static final long PROVIDER_ANR_TIMEOUT = 20 * DateUtils.SECOND_IN_MILLIS;
555a60e47497f21f64e6d79420dc4c56c1907df22akschulz
565a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public BluetoothMapAccountLoader(Context ctx)
575a60e47497f21f64e6d79420dc4c56c1907df22akschulz    {
585a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mContext = ctx;
595a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
605a60e47497f21f64e6d79420dc4c56c1907df22akschulz
615a60e47497f21f64e6d79420dc4c56c1907df22akschulz    /**
625a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * Method to look through all installed packages system-wide and find those that contain one of
635a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * the BT-MAP intents in their manifest file. For each app the list of accounts are fetched
645a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * using the method parseAccounts().
655a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * @return LinkedHashMap with the packages as keys(BluetoothMapAccountItem) and
665a60e47497f21f64e6d79420dc4c56c1907df22akschulz     *          values as ArrayLists of BluetoothMapAccountItems.
675a60e47497f21f64e6d79420dc4c56c1907df22akschulz     */
685a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public LinkedHashMap<BluetoothMapAccountItem,
695a60e47497f21f64e6d79420dc4c56c1907df22akschulz                         ArrayList<BluetoothMapAccountItem>> parsePackages(boolean includeIcon) {
705a60e47497f21f64e6d79420dc4c56c1907df22akschulz
715a60e47497f21f64e6d79420dc4c56c1907df22akschulz        LinkedHashMap<BluetoothMapAccountItem, ArrayList<BluetoothMapAccountItem>> groups =
725a60e47497f21f64e6d79420dc4c56c1907df22akschulz                new LinkedHashMap<BluetoothMapAccountItem,
735a60e47497f21f64e6d79420dc4c56c1907df22akschulz                                  ArrayList<BluetoothMapAccountItem>>();
745a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Intent[] searchIntents = new Intent[2];
755a60e47497f21f64e6d79420dc4c56c1907df22akschulz        //Array <Intent> searchIntents = new Array <Intent>();
765a60e47497f21f64e6d79420dc4c56c1907df22akschulz        searchIntents[0] = new Intent(BluetoothMapContract.PROVIDER_INTERFACE_EMAIL);
775a60e47497f21f64e6d79420dc4c56c1907df22akschulz        searchIntents[1] = new Intent(BluetoothMapContract.PROVIDER_INTERFACE_IM);
785a60e47497f21f64e6d79420dc4c56c1907df22akschulz        // reset the counter every time this method is called.
795a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mAccountsEnabledCount=0;
805a60e47497f21f64e6d79420dc4c56c1907df22akschulz        // find all installed packages and filter out those that do not support Bluetooth Map.
815a60e47497f21f64e6d79420dc4c56c1907df22akschulz        // this is done by looking for a apps with content providers containing the intent-filter
825a60e47497f21f64e6d79420dc4c56c1907df22akschulz        // in the manifest file.
835a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mPackageManager = mContext.getPackageManager();
845a60e47497f21f64e6d79420dc4c56c1907df22akschulz
855a60e47497f21f64e6d79420dc4c56c1907df22akschulz        for (Intent searchIntent : searchIntents) {
865a60e47497f21f64e6d79420dc4c56c1907df22akschulz            List<ResolveInfo> resInfos =
875a60e47497f21f64e6d79420dc4c56c1907df22akschulz                mPackageManager.queryIntentContentProviders(searchIntent, 0);
885a60e47497f21f64e6d79420dc4c56c1907df22akschulz            if (resInfos != null ) {
895a60e47497f21f64e6d79420dc4c56c1907df22akschulz                if(D) Log.d(TAG,"Found " + resInfos.size() + " application(s) with intent "
905a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        + searchIntent.getAction().toString());
915a60e47497f21f64e6d79420dc4c56c1907df22akschulz                BluetoothMapUtils.TYPE msgType = (searchIntent.getAction().toString() ==
925a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        BluetoothMapContract.PROVIDER_INTERFACE_EMAIL) ?
935a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        BluetoothMapUtils.TYPE.EMAIL : BluetoothMapUtils.TYPE.IM;
945a60e47497f21f64e6d79420dc4c56c1907df22akschulz                for (ResolveInfo rInfo : resInfos) {
955a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    if(D) Log.d(TAG,"ResolveInfo " + rInfo.toString());
965a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    // We cannot rely on apps that have been force-stopped in the
975a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    // application settings menu.
985a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    if ((rInfo.providerInfo.applicationInfo.flags &
995a60e47497f21f64e6d79420dc4c56c1907df22akschulz                            ApplicationInfo.FLAG_STOPPED) == 0) {
1005a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        BluetoothMapAccountItem app = createAppItem(rInfo, includeIcon, msgType);
1015a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        if (app != null){
1025a60e47497f21f64e6d79420dc4c56c1907df22akschulz                            ArrayList<BluetoothMapAccountItem> accounts = parseAccounts(app);
1035a60e47497f21f64e6d79420dc4c56c1907df22akschulz                            // we do not want to list apps without accounts
1045a60e47497f21f64e6d79420dc4c56c1907df22akschulz                            if(accounts.size() > 0)
1055a60e47497f21f64e6d79420dc4c56c1907df22akschulz                            {// we need to make sure that the "select all" checkbox
1065a60e47497f21f64e6d79420dc4c56c1907df22akschulz                             // is checked if all accounts in the list are checked
1075a60e47497f21f64e6d79420dc4c56c1907df22akschulz                                app.mIsChecked = true;
1085a60e47497f21f64e6d79420dc4c56c1907df22akschulz                                for (BluetoothMapAccountItem acc: accounts)
1095a60e47497f21f64e6d79420dc4c56c1907df22akschulz                                {
1105a60e47497f21f64e6d79420dc4c56c1907df22akschulz                                    if(!acc.mIsChecked)
1115a60e47497f21f64e6d79420dc4c56c1907df22akschulz                                    {
1125a60e47497f21f64e6d79420dc4c56c1907df22akschulz                                        app.mIsChecked = false;
1135a60e47497f21f64e6d79420dc4c56c1907df22akschulz                                        break;
1145a60e47497f21f64e6d79420dc4c56c1907df22akschulz                                    }
1155a60e47497f21f64e6d79420dc4c56c1907df22akschulz                                }
1165a60e47497f21f64e6d79420dc4c56c1907df22akschulz                                groups.put(app, accounts);
1175a60e47497f21f64e6d79420dc4c56c1907df22akschulz                            }
1185a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        }
1195a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    } else {
1205a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        if(D)Log.d(TAG,"Ignoring force-stopped authority "
1215a60e47497f21f64e6d79420dc4c56c1907df22akschulz                                + rInfo.providerInfo.authority +"\n");
1225a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    }
1235a60e47497f21f64e6d79420dc4c56c1907df22akschulz                }
1245a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
1255a60e47497f21f64e6d79420dc4c56c1907df22akschulz            else {
1265a60e47497f21f64e6d79420dc4c56c1907df22akschulz                if(D) Log.d(TAG,"Found no applications");
1275a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
1285a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
1295a60e47497f21f64e6d79420dc4c56c1907df22akschulz        return groups;
1305a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
1315a60e47497f21f64e6d79420dc4c56c1907df22akschulz
1325a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public BluetoothMapAccountItem createAppItem(ResolveInfo rInfo, boolean includeIcon,
1335a60e47497f21f64e6d79420dc4c56c1907df22akschulz            BluetoothMapUtils.TYPE type) {
1345a60e47497f21f64e6d79420dc4c56c1907df22akschulz        String provider = rInfo.providerInfo.authority;
1355a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if(provider != null) {
1365a60e47497f21f64e6d79420dc4c56c1907df22akschulz            String name = rInfo.loadLabel(mPackageManager).toString();
1375a60e47497f21f64e6d79420dc4c56c1907df22akschulz            if(D)Log.d(TAG,rInfo.providerInfo.packageName + " - " + name +
1385a60e47497f21f64e6d79420dc4c56c1907df22akschulz                            " - meta-data(provider = " + provider+")\n");
1395a60e47497f21f64e6d79420dc4c56c1907df22akschulz            BluetoothMapAccountItem app = BluetoothMapAccountItem.create(
1405a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    "0",
1415a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    name,
1425a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    rInfo.providerInfo.packageName,
1435a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    provider,
1445a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    (includeIcon == false)? null : rInfo.loadIcon(mPackageManager),
1455a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    type);
1465a60e47497f21f64e6d79420dc4c56c1907df22akschulz            return app;
1475a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
1485a60e47497f21f64e6d79420dc4c56c1907df22akschulz
1495a60e47497f21f64e6d79420dc4c56c1907df22akschulz        return null;
1505a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
1515a60e47497f21f64e6d79420dc4c56c1907df22akschulz
1525a60e47497f21f64e6d79420dc4c56c1907df22akschulz    /**
1535a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * Method for getting the accounts under a given contentprovider from a package.
1545a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * @param app The parent app object
1555a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * @return An ArrayList of BluetoothMapAccountItems containing all the accounts from the app
1565a60e47497f21f64e6d79420dc4c56c1907df22akschulz     */
1575a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public ArrayList<BluetoothMapAccountItem> parseAccounts(BluetoothMapAccountItem app)  {
1585a60e47497f21f64e6d79420dc4c56c1907df22akschulz        Cursor c = null;
1595a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if(D) Log.d(TAG,"Finding accounts for app "+app.getPackageName());
1605a60e47497f21f64e6d79420dc4c56c1907df22akschulz        ArrayList<BluetoothMapAccountItem> children = new ArrayList<BluetoothMapAccountItem>();
1615a60e47497f21f64e6d79420dc4c56c1907df22akschulz        // Get the list of accounts from the email apps content resolver (if possible)
1625a60e47497f21f64e6d79420dc4c56c1907df22akschulz        mResolver = mContext.getContentResolver();
1635a60e47497f21f64e6d79420dc4c56c1907df22akschulz        try{
1645a60e47497f21f64e6d79420dc4c56c1907df22akschulz            mProviderClient = mResolver.acquireUnstableContentProviderClient(
1655a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    Uri.parse(app.mBase_uri_no_account));
1665a60e47497f21f64e6d79420dc4c56c1907df22akschulz            if (mProviderClient == null) {
1675a60e47497f21f64e6d79420dc4c56c1907df22akschulz                throw new RemoteException("Failed to acquire provider for " + app.getPackageName());
1685a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
1695a60e47497f21f64e6d79420dc4c56c1907df22akschulz            mProviderClient.setDetectNotResponding(PROVIDER_ANR_TIMEOUT);
1705a60e47497f21f64e6d79420dc4c56c1907df22akschulz
1715a60e47497f21f64e6d79420dc4c56c1907df22akschulz            Uri uri = Uri.parse(app.mBase_uri_no_account + "/"
1725a60e47497f21f64e6d79420dc4c56c1907df22akschulz                                + BluetoothMapContract.TABLE_ACCOUNT);
1735a60e47497f21f64e6d79420dc4c56c1907df22akschulz
1745a60e47497f21f64e6d79420dc4c56c1907df22akschulz            if(app.getType() == TYPE.IM) {
1755a60e47497f21f64e6d79420dc4c56c1907df22akschulz                c = mProviderClient.query(uri, BluetoothMapContract.BT_IM_ACCOUNT_PROJECTION,
1765a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        null, null, BluetoothMapContract.AccountColumns._ID+" DESC");
1775a60e47497f21f64e6d79420dc4c56c1907df22akschulz            } else {
1785a60e47497f21f64e6d79420dc4c56c1907df22akschulz                c = mProviderClient.query(uri, BluetoothMapContract.BT_ACCOUNT_PROJECTION,
1795a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        null, null, BluetoothMapContract.AccountColumns._ID+" DESC");
1805a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
1815a60e47497f21f64e6d79420dc4c56c1907df22akschulz        } catch (RemoteException e){
1825a60e47497f21f64e6d79420dc4c56c1907df22akschulz            if(D)Log.d(TAG,"Could not establish ContentProviderClient for "+app.getPackageName()+
1835a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    " - returning empty account list" );
1845a60e47497f21f64e6d79420dc4c56c1907df22akschulz            return children;
1855a60e47497f21f64e6d79420dc4c56c1907df22akschulz        } finally {
1862dd6813dc36bff3bbb6c81f61b5321b0269673fbHemant Gupta            if (mProviderClient != null)
1872dd6813dc36bff3bbb6c81f61b5321b0269673fbHemant Gupta                mProviderClient.release();
1885a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
1895a60e47497f21f64e6d79420dc4c56c1907df22akschulz
1905a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if (c != null) {
1915a60e47497f21f64e6d79420dc4c56c1907df22akschulz            c.moveToPosition(-1);
1925a60e47497f21f64e6d79420dc4c56c1907df22akschulz            int idIndex = c.getColumnIndex(BluetoothMapContract.AccountColumns._ID);
1935a60e47497f21f64e6d79420dc4c56c1907df22akschulz            int dispNameIndex = c.getColumnIndex(
1945a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    BluetoothMapContract.AccountColumns.ACCOUNT_DISPLAY_NAME);
1955a60e47497f21f64e6d79420dc4c56c1907df22akschulz            int exposeIndex = c.getColumnIndex(BluetoothMapContract.AccountColumns.FLAG_EXPOSE);
1965a60e47497f21f64e6d79420dc4c56c1907df22akschulz            int uciIndex = c.getColumnIndex(BluetoothMapContract.AccountColumns.ACCOUNT_UCI);
1975a60e47497f21f64e6d79420dc4c56c1907df22akschulz            int uciPreIndex = c.getColumnIndex(
1985a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    BluetoothMapContract.AccountColumns.ACCOUNT_UCI_PREFIX);
1995a60e47497f21f64e6d79420dc4c56c1907df22akschulz            while (c.moveToNext()) {
2005a60e47497f21f64e6d79420dc4c56c1907df22akschulz                if(D)Log.d(TAG,"Adding account " + c.getString(dispNameIndex) +
2015a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        " with ID " + String.valueOf(c.getInt(idIndex)));
2025a60e47497f21f64e6d79420dc4c56c1907df22akschulz                String uci = null;
2035a60e47497f21f64e6d79420dc4c56c1907df22akschulz                String uciPrefix = null;
2045a60e47497f21f64e6d79420dc4c56c1907df22akschulz                if(app.getType() == TYPE.IM){
2055a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    uci = c.getString(uciIndex);
2065a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    uciPrefix = c.getString(uciPreIndex);
2075a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    if(D)Log.d(TAG,"   Account UCI " + uci);
2085a60e47497f21f64e6d79420dc4c56c1907df22akschulz                }
2095a60e47497f21f64e6d79420dc4c56c1907df22akschulz
2105a60e47497f21f64e6d79420dc4c56c1907df22akschulz                BluetoothMapAccountItem child = BluetoothMapAccountItem.create(
2115a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        String.valueOf((c.getInt(idIndex))),
2125a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        c.getString(dispNameIndex),
2135a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        app.getPackageName(),
2145a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        app.getProviderAuthority(),
2155a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        null,
2165a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        app.getType(),
2175a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        uci,
2185a60e47497f21f64e6d79420dc4c56c1907df22akschulz                        uciPrefix);
2195a60e47497f21f64e6d79420dc4c56c1907df22akschulz
2205a60e47497f21f64e6d79420dc4c56c1907df22akschulz                child.mIsChecked = (c.getInt(exposeIndex) != 0);
2215a60e47497f21f64e6d79420dc4c56c1907df22akschulz                child.mIsChecked = true; // TODO: Revert when this works
2225a60e47497f21f64e6d79420dc4c56c1907df22akschulz                /* update the account counter
2235a60e47497f21f64e6d79420dc4c56c1907df22akschulz                 * so we can make sure that not to many accounts are checked. */
2245a60e47497f21f64e6d79420dc4c56c1907df22akschulz                if(child.mIsChecked)
2255a60e47497f21f64e6d79420dc4c56c1907df22akschulz                {
2265a60e47497f21f64e6d79420dc4c56c1907df22akschulz                    mAccountsEnabledCount++;
2275a60e47497f21f64e6d79420dc4c56c1907df22akschulz                }
2285a60e47497f21f64e6d79420dc4c56c1907df22akschulz                children.add(child);
2295a60e47497f21f64e6d79420dc4c56c1907df22akschulz            }
2305a60e47497f21f64e6d79420dc4c56c1907df22akschulz            c.close();
2315a60e47497f21f64e6d79420dc4c56c1907df22akschulz        } else {
2325a60e47497f21f64e6d79420dc4c56c1907df22akschulz            if(D)Log.d(TAG, "query failed");
2335a60e47497f21f64e6d79420dc4c56c1907df22akschulz        }
2345a60e47497f21f64e6d79420dc4c56c1907df22akschulz        return children;
2355a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
2365a60e47497f21f64e6d79420dc4c56c1907df22akschulz    /**
2375a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * Gets the number of enabled accounts in total across all supported apps.
2385a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * NOTE that this method should not be called before the parsePackages method
2395a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * has been successfully called.
2405a60e47497f21f64e6d79420dc4c56c1907df22akschulz     * @return number of enabled accounts
2415a60e47497f21f64e6d79420dc4c56c1907df22akschulz     */
2425a60e47497f21f64e6d79420dc4c56c1907df22akschulz    public int getAccountsEnabledCount() {
2435a60e47497f21f64e6d79420dc4c56c1907df22akschulz        if(D)Log.d(TAG,"Enabled Accounts count:"+ mAccountsEnabledCount);
2445a60e47497f21f64e6d79420dc4c56c1907df22akschulz        return mAccountsEnabledCount;
2455a60e47497f21f64e6d79420dc4c56c1907df22akschulz    }
2465a60e47497f21f64e6d79420dc4c56c1907df22akschulz
2475a60e47497f21f64e6d79420dc4c56c1907df22akschulz}
248