diff options
10 files changed, 91 insertions, 750 deletions
diff --git a/res/values/unrestricted_packages.xml b/res/values/unrestricted_packages.xml deleted file mode 100644 index 94011c8..0000000 --- a/res/values/unrestricted_packages.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2009 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - - <!-- The list of packages that have access to data that is marked as being restricted --> - <string-array name="unrestricted_packages" translatable="false"> - - <item>com.android.contacts</item> - - </string-array> - -</resources> diff --git a/src/com/android/providers/contacts/ContactAggregator.java b/src/com/android/providers/contacts/ContactAggregator.java index 2260cb6..c6d5493 100644 --- a/src/com/android/providers/contacts/ContactAggregator.java +++ b/src/com/android/providers/contacts/ContactAggregator.java @@ -1531,7 +1531,6 @@ public class ContactAggregator { + RawContacts.LAST_TIME_CONTACTED + "," + RawContacts.TIMES_CONTACTED + "," + RawContacts.STARRED + "," - + RawContacts.IS_RESTRICTED + "," + RawContacts.NAME_VERIFIED + "," + DataColumns.CONCRETE_ID + "," + DataColumns.CONCRETE_MIMETYPE_ID + "," @@ -1562,11 +1561,10 @@ public class ContactAggregator { int LAST_TIME_CONTACTED = 8; int TIMES_CONTACTED = 9; int STARRED = 10; - int IS_RESTRICTED = 11; - int NAME_VERIFIED = 12; - int DATA_ID = 13; - int MIMETYPE_ID = 14; - int IS_SUPER_PRIMARY = 15; + int NAME_VERIFIED = 11; + int DATA_ID = 12; + int MIMETYPE_ID = 13; + int IS_SUPER_PRIMARY = 14; } private interface ContactReplaceSqlStatement { @@ -1581,7 +1579,6 @@ public class ContactAggregator { + Contacts.TIMES_CONTACTED + "=?, " + Contacts.STARRED + "=?, " + Contacts.HAS_PHONE_NUMBER + "=?, " - + ContactsColumns.SINGLE_IS_RESTRICTED + "=?, " + Contacts.LOOKUP_KEY + "=? " + " WHERE " + Contacts._ID + "=?"; @@ -1595,9 +1592,8 @@ public class ContactAggregator { + Contacts.TIMES_CONTACTED + ", " + Contacts.STARRED + ", " + Contacts.HAS_PHONE_NUMBER + ", " - + ContactsColumns.SINGLE_IS_RESTRICTED + ", " + Contacts.LOOKUP_KEY + ") " + - " VALUES (?,?,?,?,?,?,?,?,?,?)"; + " VALUES (?,?,?,?,?,?,?,?,?)"; int NAME_RAW_CONTACT_ID = 1; int PHOTO_ID = 2; @@ -1607,9 +1603,8 @@ public class ContactAggregator { int TIMES_CONTACTED = 6; int STARRED = 7; int HAS_PHONE_NUMBER = 8; - int SINGLE_IS_RESTRICTED = 9; - int LOOKUP_KEY = 10; - int CONTACT_ID = 11; + int LOOKUP_KEY = 9; + int CONTACT_ID = 10; } /** @@ -1636,7 +1631,6 @@ public class ContactAggregator { long contactLastTimeContacted = 0; int contactTimesContacted = 0; int contactStarred = 0; - int singleIsRestricted = 1; int hasPhoneNumber = 0; mDisplayNameCandidate.clear(); @@ -1687,19 +1681,6 @@ public class ContactAggregator { contactStarred = 1; } - // Single restricted - if (totalRowCount > 1) { - // Not single - singleIsRestricted = 0; - } else { - int isRestricted = c.getInt(RawContactsQuery.IS_RESTRICTED); - - if (isRestricted == 0) { - // Not restricted - singleIsRestricted = 0; - } - } - ContactLookupKey.appendToLookupKey(mSb, c.getString(RawContactsQuery.ACCOUNT_TYPE), c.getString(RawContactsQuery.ACCOUNT_NAME), @@ -1752,8 +1733,6 @@ public class ContactAggregator { contactStarred); statement.bindLong(ContactReplaceSqlStatement.HAS_PHONE_NUMBER, hasPhoneNumber); - statement.bindLong(ContactReplaceSqlStatement.SINGLE_IS_RESTRICTED, - singleIsRestricted); statement.bindString(ContactReplaceSqlStatement.LOOKUP_KEY, Uri.encode(mSb.toString())); } diff --git a/src/com/android/providers/contacts/ContactsDatabaseHelper.java b/src/com/android/providers/contacts/ContactsDatabaseHelper.java index a8d4752..0ce588b 100644 --- a/src/com/android/providers/contacts/ContactsDatabaseHelper.java +++ b/src/com/android/providers/contacts/ContactsDatabaseHelper.java @@ -64,8 +64,8 @@ import android.provider.ContactsContract.PhoneticNameStyle; import android.provider.ContactsContract.RawContacts; import android.provider.ContactsContract.Settings; import android.provider.ContactsContract.StatusUpdates; -import android.provider.ContactsContract.StreamItems; import android.provider.ContactsContract.StreamItemPhotos; +import android.provider.ContactsContract.StreamItems; import android.provider.SocialContract.Activities; import android.provider.VoicemailContract; import android.provider.VoicemailContract.Voicemails; @@ -100,7 +100,7 @@ import java.util.Locale; * 600-699 Ice Cream Sandwich * </pre> */ - static final int DATABASE_VERSION = 605; + static final int DATABASE_VERSION = 606; private static final String DATABASE_NAME = "contacts2.db"; private static final String DATABASE_PRESENCE = "presence_db"; @@ -201,26 +201,13 @@ import java.util.Locale; } public interface Views { - public static final String DATA_ALL = "view_data"; - public static final String DATA_RESTRICTED = "view_data_restricted"; - - public static final String RAW_CONTACTS_ALL = "view_raw_contacts"; - public static final String RAW_CONTACTS_RESTRICTED = "view_raw_contacts_restricted"; - - public static final String CONTACTS_ALL = "view_contacts"; - public static final String CONTACTS_RESTRICTED = "view_contacts_restricted"; - + public static final String DATA = "view_data"; + public static final String RAW_CONTACTS = "view_raw_contacts"; + public static final String CONTACTS = "view_contacts"; public static final String ENTITIES = "view_entities"; - public static final String ENTITIES_RESTRICTED = "view_entities_restricted"; - public static final String RAW_ENTITIES = "view_raw_entities"; - public static final String RAW_ENTITIES_RESTRICTED = "view_raw_entities_restricted"; - - public static final String GROUPS_ALL = "view_groups"; - - public static final String DATA_USAGE_STAT_ALL = "view_data_usage_stat"; - public static final String DATA_USAGE_STAT_RESTRICTED = - "view_data_usage_stat_restricted"; + public static final String GROUPS = "view_groups"; + public static final String DATA_USAGE_STAT = "view_data_usage_stat"; } public interface Clauses { @@ -269,12 +256,6 @@ import java.util.Locale; } public interface ContactsColumns { - /** - * This flag is set for a contact if it has only one constituent raw contact and - * it is restricted. - */ - public static final String SINGLE_IS_RESTRICTED = "single_is_restricted"; - public static final String LAST_STATUS_UPDATE_ID = "status_update_id"; public static final String CONCRETE_ID = Tables.CONTACTS + "." + BaseColumns._ID; @@ -325,8 +306,6 @@ import java.util.Locale; Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED; public static final String CONCRETE_STARRED = Tables.RAW_CONTACTS + "." + RawContacts.STARRED; - public static final String CONCRETE_IS_RESTRICTED = - Tables.RAW_CONTACTS + "." + RawContacts.IS_RESTRICTED; public static final String DISPLAY_NAME = RawContacts.DISPLAY_NAME_PRIMARY; public static final String DISPLAY_NAME_SOURCE = RawContacts.DISPLAY_NAME_SOURCE; @@ -638,11 +617,6 @@ import java.util.Locale; private boolean mUseStrictPhoneNumberComparison; - /** - * List of package names with access to {@link RawContacts#IS_RESTRICTED} data. - */ - private String[] mUnrestrictedPackages; - private String[] mSelectionArgs1 = new String[1]; private NameSplitter.Name mName = new NameSplitter.Name(); private CharArrayBuffer mCharArrayBuffer = new CharArrayBuffer(128); @@ -675,13 +649,6 @@ import java.util.Locale; mUseStrictPhoneNumberComparison = resources.getBoolean( com.android.internal.R.bool.config_use_strict_phone_number_comparation); - int resourceId = resources.getIdentifier("unrestricted_packages", "array", - context.getPackageName()); - if (resourceId != 0) { - mUnrestrictedPackages = resources.getStringArray(resourceId); - } else { - mUnrestrictedPackages = new String[0]; - } } private void refreshDatabaseCaches(SQLiteDatabase db) { @@ -837,18 +804,13 @@ import java.util.Locale; Contacts.STARRED + " INTEGER NOT NULL DEFAULT 0," + Contacts.HAS_PHONE_NUMBER + " INTEGER NOT NULL DEFAULT 0," + Contacts.LOOKUP_KEY + " TEXT," + - ContactsColumns.LAST_STATUS_UPDATE_ID + " INTEGER REFERENCES data(_id)," + - ContactsColumns.SINGLE_IS_RESTRICTED + " INTEGER NOT NULL DEFAULT 0" + + ContactsColumns.LAST_STATUS_UPDATE_ID + " INTEGER REFERENCES data(_id)" + ");"); db.execSQL("CREATE INDEX contacts_has_phone_index ON " + Tables.CONTACTS + " (" + Contacts.HAS_PHONE_NUMBER + ");"); - db.execSQL("CREATE INDEX contacts_restricted_index ON " + Tables.CONTACTS + " (" + - ContactsColumns.SINGLE_IS_RESTRICTED + - ");"); - db.execSQL("CREATE INDEX contacts_name_raw_contact_id_index ON " + Tables.CONTACTS + " (" + Contacts.NAME_RAW_CONTACT_ID + ");"); @@ -856,7 +818,6 @@ import java.util.Locale; // Contacts table db.execSQL("CREATE TABLE " + Tables.RAW_CONTACTS + " (" + RawContacts._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + - RawContacts.IS_RESTRICTED + " INTEGER DEFAULT 0," + RawContacts.ACCOUNT_NAME + " STRING DEFAULT NULL, " + RawContacts.ACCOUNT_TYPE + " STRING DEFAULT NULL, " + RawContacts.SOURCE_ID + " TEXT," + @@ -1381,18 +1342,12 @@ import java.util.Locale; } private static void createContactsViews(SQLiteDatabase db) { - db.execSQL("DROP VIEW IF EXISTS " + Views.CONTACTS_ALL + ";"); - db.execSQL("DROP VIEW IF EXISTS " + Views.CONTACTS_RESTRICTED + ";"); - db.execSQL("DROP VIEW IF EXISTS " + Views.DATA_ALL + ";"); - db.execSQL("DROP VIEW IF EXISTS " + Views.DATA_RESTRICTED + ";"); - db.execSQL("DROP VIEW IF EXISTS " + Views.RAW_CONTACTS_ALL + ";"); - db.execSQL("DROP VIEW IF EXISTS " + Views.RAW_CONTACTS_RESTRICTED + ";"); + db.execSQL("DROP VIEW IF EXISTS " + Views.CONTACTS + ";"); + db.execSQL("DROP VIEW IF EXISTS " + Views.DATA + ";"); + db.execSQL("DROP VIEW IF EXISTS " + Views.RAW_CONTACTS + ";"); db.execSQL("DROP VIEW IF EXISTS " + Views.RAW_ENTITIES + ";"); - db.execSQL("DROP VIEW IF EXISTS " + Views.RAW_ENTITIES_RESTRICTED + ";"); db.execSQL("DROP VIEW IF EXISTS " + Views.ENTITIES + ";"); - db.execSQL("DROP VIEW IF EXISTS " + Views.ENTITIES_RESTRICTED + ";"); - db.execSQL("DROP VIEW IF EXISTS " + Views.DATA_USAGE_STAT_ALL + ";"); - db.execSQL("DROP VIEW IF EXISTS " + Views.DATA_USAGE_STAT_RESTRICTED + ";"); + db.execSQL("DROP VIEW IF EXISTS " + Views.DATA_USAGE_STAT + ";"); String dataColumns = Data.IS_PRIMARY + ", " @@ -1503,9 +1458,7 @@ import java.util.Locale; + "' AND " + GroupsColumns.CONCRETE_ID + "=" + Tables.DATA + "." + GroupMembership.GROUP_ROW_ID + ")"; - db.execSQL("CREATE VIEW " + Views.DATA_ALL + " AS " + dataSelect); - db.execSQL("CREATE VIEW " + Views.DATA_RESTRICTED + " AS " + dataSelect + " WHERE " - + RawContactsColumns.CONCRETE_IS_RESTRICTED + "=0"); + db.execSQL("CREATE VIEW " + Views.DATA + " AS " + dataSelect); String rawContactOptionColumns = RawContacts.CUSTOM_RINGTONE + "," @@ -1535,9 +1488,7 @@ import java.util.Locale; + syncColumns + " FROM " + Tables.RAW_CONTACTS; - db.execSQL("CREATE VIEW " + Views.RAW_CONTACTS_ALL + " AS " + rawContactsSelect); - db.execSQL("CREATE VIEW " + Views.RAW_CONTACTS_RESTRICTED + " AS " + rawContactsSelect - + " WHERE " + RawContacts.IS_RESTRICTED + "=0"); + db.execSQL("CREATE VIEW " + Views.RAW_CONTACTS + " AS " + rawContactsSelect); String contactsColumns = ContactsColumns.CONCRETE_CUSTOM_RINGTONE @@ -1569,9 +1520,7 @@ import java.util.Locale; + " JOIN " + Tables.RAW_CONTACTS + " AS name_raw_contact ON(" + Contacts.NAME_RAW_CONTACT_ID + "=name_raw_contact." + RawContacts._ID + ")"; - db.execSQL("CREATE VIEW " + Views.CONTACTS_ALL + " AS " + contactsSelect); - db.execSQL("CREATE VIEW " + Views.CONTACTS_RESTRICTED + " AS " + contactsSelect - + " WHERE " + ContactsColumns.SINGLE_IS_RESTRICTED + "=0"); + db.execSQL("CREATE VIEW " + Views.CONTACTS + " AS " + contactsSelect); String rawEntitiesSelect = "SELECT " + RawContacts.CONTACT_ID + ", " @@ -1585,8 +1534,6 @@ import java.util.Locale; + RawContactsColumns.CONCRETE_ID + " AS " + RawContacts._ID + ", " + DataColumns.CONCRETE_ID + " AS " + RawContacts.Entity.DATA_ID + "," + RawContactsColumns.CONCRETE_STARRED + " AS " + RawContacts.STARRED + "," - + RawContactsColumns.CONCRETE_IS_RESTRICTED + " AS " - + RawContacts.IS_RESTRICTED + "," + "EXISTS (SELECT 1 FROM " + Tables.ACCOUNTS + " WHERE " + RawContactsColumns.CONCRETE_ID + "=" + AccountsColumns.PROFILE_RAW_CONTACT_ID + ") AS " + @@ -1606,15 +1553,11 @@ import java.util.Locale; db.execSQL("CREATE VIEW " + Views.RAW_ENTITIES + " AS " + rawEntitiesSelect); - db.execSQL("CREATE VIEW " + Views.RAW_ENTITIES_RESTRICTED + " AS " - + rawEntitiesSelect + " WHERE " + RawContacts.IS_RESTRICTED + "=0"); String entitiesSelect = "SELECT " + RawContactsColumns.CONCRETE_CONTACT_ID + " AS " + Contacts._ID + ", " + RawContactsColumns.CONCRETE_CONTACT_ID + " AS " + RawContacts.CONTACT_ID + ", " + RawContactsColumns.CONCRETE_DELETED + " AS " + RawContacts.DELETED + "," - + RawContactsColumns.CONCRETE_IS_RESTRICTED - + " AS " + RawContacts.IS_RESTRICTED + "," + dataColumns + ", " + syncColumns + ", " + contactsColumns + ", " @@ -1653,8 +1596,6 @@ import java.util.Locale; db.execSQL("CREATE VIEW " + Views.ENTITIES + " AS " + entitiesSelect); - db.execSQL("CREATE VIEW " + Views.ENTITIES_RESTRICTED + " AS " - + entitiesSelect + " WHERE " + RawContactsColumns.CONCRETE_IS_RESTRICTED + "=0"); String dataUsageStatSelect = "SELECT " + DataUsageStatColumns.CONCRETE_ID + " AS " + DataUsageStatColumns._ID + ", " @@ -1673,10 +1614,7 @@ import java.util.Locale; + " JOIN " + Tables.MIMETYPES + " ON (" + MimetypesColumns.CONCRETE_ID + "=" + DataColumns.CONCRETE_MIMETYPE_ID + ")"; - db.execSQL("CREATE VIEW " + Views.DATA_USAGE_STAT_ALL + " AS " + dataUsageStatSelect); - db.execSQL("CREATE VIEW " + Views.DATA_USAGE_STAT_RESTRICTED + " AS " - + dataUsageStatSelect + " WHERE " - + RawContactsColumns.CONCRETE_IS_RESTRICTED + "=0"); + db.execSQL("CREATE VIEW " + Views.DATA_USAGE_STAT + " AS " + dataUsageStatSelect); } private static String buildPhotoUriAlias(String contactIdColumn, String alias) { @@ -1690,7 +1628,7 @@ import java.util.Locale; } private static void createGroupsView(SQLiteDatabase db) { - db.execSQL("DROP VIEW IF EXISTS " + Views.GROUPS_ALL + ";"); + db.execSQL("DROP VIEW IF EXISTS " + Views.GROUPS + ";"); String groupsColumns = Groups.ACCOUNT_NAME + "," + Groups.ACCOUNT_TYPE + "," @@ -1718,7 +1656,7 @@ import java.util.Locale; + groupsColumns + " FROM " + Tables.GROUPS_JOIN_PACKAGES; - db.execSQL("CREATE VIEW " + Views.GROUPS_ALL + " AS " + groupsSelect); + db.execSQL("CREATE VIEW " + Views.GROUPS + " AS " + groupsSelect); } @Override @@ -2043,6 +1981,13 @@ import java.util.Locale; oldVersion = 605; } + if (oldVersion < 606) { + upgradeViewsAndTriggers = true; + upgradeLegacyApiSupport = true; + upgradeToVersion606(db); + oldVersion = 606; + } + if (upgradeViewsAndTriggers) { createContactsViews(db); createGroupsView(db); @@ -3153,6 +3098,19 @@ import java.util.Locale; "FOREIGN KEY(stream_item_id) REFERENCES stream_items(_id));"); } + private void upgradeToVersion606(SQLiteDatabase db) { + db.execSQL("DROP VIEW IF EXISTS view_contacts_restricted;"); + db.execSQL("DROP VIEW IF EXISTS view_data_restricted;"); + db.execSQL("DROP VIEW IF EXISTS view_raw_contacts_restricted;"); + db.execSQL("DROP VIEW IF EXISTS view_raw_entities_restricted;"); + db.execSQL("DROP VIEW IF EXISTS view_entities_restricted;"); + db.execSQL("DROP VIEW IF EXISTS view_data_usage_stat_restricted;"); + db.execSQL("DROP INDEX IF EXISTS contacts_restricted_index"); + + // We should remove the restricted columns here as well, but unfortunately SQLite doesn't + // provide ALTER TABLE DROP COLUMN. As they have DEFAULT 0, we can keep but ignore them + } + public String extractHandleFromEmailAddress(String email) { Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(email); if (tokens.length == 0) { @@ -3213,8 +3171,6 @@ import java.util.Locale; // Specific stats strings are based on an actual large database after running ANALYZE try { updateIndexStats(db, Tables.CONTACTS, - "contacts_restricted_index", "10000 9000"); - updateIndexStats(db, Tables.CONTACTS, "contacts_has_phone_index", "10000 500"); updateIndexStats(db, Tables.RAW_CONTACTS, @@ -3661,7 +3617,7 @@ import java.util.Locale; boolean joinContacts) { sb.append(Tables.RAW_CONTACTS); if (joinContacts) { - sb.append(" JOIN " + getContactView() + " contacts_view" + sb.append(" JOIN " + Views.CONTACTS + " contacts_view" + " ON (contacts_view._id = raw_contacts.contact_id)"); } sb.append(", (SELECT data_id, normalized_number, length(normalized_number) as len " @@ -3829,98 +3785,6 @@ import java.util.Locale; } /** - * Check if {@link Binder#getCallingUid()} should be allowed access to - * {@link RawContacts#IS_RESTRICTED} data. - */ - boolean hasAccessToRestrictedData() { - final PackageManager pm = mContext.getPackageManager(); - int caller = Binder.getCallingUid(); - if (caller == 0) return true; // root can do anything - final String[] callerPackages = pm.getPackagesForUid(caller); - - // Has restricted access if caller matches any packages - for (String callerPackage : callerPackages) { - if (hasAccessToRestrictedData(callerPackage)) { - return true; - } - } - return false; - } - - /** - * Check if requestingPackage should be allowed access to - * {@link RawContacts#IS_RESTRICTED} data. - */ - boolean hasAccessToRestrictedData(String requestingPackage) { - if (mUnrestrictedPackages != null) { - for (String allowedPackage : mUnrestrictedPackages) { - if (allowedPackage.equals(requestingPackage)) { - return true; - } - } - } - return false; - } - - public String getDataView() { - return getDataView(false); - } - - public String getDataView(boolean requireRestrictedView) { - return (hasAccessToRestrictedData() && !requireRestrictedView) ? - Views.DATA_ALL : Views.DATA_RESTRICTED; - } - - public String getRawContactView() { - return getRawContactView(false); - } - - public String getRawContactView(boolean requireRestrictedView) { - return (hasAccessToRestrictedData() && !requireRestrictedView) ? - Views.RAW_CONTACTS_ALL : Views.RAW_CONTACTS_RESTRICTED; - } - - public String getContactView() { - return getContactView(false); - } - - public String getContactView(boolean requireRestrictedView) { - return (hasAccessToRestrictedData() && !requireRestrictedView) ? - Views.CONTACTS_ALL : Views.CONTACTS_RESTRICTED; - } - - public String getGroupView() { - return Views.GROUPS_ALL; - } - - public String getRawEntitiesView() { - return getRawEntitiesView(false); - } - - public String getRawEntitiesView(boolean requireRestrictedView) { - return (hasAccessToRestrictedData() && !requireRestrictedView) ? - Views.RAW_ENTITIES : Views.RAW_ENTITIES_RESTRICTED; - } - - public String getEntitiesView() { - return getEntitiesView(false); - } - - public String getEntitiesView(boolean requireRestrictedView) { - return (hasAccessToRestrictedData() && !requireRestrictedView) ? - Views.ENTITIES : Views.ENTITIES_RESTRICTED; - } - - public String getDataUsageStatView() { - return getDataUsageStatView(false); - } - - public String getDataUsageStatView(boolean requireRestrictedView) { - return (hasAccessToRestrictedData() && !requireRestrictedView) ? - Views.DATA_USAGE_STAT_ALL : Views.DATA_USAGE_STAT_RESTRICTED; - } - - /** * Test if any of the columns appear in the given projection. */ public boolean isInProjection(String[] projection, String... columns) { diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java index 6a409b4..3fe5f79 100644 --- a/src/com/android/providers/contacts/ContactsProvider2.java +++ b/src/com/android/providers/contacts/ContactsProvider2.java @@ -42,6 +42,7 @@ import com.android.providers.contacts.ContactsDatabaseHelper.StatusUpdatesColumn import com.android.providers.contacts.ContactsDatabaseHelper.StreamItemsColumns; import com.android.providers.contacts.ContactsDatabaseHelper.StreamItemPhotosColumns; import com.android.providers.contacts.ContactsDatabaseHelper.Tables; +import com.android.providers.contacts.ContactsDatabaseHelper.Views; import com.android.providers.contacts.util.DbQueryUtils; import com.android.vcard.VCardComposer; import com.android.vcard.VCardConfig; @@ -669,7 +670,6 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun .add(RawContacts._ID) .add(RawContacts.CONTACT_ID) .add(RawContacts.Entity.DATA_ID) - .add(RawContacts.IS_RESTRICTED) .add(RawContacts.DELETED) .add(RawContacts.STARRED) .add(RawContacts.RAW_CONTACT_IS_USER_PROFILE) @@ -686,7 +686,6 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun .add(Contacts.Entity.DATA_ID) .add(Contacts.Entity.NAME_RAW_CONTACT_ID) .add(Contacts.Entity.DELETED) - .add(Contacts.Entity.IS_RESTRICTED) .add(Contacts.IS_USER_PROFILE) .addAll(sContactsColumns) .addAll(sContactPresenceColumns) @@ -2628,7 +2627,6 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun mSelectionArgs.add(values.getAsString(StatusUpdates.DATA_ID)); } } - mSb.append(" AND ").append(getContactsRestrictions()); Cursor cursor = null; try { @@ -3383,7 +3381,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun } int count = 0; - Cursor cursor = mDb.query(mDbHelper.getRawContactView(), + Cursor cursor = mDb.query(Views.RAW_CONTACTS, new String[] { RawContacts._ID }, selection, selectionArgs, null, null, null); try { @@ -3541,7 +3539,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun private int updateContactOptions(ContentValues values, String selection, String[] selectionArgs, boolean callerIsSyncAdapter) { int count = 0; - Cursor cursor = mDb.query(mDbHelper.getContactView(), + Cursor cursor = mDb.query(Views.CONTACTS, new String[] { Contacts._ID, Contacts.IS_USER_PROFILE }, selection, selectionArgs, null, null, null); try { @@ -3597,7 +3595,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun + " AND " + RawContacts.RAW_CONTACT_IS_READ_ONLY + "=0", mSelectionArgs1); if (mValues.containsKey(RawContacts.STARRED) && !callerIsSyncAdapter) { - Cursor cursor = mDb.query(mDbHelper.getRawContactView(), + Cursor cursor = mDb.query(Views.RAW_CONTACTS, new String[] { RawContacts._ID }, RawContacts.CONTACT_ID + "=?", mSelectionArgs1, null, null, null); try { @@ -4011,8 +4009,6 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun String groupBy = null; String limit = getLimit(uri); - // TODO: Consider writing a test case for RestrictionExceptions when you - // write a new query() block to make sure it protects restricted data. final int match = sUriMatcher.match(uri); switch (match) { case SYNCSTATE: @@ -4141,11 +4137,10 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun } case CONTACTS_AS_VCARD: { - // When reading as vCard always use restricted view final String lookupKey = Uri.encode(uri.getPathSegments().get(2)); long contactId = lookupContactIdByLookupKey(db, lookupKey); enforceProfilePermissionForContact(contactId, false); - qb.setTables(mDbHelper.getContactView(true /* require restricted */)); + qb.setTables(Views.CONTACTS); qb.setProjectionMap(sContactsVCardProjectionMap); selectionArgs = insertSelectionArg(selectionArgs, String.valueOf(contactId)); @@ -4292,8 +4287,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun case PROFILE_AS_VCARD: { enforceProfilePermission(false); - // When reading as vCard always use restricted view - qb.setTables(mDbHelper.getContactView(true /* require restricted */)); + qb.setTables(Views.CONTACTS); qb.setProjectionMap(sContactsVCardProjectionMap); qb.appendWhere(Contacts.IS_USER_PROFILE + "=1"); break; @@ -4689,14 +4683,14 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun } case GROUPS: { - qb.setTables(mDbHelper.getGroupView()); + qb.setTables(Views.GROUPS); qb.setProjectionMap(sGroupsProjectionMap); appendAccountFromParameter(qb, uri); break; } case GROUPS_ID: { - qb.setTables(mDbHelper.getGroupView()); + qb.setTables(Views.GROUPS); qb.setProjectionMap(sGroupsProjectionMap); selectionArgs = insertSelectionArg(selectionArgs, uri.getLastPathSegment()); qb.appendWhere(Groups._ID + "=?"); @@ -4704,7 +4698,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun } case GROUPS_SUMMARY: { - qb.setTables(mDbHelper.getGroupView() + " AS groups"); + qb.setTables(Views.GROUPS + " AS groups"); qb.setProjectionMap(sGroupsSummaryProjectionMap); appendAccountFromParameter(qb, uri); groupBy = Groups._ID; @@ -4799,24 +4793,24 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun } case LIVE_FOLDERS_CONTACTS: - qb.setTables(mDbHelper.getContactView()); + qb.setTables(Views.CONTACTS); qb.setProjectionMap(sLiveFoldersProjectionMap); break; case LIVE_FOLDERS_CONTACTS_WITH_PHONES: - qb.setTables(mDbHelper.getContactView()); + qb.setTables(Views.CONTACTS); qb.setProjectionMap(sLiveFoldersProjectionMap); qb.appendWhere(Contacts.HAS_PHONE_NUMBER + "=1"); break; case LIVE_FOLDERS_CONTACTS_FAVORITES: - qb.setTables(mDbHelper.getContactView()); + qb.setTables(Views.CONTACTS); qb.setProjectionMap(sLiveFoldersProjectionMap); qb.appendWhere(Contacts.STARRED + "=1"); break; case LIVE_FOLDERS_CONTACTS_GROUP_NAME: - qb.setTables(mDbHelper.getContactView()); + qb.setTables(Views.CONTACTS); qb.setProjectionMap(sLiveFoldersProjectionMap); qb.appendWhere(CONTACTS_IN_GROUP_SELECT); selectionArgs = insertSelectionArg(selectionArgs, uri.getLastPathSegment()); @@ -5002,7 +4996,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun HashMap<String, String> projectionMap = Maps.newHashMap(); // The user profile column varies depending on the view. - String profileColumn = qb.getTables().contains(mDbHelper.getContactView()) + String profileColumn = qb.getTables().contains(Views.CONTACTS) ? Contacts.IS_USER_PROFILE : RawContacts.RAW_CONTACT_IS_USER_PROFILE; String sectionHeading = String.format( @@ -5338,8 +5332,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun private void setTablesAndProjectionMapForContacts(SQLiteQueryBuilder qb, Uri uri, String[] projection, boolean forStrequentFrequent, boolean strequentPhoneCallOnly) { StringBuilder sb = new StringBuilder(); - String viewName = mDbHelper.getContactView(shouldExcludeRestrictedData(uri)); - sb.append(viewName); + sb.append(Views.CONTACTS); // Just for frequently contacted contacts in Strequent Uri handling. if (forStrequentFrequent) { @@ -5352,11 +5345,11 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun // Use INNER JOIN for maximum performance, ommiting unnecessary rows as much as // possible. sb.append(" INNER JOIN " + - mDbHelper.getDataUsageStatView() + " AS " + Tables.DATA_USAGE_STAT + + Views.DATA_USAGE_STAT + " AS " + Tables.DATA_USAGE_STAT + " ON (" + DbQueryUtils.concatenateClauses( DataUsageStatColumns.CONCRETE_TIMES_USED + " > 0", - RawContacts.CONTACT_ID + "=" + viewName + "." + Contacts._ID, + RawContacts.CONTACT_ID + "=" + Views.CONTACTS + "." + Contacts._ID, strequentPhoneCallOnlyClause) + ")"); } @@ -5375,7 +5368,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun String[] projection, String filter, long directoryId) { StringBuilder sb = new StringBuilder(); - sb.append(mDbHelper.getContactView(shouldExcludeRestrictedData(uri))); + sb.append(Views.CONTACTS); if (filter != null) { filter = filter.trim(); @@ -5560,14 +5553,14 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun private void setTablesAndProjectionMapForRawContacts(SQLiteQueryBuilder qb, Uri uri) { StringBuilder sb = new StringBuilder(); - sb.append(mDbHelper.getRawContactView(shouldExcludeRestrictedData(uri))); + sb.append(Views.RAW_CONTACTS); qb.setTables(sb.toString()); qb.setProjectionMap(sRawContactsProjectionMap); appendAccountFromParameter(qb, uri); } private void setTablesAndProjectionMapForRawEntities(SQLiteQueryBuilder qb, Uri uri) { - qb.setTables(mDbHelper.getRawEntitiesView(shouldExcludeRestrictedData(uri))); + qb.setTables(Views.RAW_ENTITIES); qb.setProjectionMap(sRawEntityProjectionMap); appendAccountFromParameter(qb, uri); } @@ -5584,7 +5577,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun private void setTablesAndProjectionMapForData(SQLiteQueryBuilder qb, Uri uri, String[] projection, boolean distinct, Integer usageType) { StringBuilder sb = new StringBuilder(); - sb.append(mDbHelper.getDataView(shouldExcludeRestrictedData(uri))); + sb.append(Views.DATA); sb.append(" data"); appendContactPresenceJoin(sb, projection, RawContacts.CONTACT_ID); @@ -5608,7 +5601,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun private void setTableAndProjectionMapForStatusUpdates(SQLiteQueryBuilder qb, String[] projection) { StringBuilder sb = new StringBuilder(); - sb.append(mDbHelper.getDataView()); + sb.append(Views.DATA); sb.append(" data"); appendDataPresenceJoin(sb, projection, DataColumns.CONCRETE_ID); appendDataStatusUpdateJoin(sb, projection, DataColumns.CONCRETE_ID); @@ -5641,7 +5634,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun private void setTablesAndProjectionMapForEntities(SQLiteQueryBuilder qb, Uri uri, String[] projection) { StringBuilder sb = new StringBuilder(); - sb.append(mDbHelper.getEntitiesView(shouldExcludeRestrictedData(uri))); + sb.append(Views.ENTITIES); sb.append(" data"); appendContactPresenceJoin(sb, projection, Contacts.Entity.CONTACT_ID); @@ -5750,23 +5743,6 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun return profileRequested; } - private boolean shouldExcludeRestrictedData(Uri uri) { - // Note: currently, "export only" equals to "restricted", but may not in the future. - boolean excludeRestrictedData = readBooleanQueryParameter(uri, - Data.FOR_EXPORT_ONLY, false); - if (excludeRestrictedData) { - return true; - } - - String requestingPackage = getQueryParameter(uri, - ContactsContract.REQUESTING_PACKAGE_PARAM_KEY); - if (requestingPackage != null) { - return !mDbHelper.hasAccessToRestrictedData(requestingPackage); - } - - return false; - } - private void appendAccountFromParameter(SQLiteQueryBuilder qb, Uri uri) { final String accountName = getQueryParameter(uri, RawContacts.ACCOUNT_NAME); final String accountType = getQueryParameter(uri, RawContacts.ACCOUNT_TYPE); @@ -5846,23 +5822,6 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun } } - String getContactsRestrictions() { - if (mDbHelper.hasAccessToRestrictedData()) { - return "1"; - } else { - return RawContactsColumns.CONCRETE_IS_RESTRICTED + "=0"; - } - } - - public String getContactsRestrictionExceptionAsNestedQuery(String contactIdColumn) { - if (mDbHelper.hasAccessToRestrictedData()) { - return "1"; - } else { - return "(SELECT " + RawContacts.IS_RESTRICTED + " FROM " + Tables.RAW_CONTACTS - + " WHERE " + RawContactsColumns.CONCRETE_ID + "=" + contactIdColumn + ")=0"; - } - } - @Override public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException { @@ -5958,7 +5917,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun } String sql = - "SELECT " + Photo.PHOTO + " FROM " + mDbHelper.getDataView() + + "SELECT " + Photo.PHOTO + " FROM " + Views.DATA + " WHERE " + selection; SQLiteDatabase db = mDbHelper.getReadableDatabase(); try { @@ -6016,7 +5975,6 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun new VCardComposer(context, vcardconfig, false); Writer writer = null; try { - // No extra checks since composer always uses restricted views. writer = new BufferedWriter(new OutputStreamWriter(stream)); if (!composer.init(uri, selection, selectionArgs, null)) { Log.w(TAG, "Failed to init VCardComposer"); @@ -6490,7 +6448,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun Arrays.fill(questionMarks, "?"); final String where = Data._ID + " IN (" + TextUtils.join(",", questionMarks) + ")"; final Cursor cursor = mDb.query( - mDbHelper.getDataView(shouldExcludeRestrictedData(uri)), + Views.DATA, new String[] { Data.CONTACT_ID }, where, ids, null, null, null); try { diff --git a/src/com/android/providers/contacts/GlobalSearchSupport.java b/src/com/android/providers/contacts/GlobalSearchSupport.java index 38132e2..b5739bd 100644 --- a/src/com/android/providers/contacts/GlobalSearchSupport.java +++ b/src/com/android/providers/contacts/GlobalSearchSupport.java @@ -19,6 +19,7 @@ package com.android.providers.contacts; import com.android.providers.contacts.ContactsDatabaseHelper.AggregatedPresenceColumns; import com.android.providers.contacts.ContactsDatabaseHelper.ContactsColumns; import com.android.providers.contacts.ContactsDatabaseHelper.Tables; +import com.android.providers.contacts.ContactsDatabaseHelper.Views; import android.app.SearchManager; import android.content.res.Resources; @@ -291,7 +292,7 @@ public class GlobalSearchSupport { sb.append(", " + SearchSnippetColumns.SNIPPET); } sb.append(" FROM "); - sb.append(getDatabaseHelper().getContactView(false)); + sb.append(Views.CONTACTS); sb.append(" AS contacts"); if (haveFilter) { mContactsProvider.appendSearchIndexJoin(sb, filter, true, diff --git a/src/com/android/providers/contacts/LegacyApiSupport.java b/src/com/android/providers/contacts/LegacyApiSupport.java index a51728e..501e074 100644 --- a/src/com/android/providers/contacts/LegacyApiSupport.java +++ b/src/com/android/providers/contacts/LegacyApiSupport.java @@ -596,8 +596,7 @@ public class LegacyApiSupport { + " AS " + android.provider.Contacts.People._ID + ", " + peopleColumns + " FROM " + Tables.RAW_CONTACTS + PEOPLE_JOINS + - " WHERE " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" + - " AND " + RawContacts.IS_RESTRICTED + "=0" + ";"); + " WHERE " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0;"); db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.ORGANIZATIONS + ";"); db.execSQL("CREATE VIEW " + LegacyTables.ORGANIZATIONS + " AS SELECT " + @@ -620,8 +619,7 @@ public class LegacyApiSupport { " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS + " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" + Organization.CONTENT_ITEM_TYPE + "'" - + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" - + " AND " + RawContacts.IS_RESTRICTED + "=0" + + + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" + ";"); db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.CONTACT_METHODS + ";"); @@ -645,8 +643,7 @@ public class LegacyApiSupport { peopleColumns + " FROM " + Tables.DATA + DATA_JOINS + " WHERE " + ContactMethods.KIND + " IS NOT NULL" - + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" - + " AND " + RawContacts.IS_RESTRICTED + "=0" + + + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" + ";"); @@ -674,8 +671,7 @@ public class LegacyApiSupport { + DATA_JOINS + " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'" - + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" - + " AND " + RawContacts.IS_RESTRICTED + "=0" + + + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" + ";"); db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.EXTENSIONS + ";"); @@ -693,8 +689,7 @@ public class LegacyApiSupport { " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS + " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" + android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE + "'" - + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" - + " AND " + RawContacts.IS_RESTRICTED + "=0" + + + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" + ";"); db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUPS + ";"); @@ -762,8 +757,7 @@ public class LegacyApiSupport { " FROM " + Tables.DATA + DATA_JOINS + LEGACY_PHOTO_JOIN + " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" + Photo.CONTENT_ITEM_TYPE + "'" - + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" - + " AND " + RawContacts.IS_RESTRICTED + "=0" + + + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" + ";"); } diff --git a/tests/src/com/android/providers/contacts/ContactsActor.java b/tests/src/com/android/providers/contacts/ContactsActor.java index 1865904..f22943e 100644 --- a/tests/src/com/android/providers/contacts/ContactsActor.java +++ b/tests/src/com/android/providers/contacts/ContactsActor.java @@ -63,7 +63,6 @@ import java.io.IOException; import java.util.Arrays; import java.util.Locale; import java.util.Set; -import java.util.concurrent.TimeUnit; /** * Helper class that encapsulates an "actor" which is owned by a specific @@ -228,7 +227,7 @@ public class ContactsActor { Configuration configuration = new Configuration(resources.getConfiguration()); configuration.locale = Locale.US; resources.updateConfiguration(configuration, resources.getDisplayMetrics()); - mRes = new RestrictionMockResources(resources); + mRes = resources; } @Override @@ -297,97 +296,30 @@ public class ContactsActor { } } - private static class RestrictionMockResources extends MockResources { - private static final String UNRESTRICTED = "unrestricted_packages"; - private static final int UNRESTRICTED_ID = 1024; - - private static final String[] UNRESTRICTED_LIST = new String[] { - PACKAGE_GREY - }; - - private final Resources mRes; - - public RestrictionMockResources(Resources res) { - mRes = res; - } - - @Override - public int getIdentifier(String name, String defType, String defPackage) { - if (UNRESTRICTED.equals(name)) { - return UNRESTRICTED_ID; - } else { - return mRes.getIdentifier(name, defType, defPackage); - } - } - - @Override - public String[] getStringArray(int id) throws NotFoundException { - if (id == UNRESTRICTED_ID) { - return UNRESTRICTED_LIST; - } else { - return mRes.getStringArray(id); - } - } - - @Override - public void getValue(int id, TypedValue outValue, boolean resolveRefs) - throws NotFoundException { - mRes.getValue(id, outValue, resolveRefs); - } - - @Override - public String getString(int id) throws NotFoundException { - return mRes.getString(id); - } - - @Override - public String getString(int id, Object... formatArgs) throws NotFoundException { - return mRes.getString(id, formatArgs); - } - - @Override - public CharSequence getText(int id) throws NotFoundException { - return mRes.getText(id); - } - - @Override - public String getResourceName(int resid) throws NotFoundException { - return String.valueOf(resid); - } - - @Override - public int getInteger(int id) throws NotFoundException { - return mRes.getInteger(id); - } - } - static String sCallingPackage = null; void ensureCallingPackage() { sCallingPackage = this.packageName; } - public long createRawContact(boolean isRestricted, String name) { + public long createRawContact(String name) { ensureCallingPackage(); - long rawContactId = createRawContact(isRestricted); + long rawContactId = createRawContact(); createName(rawContactId, name); return rawContactId; } - public long createRawContact(boolean isRestricted) { + public long createRawContact() { ensureCallingPackage(); final ContentValues values = new ContentValues(); - if (isRestricted) { - values.put(RawContacts.IS_RESTRICTED, 1); - } Uri rawContactUri = resolver.insert(RawContacts.CONTENT_URI, values); return ContentUris.parseId(rawContactUri); } - public long createRawContactWithStatus(boolean isRestricted, String name, String address, + public long createRawContactWithStatus(String name, String address, String status) { - final long rawContactId = createRawContact(isRestricted, name); + final long rawContactId = createRawContact(name); final long dataId = createEmail(rawContactId, address); createStatus(dataId, status); return rawContactId; diff --git a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java index 475a57d..ab43158 100644 --- a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java +++ b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java @@ -382,7 +382,6 @@ public class ContactsProvider2Test extends BaseContactsProvider2Test { RawContacts.SYNC2, RawContacts.SYNC3, RawContacts.SYNC4, - RawContacts.IS_RESTRICTED, Contacts._ID, Contacts.DISPLAY_NAME_PRIMARY, Contacts.DISPLAY_NAME_ALTERNATIVE, @@ -427,7 +426,6 @@ public class ContactsProvider2Test extends BaseContactsProvider2Test { RawContacts.DIRTY, RawContacts.NAME_VERIFIED, RawContacts.DELETED, - RawContacts.IS_RESTRICTED, RawContacts.SYNC1, RawContacts.SYNC2, RawContacts.SYNC3, diff --git a/tests/src/com/android/providers/contacts/GroupsTest.java b/tests/src/com/android/providers/contacts/GroupsTest.java index 1846321..56b7100 100644 --- a/tests/src/com/android/providers/contacts/GroupsTest.java +++ b/tests/src/com/android/providers/contacts/GroupsTest.java @@ -28,10 +28,10 @@ import android.net.Uri; import android.os.RemoteException; import android.provider.ContactsContract; import android.provider.ContactsContract.AggregationExceptions; +import android.provider.ContactsContract.CommonDataKinds.GroupMembership; import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Groups; import android.provider.ContactsContract.Settings; -import android.provider.ContactsContract.CommonDataKinds.GroupMembership; import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.MediumTest; @@ -78,13 +78,13 @@ public class GroupsTest extends BaseContactsProvider2Test { long groupBlue = mActor.createGroup(GROUP_BLUE); // Create a handful of contacts - long contactAlpha = mActor.createRawContact(false, PERSON_ALPHA); - long contactBravo = mActor.createRawContact(false, PERSON_BRAVO); - long contactCharlie = mActor.createRawContact(false, PERSON_CHARLIE); - long contactCharlieDupe = mActor.createRawContact(false, PERSON_CHARLIE); + long contactAlpha = mActor.createRawContact(PERSON_ALPHA); + long contactBravo = mActor.createRawContact(PERSON_BRAVO); + long contactCharlie = mActor.createRawContact(PERSON_CHARLIE); + long contactCharlieDupe = mActor.createRawContact(PERSON_CHARLIE); setAggregationException( AggregationExceptions.TYPE_KEEP_TOGETHER, contactCharlie, contactCharlieDupe); - long contactDelta = mActor.createRawContact(false, PERSON_DELTA); + long contactDelta = mActor.createRawContact(PERSON_DELTA); assertAggregated(contactCharlie, contactCharlieDupe); diff --git a/tests/src/com/android/providers/contacts/RestrictionExceptionsTest.java b/tests/src/com/android/providers/contacts/RestrictionExceptionsTest.java deleted file mode 100644 index 053f6e6..0000000 --- a/tests/src/com/android/providers/contacts/RestrictionExceptionsTest.java +++ /dev/null @@ -1,358 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.providers.contacts; - -import static com.android.providers.contacts.ContactsActor.PACKAGE_GREY; -import static com.android.providers.contacts.ContactsActor.PACKAGE_RED; - -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Context; -import android.content.Entity; -import android.content.EntityIterator; -import android.content.res.AssetFileDescriptor; -import android.database.Cursor; -import android.net.Uri; -import android.provider.ContactsContract; -import android.provider.ContactsContract.AggregationExceptions; -import android.provider.LiveFolders; -import android.provider.ContactsContract.Contacts; -import android.provider.ContactsContract.Data; -import android.provider.ContactsContract.RawContacts; -import android.provider.ContactsContract.CommonDataKinds.Email; -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.LargeTest; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; - -/** - * Unit tests for {@link RawContacts#IS_RESTRICTED}. - */ -@LargeTest -public class RestrictionExceptionsTest extends AndroidTestCase { - private ContactsActor mGrey; - private ContactsActor mRed; - - private static final String PHONE_GREY = "555-1111"; - private static final String PHONE_RED = "555-2222"; - - private static final String EMAIL_GREY = "user@example.com"; - private static final String EMAIL_RED = "user@example.org"; - - private static final String GENERIC_STATUS = "Status update"; - private static final String GENERIC_NAME = "Smith"; - - public RestrictionExceptionsTest() { - } - - @Override - protected void setUp() throws Exception { - super.setUp(); - - final Context overallContext = this.getContext(); - - // Build each of our specific actors in their own Contexts - mGrey = new ContactsActor(overallContext, PACKAGE_GREY, - SynchronousContactsProvider2.class, ContactsContract.AUTHORITY); - mRed = new ContactsActor(overallContext, PACKAGE_RED, - SynchronousContactsProvider2.class, ContactsContract.AUTHORITY); - - // TODO make the provider wipe data automatically - ((SynchronousContactsProvider2)mGrey.provider).wipeData(); - } - - /** - * Assert that {@link Contacts#CONTACT_STATUS} matches the given value, or - * that no rows are returned when null. - */ - void assertStatus(ContactsActor actor, long aggId, String status) { - final Uri aggUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, aggId); - - actor.ensureCallingPackage(); - final Cursor cursor = actor.resolver.query(aggUri, - new String[] { Contacts.CONTACT_STATUS }, null, null, null); - try { - if (status == null) { - assertEquals(0, cursor.getCount()); - } else { - while (cursor.moveToNext()) { - final String foundStatus = cursor.getString(0); - assertEquals(status, foundStatus); - } - } - } finally { - cursor.close(); - } - } - - public void testRestrictedInsertRestrictedQuery() { - // Restricted query can read restricted data - final long rawContact = mGrey.createRawContact(true, GENERIC_NAME); - final int count = mGrey.getDataCountForRawContact(rawContact); - assertEquals(1, count); - } - - public void testRestrictedInsertGenericQuery() { - // Generic query is denied restricted data - final long rawContact = mGrey.createRawContact(true, GENERIC_NAME); - final int count = mRed.getDataCountForRawContact(rawContact); - assertEquals(0, count); - } - - public void testGenericInsertRestrictedQuery() { - // Restricted query can read generic data - final long rawContact = mRed.createRawContact(false, GENERIC_NAME); - final int count = mGrey.getDataCountForRawContact(rawContact); - assertEquals(1, count); - } - - public void testGenericInsertGenericQuery() { - // Generic query can read generic data - final long rawContact = mRed.createRawContact(false, GENERIC_NAME); - final int count = mRed.getDataCountForRawContact(rawContact); - assertEquals(1, count); - } - - public void testMixedAggregateRestrictedQuery() { - // Create mixed aggregate with a restricted phone number - final long greyRawContactId = mGrey.createRawContact(true, GENERIC_NAME); - mGrey.createPhone(greyRawContactId, PHONE_GREY); - final long redRawContactId = mRed.createRawContact(false, GENERIC_NAME); - mRed.createPhone(redRawContactId, PHONE_RED); - mGrey.setAggregationException( - AggregationExceptions.TYPE_KEEP_TOGETHER, greyRawContactId, redRawContactId); - - // Make sure both aggregates were joined - final long greyAgg = mGrey.getContactForRawContact(greyRawContactId); - final long redAgg = mRed.getContactForRawContact(redRawContactId); - assertEquals(greyAgg, redAgg); - - // Restricted reader should have access to both numbers - final int greyCount = mGrey.getDataCountForContact(greyAgg); - assertEquals(4, greyCount); - - // Generic reader should have limited access - final int redCount = mRed.getDataCountForContact(redAgg); - assertEquals(2, redCount); - } - - public void testUpdateRestricted() { - // Assert that we can't un-restrict something - final long greyContact = mGrey.createRawContact(true, GENERIC_NAME); - final long greyPhone = mGrey.createPhone(greyContact, PHONE_GREY); - - int count = mRed.getDataCountForRawContact(greyContact); - assertEquals(0, count); - - // Try un-restricting that contact - final Uri greyUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, greyContact); - final ContentValues values = new ContentValues(); - values.put(RawContacts.IS_RESTRICTED, 0); - mRed.ensureCallingPackage(); - mRed.provider.update(greyUri, values, null, null); - - count = mRed.getDataCountForRawContact(greyContact); - assertEquals(0, count); - } - - public void testExportVCard() throws Exception { - // Create mixed aggregate with a restricted phone number - final long greyRawContactId = mGrey.createRawContact(true, GENERIC_NAME); - mGrey.createPhone(greyRawContactId, PHONE_GREY); - final long redRawContactId = mRed.createRawContact(false, GENERIC_NAME); - mRed.createPhone(redRawContactId, PHONE_RED); - mGrey.setAggregationException( - AggregationExceptions.TYPE_KEEP_TOGETHER, greyRawContactId, redRawContactId); - - // Make sure both aggregates were joined - final long greyAgg = mGrey.getContactForRawContact(greyRawContactId); - final long redAgg = mRed.getContactForRawContact(redRawContactId); - assertEquals(greyAgg, redAgg); - - // Exported vCard shouldn't contain restricted phone - mRed.ensureCallingPackage(); - final Uri aggUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, greyAgg); - final Cursor cursor = mRed.resolver.query(aggUri, - new String[] { Contacts.LOOKUP_KEY }, null, null, null); - assertTrue(cursor.moveToFirst()); - final String lookupKey = cursor.getString(0); - cursor.close(); - - // Read vCard into buffer - final Uri shareUri = Uri.withAppendedPath(Contacts.CONTENT_VCARD_URI, lookupKey); - final AssetFileDescriptor file = mRed.resolver.openAssetFileDescriptor(shareUri, "r"); - final InputStream in = file.createInputStream(); - final byte[] buf = readInputStream(in); - final String card = new String(buf); - assertNotSame(0, card.length()); - - // Make sure that only unrestricted phones appear - assertTrue(card.indexOf(PHONE_RED) != -1); - assertTrue(card.indexOf(PHONE_GREY) == -1); - } - - private static byte[] readInputStream(InputStream in) throws IOException { - try { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - byte[] buf = new byte[4096]; - int count; - while ((count = in.read(buf)) != -1) { - out.write(buf, 0, count); - } - return out.toByteArray(); - } finally { - in.close(); - } - } - - public void testContactsLiveFolder() { - final long greyContact = mGrey.createRawContact(true, GENERIC_NAME); - final long greyPhone = mGrey.createPhone(greyContact, PHONE_GREY); - - // Protected contact should be omitted from live folder - mRed.ensureCallingPackage(); - final Uri folderUri = Uri.withAppendedPath(ContactsContract.AUTHORITY_URI, - "live_folders/contacts_with_phones"); - final Cursor cursor = mRed.resolver.query(folderUri, - new String[] { LiveFolders._ID }, null, null, null); - try { - while (cursor.moveToNext()) { - final long id = cursor.getLong(0); - assertFalse(id == greyContact); - } - } finally { - cursor.close(); - } - } - - public void testRestrictedQueryParam() throws Exception { - final long greyContact = mGrey.createRawContact(true, GENERIC_NAME); - final long greyPhone = mGrey.createPhone(greyContact, PHONE_GREY); - - Uri greyUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, greyContact); - greyUri = Uri.withAppendedPath(greyUri, RawContacts.Entity.CONTENT_DIRECTORY); - Uri redUri = greyUri.buildUpon().appendQueryParameter( - ContactsContract.REQUESTING_PACKAGE_PARAM_KEY, mRed.packageName).build(); - - // When calling normally, we have access to protected - mGrey.ensureCallingPackage(); - EntityIterator iterator = RawContacts.newEntityIterator( - mGrey.resolver.query(greyUri, null, null, null, null)); - while (iterator.hasNext()) { - final Entity entity = iterator.next(); - final long rawContactId = entity.getEntityValues().getAsLong(RawContacts._ID); - assertTrue(rawContactId == greyContact); - } - iterator.close(); - - // When calling on behalf of another package, protected is omitted - mGrey.ensureCallingPackage(); - iterator = RawContacts.newEntityIterator( - mGrey.resolver.query(redUri, null, null, null, null)); - while (iterator.hasNext()) { - final Entity entity = iterator.next(); - final long rawContactId = entity.getEntityValues().getAsLong(RawContacts._ID); - assertTrue(rawContactId != greyContact); - } - iterator.close(); - } - - public void testRestrictedEmailLookupRestricted() { - final long greyContact = mGrey.createRawContact(true, GENERIC_NAME); - final long greyEmail = mGrey.createEmail(greyContact, EMAIL_GREY); - - // Restricted caller should see protected data - mGrey.ensureCallingPackage(); - final Uri lookupUri = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, EMAIL_GREY); - final Cursor cursor = mGrey.resolver.query(lookupUri, - new String[] { Data._ID }, null, null, null); - try { - while (cursor.moveToNext()) { - final long dataId = cursor.getLong(0); - assertTrue(dataId == greyEmail); - } - } finally { - cursor.close(); - } - } - - public void testRestrictedEmailLookupGeneric() { - final long greyContact = mGrey.createRawContact(true, GENERIC_NAME); - final long greyEmail = mGrey.createEmail(greyContact, EMAIL_GREY); - - // Generic caller should never see protected data - mRed.ensureCallingPackage(); - final Uri lookupUri = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, EMAIL_GREY); - final Cursor cursor = mRed.resolver.query(lookupUri, - new String[] { Data._ID }, null, null, null); - try { - while (cursor.moveToNext()) { - final long dataId = cursor.getLong(0); - assertFalse(dataId == greyEmail); - } - } finally { - cursor.close(); - } - } - - public void testStatusRestrictedInsertRestrictedQuery() { - final long rawContactId = mGrey.createRawContactWithStatus(true, - GENERIC_NAME, EMAIL_GREY, GENERIC_STATUS); - final long aggId = mGrey.getContactForRawContact(rawContactId); - - // Restricted query can read restricted status - assertStatus(mGrey, aggId, GENERIC_STATUS); - } - - public void testStatusRestrictedInsertGenericQuery() { - final long rawContactId = mGrey.createRawContactWithStatus(true, - GENERIC_NAME, EMAIL_GREY, GENERIC_STATUS); - final long aggId = mGrey.getContactForRawContact(rawContactId); - - // Generic query is denied restricted status - assertStatus(mRed, aggId, null); - } - - public void testStatusGenericInsertRestrictedQuery() { - final long rawContactId = mRed.createRawContactWithStatus(false, - GENERIC_NAME, EMAIL_RED, GENERIC_STATUS); - final long aggId = mRed.getContactForRawContact(rawContactId); - - // Restricted query can read generic status - assertStatus(mGrey, aggId, GENERIC_STATUS); - } - - public void testStatusGenericInsertGenericQuery() { - final long rawContactId = mRed.createRawContactWithStatus(false, - GENERIC_NAME, EMAIL_RED, GENERIC_STATUS); - final long aggId = mRed.getContactForRawContact(rawContactId); - - // Generic query can read generic status - assertStatus(mRed, aggId, GENERIC_STATUS); - } - - public void testStrictProjectionMap() { - try { - mGrey.provider.query(ContactsContract.Contacts.CONTENT_URI, - new String[] { "_id as noname, * FROM contacts--" }, null, null, null); - fail(); - } catch (Exception e) { - } - } -} |