diff --git a/samples/ApiDemos/res/values/strings.xml b/samples/ApiDemos/res/values/strings.xml index 802fc805d..db6f56fda 100644 --- a/samples/ApiDemos/res/values/strings.xml +++ b/samples/ApiDemos/res/values/strings.xml @@ -506,7 +506,6 @@ Right From: To: - Nothing\u2026 Snack "You have selected: " (none) @@ -887,8 +886,8 @@ - WARNING: this demo can send actual text messages (one at a time), so be sure to - test with the Android emulator or have a text messaging plan with your carrier. + WARNING: this demo can send actual text messages (one at a time), so be sure to + test with the Android emulator or have a text messaging plan with your carrier. Enable SMS broadcast receiver Recipient # @@ -898,4 +897,3 @@ Reply Dismiss - diff --git a/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete4.java b/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete4.java index c6fa08ba0..3d63a9183 100644 --- a/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete4.java +++ b/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete4.java @@ -22,13 +22,15 @@ import android.app.Activity; import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; +import android.net.Uri; import android.os.Bundle; -import android.provider.Contacts; +import android.provider.ContactsContract.Contacts; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AutoCompleteTextView; import android.widget.CursorAdapter; +import android.widget.FilterQueryProvider; import android.widget.Filterable; import android.widget.TextView; @@ -39,8 +41,9 @@ public class AutoComplete4 extends Activity { setContentView(R.layout.autocomplete_4); ContentResolver content = getContentResolver(); - Cursor cursor = content.query(Contacts.People.CONTENT_URI, - PEOPLE_PROJECTION, null, null, Contacts.People.DEFAULT_SORT_ORDER); + Cursor cursor = content.query(Contacts.CONTENT_URI, + CONTACT_PROJECTION, null, null, null); + ContactListAdapter adapter = new ContactListAdapter(this, cursor); AutoCompleteTextView textView = (AutoCompleteTextView) @@ -61,50 +64,40 @@ public class AutoComplete4 extends Activity { final LayoutInflater inflater = LayoutInflater.from(context); final TextView view = (TextView) inflater.inflate( android.R.layout.simple_dropdown_item_1line, parent, false); - view.setText(cursor.getString(5)); + view.setText(cursor.getString(COLUMN_DISPLAY_NAME)); return view; } @Override public void bindView(View view, Context context, Cursor cursor) { - ((TextView) view).setText(cursor.getString(5)); + ((TextView) view).setText(cursor.getString(COLUMN_DISPLAY_NAME)); } @Override public String convertToString(Cursor cursor) { - return cursor.getString(5); + return cursor.getString(COLUMN_DISPLAY_NAME); } @Override public Cursor runQueryOnBackgroundThread(CharSequence constraint) { - if (getFilterQueryProvider() != null) { - return getFilterQueryProvider().runQuery(constraint); + FilterQueryProvider filter = getFilterQueryProvider(); + if (filter != null) { + return filter.runQuery(constraint); } - StringBuilder buffer = null; - String[] args = null; - if (constraint != null) { - buffer = new StringBuilder(); - buffer.append("UPPER("); - buffer.append(Contacts.ContactMethods.NAME); - buffer.append(") GLOB ?"); - args = new String[] { constraint.toString().toUpperCase() + "*" }; - } - - return mContent.query(Contacts.People.CONTENT_URI, PEOPLE_PROJECTION, - buffer == null ? null : buffer.toString(), args, - Contacts.People.DEFAULT_SORT_ORDER); + Uri uri = Uri.withAppendedPath( + Contacts.CONTENT_FILTER_URI, + Uri.encode(constraint.toString())); + return mContent.query(uri, CONTACT_PROJECTION, null, null, null); } - private ContentResolver mContent; + private ContentResolver mContent; } - private static final String[] PEOPLE_PROJECTION = new String[] { - Contacts.People._ID, - Contacts.People.PRIMARY_PHONE_ID, - Contacts.People.TYPE, - Contacts.People.NUMBER, - Contacts.People.LABEL, - Contacts.People.NAME, + public static final String[] CONTACT_PROJECTION = new String[] { + Contacts._ID, + Contacts.DISPLAY_NAME }; -} + + private static final int COLUMN_DISPLAY_NAME = 1; +} \ No newline at end of file diff --git a/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete5.java b/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete5.java index 7406da4f1..2009d8a20 100644 --- a/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete5.java +++ b/samples/ApiDemos/src/com/example/android/apis/view/AutoComplete5.java @@ -22,7 +22,7 @@ import android.app.Activity; import android.content.ContentResolver; import android.database.Cursor; import android.os.Bundle; -import android.provider.Contacts; +import android.provider.ContactsContract.Contacts; import android.widget.AutoCompleteTextView; public class AutoComplete5 extends Activity { @@ -32,8 +32,8 @@ public class AutoComplete5 extends Activity { setContentView(R.layout.autocomplete_5); ContentResolver content = getContentResolver(); - Cursor cursor = content.query(Contacts.People.CONTENT_URI, - PEOPLE_PROJECTION, null, null, Contacts.People.DEFAULT_SORT_ORDER); + Cursor cursor = content.query(Contacts.CONTENT_URI, + AutoComplete4.CONTACT_PROJECTION, null, null, null); AutoComplete4.ContactListAdapter adapter = new AutoComplete4.ContactListAdapter(this, cursor); @@ -41,13 +41,4 @@ public class AutoComplete5 extends Activity { findViewById(R.id.edit); textView.setAdapter(adapter); } - - private static final String[] PEOPLE_PROJECTION = new String[] { - Contacts.People._ID, - Contacts.People.PRIMARY_PHONE_ID, - Contacts.People.TYPE, - Contacts.People.NUMBER, - Contacts.People.LABEL, - Contacts.People.NAME - }; -} +} \ No newline at end of file diff --git a/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList2.java b/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList2.java index 5784122fa..b6cce2964 100644 --- a/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList2.java +++ b/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList2.java @@ -17,49 +17,49 @@ package com.example.android.apis.view; import android.app.ExpandableListActivity; -import android.content.ContentUris; import android.content.Context; import android.database.Cursor; -import android.net.Uri; import android.os.Bundle; -import android.provider.Contacts.People; +import android.provider.ContactsContract.Contacts; +import android.provider.ContactsContract.CommonDataKinds.Phone; import android.widget.ExpandableListAdapter; import android.widget.SimpleCursorTreeAdapter; - /** * Demonstrates expandable lists backed by Cursors */ public class ExpandableList2 extends ExpandableListActivity { - private int mGroupIdColumnIndex; - - private String mPhoneNumberProjection[] = new String[] { - People.Phones._ID, People.Phones.NUMBER + private static final int COLUMN_CONTACT_ID = 0; + + private static final String[] CONTACT_PROJECTION = new String[] { + Contacts._ID, + Contacts.DISPLAY_NAME + }; + + private static final String[] PHONE_PROJECTION = new String[] { + Phone._ID, + Phone.CONTACT_ID, + Phone.NUMBER }; - private ExpandableListAdapter mAdapter; - @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Query for people - Cursor groupCursor = managedQuery(People.CONTENT_URI, - new String[] {People._ID, People.NAME}, null, null, null); - - // Cache the ID column index - mGroupIdColumnIndex = groupCursor.getColumnIndexOrThrow(People._ID); + Cursor groupCursor = managedQuery(Contacts.CONTENT_URI, + CONTACT_PROJECTION, null, null, null); // Set up our adapter mAdapter = new MyExpandableListAdapter(groupCursor, this, android.R.layout.simple_expandable_list_item_1, android.R.layout.simple_expandable_list_item_1, - new String[] {People.NAME}, // Name for group layouts + new String[] {Contacts.DISPLAY_NAME}, // Name for group layouts new int[] {android.R.id.text1}, - new String[] {People.NUMBER}, // Number for child layouts + new String[] {Phone.NUMBER}, // Number for child layouts new int[] {android.R.id.text1}); setListAdapter(mAdapter); } @@ -75,18 +75,13 @@ public class ExpandableList2 extends ExpandableListActivity { @Override protected Cursor getChildrenCursor(Cursor groupCursor) { - // Given the group, we return a cursor for all the children within that group - - // Return a cursor that points to this contact's phone numbers - Uri.Builder builder = People.CONTENT_URI.buildUpon(); - ContentUris.appendId(builder, groupCursor.getLong(mGroupIdColumnIndex)); - builder.appendEncodedPath(People.Phones.CONTENT_DIRECTORY); - Uri phoneNumbersUri = builder.build(); - + int contactId = groupCursor.getInt(COLUMN_CONTACT_ID); // The returned Cursor MUST be managed by us, so we use Activity's helper // functionality to manage it for us. - return managedQuery(phoneNumbersUri, mPhoneNumberProjection, null, null, null); + return managedQuery(Phone.CONTENT_URI, + PHONE_PROJECTION, + Phone.CONTACT_ID + " = " + contactId, + null, null); } - } -} +} \ No newline at end of file diff --git a/samples/ApiDemos/src/com/example/android/apis/view/Gallery2.java b/samples/ApiDemos/src/com/example/android/apis/view/Gallery2.java index 2eea1ff9b..ed334513c 100644 --- a/samples/ApiDemos/src/com/example/android/apis/view/Gallery2.java +++ b/samples/ApiDemos/src/com/example/android/apis/view/Gallery2.java @@ -17,9 +17,8 @@ package com.example.android.apis.view; import android.app.Activity; -import android.content.Context; import android.database.Cursor; -import android.provider.Contacts.People; +import android.provider.ContactsContract.Contacts; import android.os.Bundle; import android.widget.Gallery; import android.widget.SimpleCursorAdapter; @@ -37,16 +36,17 @@ public class Gallery2 extends Activity { setContentView(R.layout.gallery_2); // Get a cursor with all people - Cursor c = getContentResolver().query(People.CONTENT_URI, null, null, null, null); + Cursor c = getContentResolver().query(Contacts.CONTENT_URI, + CONTACT_PROJECTION, null, null, null); startManagingCursor(c); - + SpinnerAdapter adapter = new SimpleCursorAdapter(this, // Use a template that displays a text view android.R.layout.simple_gallery_item, // Give the cursor to the list adatper c, // Map the NAME column in the people database to... - new String[] {People.NAME}, + new String[] {Contacts.DISPLAY_NAME}, // The "text1" view defined in the XML template new int[] { android.R.id.text1 }); @@ -54,4 +54,8 @@ public class Gallery2 extends Activity { g.setAdapter(adapter); } -} + private static final String[] CONTACT_PROJECTION = new String[] { + Contacts._ID, + Contacts.DISPLAY_NAME + }; +} \ No newline at end of file diff --git a/samples/ApiDemos/src/com/example/android/apis/view/List2.java b/samples/ApiDemos/src/com/example/android/apis/view/List2.java index 4f37dd87f..4dca2a76e 100644 --- a/samples/ApiDemos/src/com/example/android/apis/view/List2.java +++ b/samples/ApiDemos/src/com/example/android/apis/view/List2.java @@ -18,34 +18,40 @@ package com.example.android.apis.view; import android.app.ListActivity; import android.database.Cursor; -import android.provider.Contacts.People; +import android.provider.ContactsContract.Contacts; import android.os.Bundle; import android.widget.ListAdapter; import android.widget.SimpleCursorAdapter; /** - * A list view example where the + * A list view example where the * data comes from a cursor. */ public class List2 extends ListActivity { - + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Get a cursor with all people - Cursor c = getContentResolver().query(People.CONTENT_URI, null, null, null, null); + Cursor c = getContentResolver().query(Contacts.CONTENT_URI, + CONTACT_PROJECTION, null, null, null); startManagingCursor(c); - ListAdapter adapter = new SimpleCursorAdapter(this, + ListAdapter adapter = new SimpleCursorAdapter(this, // Use a template that displays a text view - android.R.layout.simple_list_item_1, + android.R.layout.simple_list_item_1, // Give the cursor to the list adatper - c, + c, // Map the NAME column in the people database to... - new String[] {People.NAME} , + new String[] {Contacts.DISPLAY_NAME}, // The "text1" view defined in the XML template - new int[] {android.R.id.text1}); + new int[] {android.R.id.text1}); setListAdapter(adapter); } -} + + private static final String[] CONTACT_PROJECTION = new String[] { + Contacts._ID, + Contacts.DISPLAY_NAME + }; +} \ No newline at end of file diff --git a/samples/ApiDemos/src/com/example/android/apis/view/List3.java b/samples/ApiDemos/src/com/example/android/apis/view/List3.java index 17e59f156..9c3b4b428 100644 --- a/samples/ApiDemos/src/com/example/android/apis/view/List3.java +++ b/samples/ApiDemos/src/com/example/android/apis/view/List3.java @@ -16,36 +16,69 @@ package com.example.android.apis.view; - import android.app.ListActivity; import android.database.Cursor; import android.os.Bundle; -import android.provider.Contacts.Phones; -import android.widget.ListAdapter; +import android.provider.ContactsContract.CommonDataKinds.Phone; +import android.view.View; import android.widget.SimpleCursorAdapter; +import android.widget.TextView; /** - * A list view example where the + * A list view example where the * data comes from a cursor, and a * SimpleCursorListAdapter is used to map each item to a two-line * display. */ public class List3 extends ListActivity { - + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Get a cursor with all phones - Cursor c = getContentResolver().query(Phones.CONTENT_URI, null, null, null, null); + Cursor c = getContentResolver().query(Phone.CONTENT_URI, + PHONE_PROJECTION, null, null, null); startManagingCursor(c); - + // Map Cursor columns to views defined in simple_list_item_2.xml - ListAdapter adapter = new SimpleCursorAdapter(this, - android.R.layout.simple_list_item_2, c, - new String[] { Phones.NAME, Phones.NUMBER }, + SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, + android.R.layout.simple_list_item_2, c, + new String[] { + Phone.TYPE, + Phone.NUMBER + }, new int[] { android.R.id.text1, android.R.id.text2 }); + //Used to display a readable string for the phone type + adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() { + public boolean setViewValue(View view, Cursor cursor, int columnIndex) { + //Let the adapter handle the binding if the column is not TYPE + if (columnIndex != COLUMN_TYPE) { + return false; + } + int type = cursor.getInt(COLUMN_TYPE); + String label = null; + //Custom type? Then get the custom label + if (type == Phone.TYPE_CUSTOM) { + label = cursor.getString(COLUMN_LABEL); + } + //Get the readable string + String text = (String) Phone.getTypeLabel(getResources(), type, label); + //Set text + ((TextView) view).setText(text); + return true; + } + }); setListAdapter(adapter); } - -} + + private static final String[] PHONE_PROJECTION = new String[] { + Phone._ID, + Phone.TYPE, + Phone.LABEL, + Phone.NUMBER + }; + + private static final int COLUMN_TYPE = 1;; + private static final int COLUMN_LABEL = 2; +} \ No newline at end of file diff --git a/samples/ApiDemos/src/com/example/android/apis/view/List7.java b/samples/ApiDemos/src/com/example/android/apis/view/List7.java index e773db62a..ff5406ffe 100644 --- a/samples/ApiDemos/src/com/example/android/apis/view/List7.java +++ b/samples/ApiDemos/src/com/example/android/apis/view/List7.java @@ -16,12 +16,15 @@ package com.example.android.apis.view; +// Need the following import to get access to the app resources, since this +// class is in a sub-package. import com.example.android.apis.R; + import android.app.ListActivity; import android.database.Cursor; +import android.provider.ContactsContract.CommonDataKinds.Phone; import android.os.Bundle; -import android.provider.ContactsContract; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; @@ -33,69 +36,64 @@ import android.widget.TextView; * A list view example where the data comes from a cursor. */ public class List7 extends ListActivity implements OnItemSelectedListener { - private static final String[] PROJECTION = new String[] { - ContactsContract.Contacts._ID, - ContactsContract.Contacts.DISPLAY_NAME, - ContactsContract.Contacts.HAS_PHONE_NUMBER, - ContactsContract.Contacts.LOOKUP_KEY - }; - - private int mIdColumnIndex; - private int mHasPhoneColumnIndex; private TextView mPhone; + private static final String[] PHONE_PROJECTION = new String[] { + Phone._ID, + Phone.TYPE, + Phone.LABEL, + Phone.NUMBER, + Phone.DISPLAY_NAME + }; + + private static final int COLUMN_PHONE_TYPE = 1; + private static final int COLUMN_PHONE_LABEL = 2; + private static final int COLUMN_PHONE_NUMBER = 3; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.list_7); - mPhone = (TextView) findViewById(R.id.phone); getListView().setOnItemSelectedListener(this); - // Get a cursor with all people - Cursor c = managedQuery(ContactsContract.Contacts.CONTENT_URI, - PROJECTION, null, null, null); - mIdColumnIndex = c.getColumnIndex(ContactsContract.Contacts._ID); - mHasPhoneColumnIndex = c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER); + // Get a cursor with all numbers. + // This query will only return contacts with phone numbers + Cursor c = getContentResolver().query(Phone.CONTENT_URI, + PHONE_PROJECTION, Phone.NUMBER + " NOT NULL", null, null); + startManagingCursor(c); ListAdapter adapter = new SimpleCursorAdapter(this, - android.R.layout.simple_list_item_1, // Use a template - // that displays a - // text view - c, // Give the cursor to the list adapter - new String[] { ContactsContract.Contacts.DISPLAY_NAME }, // Map the NAME column in the - // people database to... - new int[] { android.R.id.text1 }); // The "text1" view defined in - // the XML template + // Use a template that displays a text view + android.R.layout.simple_list_item_1, + // Give the cursor to the list adapter + c, + // Map the DISPLAY_NAME column to... + new String[] {Phone.DISPLAY_NAME}, + // The "text1" view defined in the XML template + new int[] {android.R.id.text1}); setListAdapter(adapter); } - public void onItemSelected(AdapterView parent, View v, int position, long id) { + public void onItemSelected(AdapterView parent, View v, int position, long id) { if (position >= 0) { - final Cursor c = (Cursor) parent.getItemAtPosition(position); - if (c.getInt(mHasPhoneColumnIndex) > 0) { - final long contactId = c.getLong(mIdColumnIndex); - final Cursor phones = getContentResolver().query( - ContactsContract.CommonDataKinds.Phone.CONTENT_URI, - new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER }, - ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId, null, - ContactsContract.CommonDataKinds.Phone.IS_SUPER_PRIMARY + " DESC"); - - try { - phones.moveToFirst(); - mPhone.setText(phones.getString(0)); - } finally { - phones.close(); - } - } else { - mPhone.setText(R.string.list_7_nothing); + //Get current cursor + Cursor c = (Cursor) parent.getItemAtPosition(position); + int type = c.getInt(COLUMN_PHONE_TYPE); + String phone = c.getString(COLUMN_PHONE_NUMBER); + String label = null; + //Custom type? Then get the custom label + if (type == Phone.TYPE_CUSTOM) { + label = c.getString(COLUMN_PHONE_LABEL); } + //Get the readable string + String numberType = (String) Phone.getTypeLabel(getResources(), type, label); + String text = numberType + ": " + phone; + mPhone.setText(text); } } - public void onNothingSelected(AdapterView parent) { - mPhone.setText(R.string.list_7_nothing); + public void onNothingSelected(AdapterView parent) { } }