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