Search code examples
androidpreferences

Duplicated contact on preference item


I'm creating a PreferencesActivity where I have 3 preference items. When I click on each of them, I load contacts to pick one. After selecting a contact, I save it's name and phone number and I show it in the preference item. This is the way I do it:

preferences.xml

<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android" >

    <PreferenceCategory 
        android:title="@string/contact">

        <Preference 
            android:key="Contact1"
            android:title="Contact 1"/>

        <Preference 
            android:key="Contact2"
            android:title="Contact 2"/>

        <Preference 
            android:key="Contact3"
            android:title="Contact 3"/>    
    </PreferenceCategory>
</PreferenceScreen>

UserSettingsActivity.java extending PreferenceActivity

SharedPreferences mPreferences;
Preference contact1;
Preference contact2;
Preference contact3;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);

    contact1 = findPreference("Contact1");
    contact2 = findPreference("Contact2");
    contact3 = findPreference("Contact3");

    contact1.setOnPreferenceClickListener(new OnPreferenceClickListener() {
        @Override
        public boolean onPreferenceClick(Preference preference) {
            Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
            startActivityForResult(intent, PICK_CONTACT_1);
            return false;
        }
    });
    contact2.setOnPreferenceClickListener(new OnPreferenceClickListener() {
        @Override
        public boolean onPreferenceClick(Preference preference) {
            Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
            startActivityForResult(intent, PICK_CONTACT_2);
            return false;
        }
    });
    contact3.setOnPreferenceClickListener(new OnPreferenceClickListener() {
        @Override
        public boolean onPreferenceClick(Preference preference) {
            Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
            startActivityForResult(intent, PICK_CONTACT_3);
            return false;
        }
    });
}


@Override
public void onActivityResult(int reqCode, int resultCode, Intent data) {
    super.onActivityResult(reqCode, resultCode, data);
    Uri contactData = data.getData();
    switch(reqCode) {
        case (PICK_CONTACT_1):
            if (resultCode == RESULT_OK){
                String contactID = null;
                String contactNumber = null;
                String contactName = null;
                /*Get contact ID*/
                Cursor cursorID = getContentResolver().query(contactData, new String[]{ContactsContract.Contacts._ID},
                        null, null, null);
                if (cursorID.moveToFirst()) {
                    contactID = cursorID.getString(cursorID.getColumnIndex(ContactsContract.Contacts._ID));
                }
                cursorID.close();
                /*Get contact number using ID*/
                Cursor cursorPhone = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER},
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? AND " +
                                ContactsContract.CommonDataKinds.Phone.TYPE + " = " +
                                ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE,
                                new String[]{contactID}, null);
                if (cursorPhone.moveToFirst()) {
                    contactNumber = cursorPhone.getString(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                }
                cursorPhone.close();
                /*Get name*/
                Cursor cursor = getContentResolver().query(contactData, null, null, null, null);
                if (cursor.moveToFirst()) {
                    contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                }
                cursor.close();
                /*Show on preferences*/
                contact1.setTitle(contactName);
                contact1.setSummary(contactNumber);
            }
        case (PICK_CONTACT_2):
            if (resultCode == RESULT_OK){
                String contactID = null;
                String contactNumber = null;
                String contactName = null;
                /*Get contact ID*/
                Cursor cursorID = getContentResolver().query(contactData, new String[]{ContactsContract.Contacts._ID},
                        null, null, null);
                if (cursorID.moveToFirst()) {
                    contactID = cursorID.getString(cursorID.getColumnIndex(ContactsContract.Contacts._ID));
                }
                cursorID.close();
                /*Get contact number using ID*/
                Cursor cursorPhone = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER},
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? AND " +
                                ContactsContract.CommonDataKinds.Phone.TYPE + " = " +
                                ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE,
                                new String[]{contactID}, null);
                if (cursorPhone.moveToFirst()) {
                    contactNumber = cursorPhone.getString(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                }
                cursorPhone.close();
                /*Get name*/
                Cursor cursor = getContentResolver().query(contactData, null, null, null, null);
                if (cursor.moveToFirst()) {
                    contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                }
                cursor.close();
                /*Show on preferences*/
                contact2.setTitle(contactName);
                contact2.setSummary(contactNumber);
            }
        case (PICK_CONTACT_3):
            if (resultCode == RESULT_OK){
                String contactID = null;
                String contactNumber = null;
                String contactName = null;
                /*Get contact ID*/
                Cursor cursorID = getContentResolver().query(contactData, new String[]{ContactsContract.Contacts._ID},
                        null, null, null);
                if (cursorID.moveToFirst()) {
                    contactID = cursorID.getString(cursorID.getColumnIndex(ContactsContract.Contacts._ID));
                }
                cursorID.close();
                /*Get contact number using ID*/
                Cursor cursorPhone = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER},
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? AND " +
                                ContactsContract.CommonDataKinds.Phone.TYPE + " = " +
                                ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE,
                                new String[]{contactID}, null);
                if (cursorPhone.moveToFirst()) {
                    contactNumber = cursorPhone.getString(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                }
                cursorPhone.close();
                /*Get name*/
                Cursor cursor = getContentResolver().query(contactData, null, null, null, null);
                if (cursor.moveToFirst()) {
                    contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                }
                cursor.close();
                /*Show on preferences*/
                contact3.setTitle(contactName);
                contact3.setSummary(contactNumber);
            }
    }
}  

The problem is that when I set a contact for Contact1, also Contact2 and Contact3 are getting the same contact. Is the first time I'm working with preferences so I don't know what could be the reason for this.


Solution

  • The problem isn't with the Preferences but rather, with the switch statement.

    You need to break at the end of each statement. Without a break, statements after a matching case label will be executed sequentially, regardless of the expressions of subsequent case labels.

    Just include a break statement to prevent the statements in your switch blocks from falling through:

     switch(reqCode) {
            case (PICK_CONTACT_1):
               ---------
               ---------
                 break;
            case (PICK_CONTACT_2):
                ---------
               ---------
                break;
            case (PICK_CONTACT_3):
               ---------
               ---------
                break;
    
    }