Improved in-app contact editor + updated liblinphone

This commit is contained in:
Sylvain Berfini 2012-11-09 10:03:17 +01:00
parent 2d0821719a
commit 00c1ee4586
5 changed files with 108 additions and 27 deletions

View file

@ -66,15 +66,34 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
linphone:picture="@drawable/unknown_small" /> linphone:picture="@drawable/unknown_small" />
<EditText <LinearLayout
android:id="@+id/contactName"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textColor="@android:color/black" android:orientation="vertical">
android:background="@drawable/chat_fast_address_background"
android:gravity="left" <EditText
android:paddingRight="5dp" android:id="@+id/contactLastName"
android:inputType="textPersonName|textCapWords"/> android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/contact_last_name"
android:textColor="@android:color/black"
android:background="@drawable/chat_fast_address_background"
android:gravity="left"
android:paddingRight="5dp"
android:inputType="textPersonName|textCapWords"/>
<EditText
android:id="@+id/contactFirstName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/contact_first_name"
android:textColor="@android:color/black"
android:background="@drawable/chat_fast_address_background"
android:gravity="left"
android:paddingRight="5dp"
android:inputType="textPersonName|textCapWords"/>
</LinearLayout>
</LinearLayout> </LinearLayout>

View file

@ -344,5 +344,7 @@
<string name="delete_contact">Supprimer contact</string> <string name="delete_contact">Supprimer contact</string>
<string name="sip_address">Adresse SIP</string> <string name="sip_address">Adresse SIP</string>
<string name="phone_number">Numéro de téléphone</string> <string name="phone_number">Numéro de téléphone</string>
<string name="contact_first_name">Prénom</string>
<string name="contact_last_name">Nom</string>
</resources> </resources>

View file

@ -391,4 +391,6 @@
<string name="delete_contact">Delete contact</string> <string name="delete_contact">Delete contact</string>
<string name="sip_address">SIP address</string> <string name="sip_address">SIP address</string>
<string name="phone_number">Phone number</string> <string name="phone_number">Phone number</string>
<string name="contact_first_name">First name</string>
<string name="contact_last_name">Last name</string>
</resources> </resources>

View file

@ -28,7 +28,7 @@ import android.widget.TextView;
public class EditContactFragment extends Fragment { public class EditContactFragment extends Fragment {
private View view; private View view;
private TextView ok; private TextView ok;
private EditText displayName; private EditText firstName, lastName;
private LayoutInflater inflater; private LayoutInflater inflater;
private View deleteContact; private View deleteContact;
@ -86,11 +86,31 @@ public class EditContactFragment extends Fragment {
} }
}); });
displayName = (EditText) view.findViewById(R.id.contactName); lastName = (EditText) view.findViewById(R.id.contactLastName);
displayName.addTextChangedListener(new TextWatcher() { lastName.addTextChangedListener(new TextWatcher() {
@Override @Override
public void onTextChanged(CharSequence s, int start, int before, int count) { public void onTextChanged(CharSequence s, int start, int before, int count) {
if (displayName.getText().length() > 0) { if (lastName.getText().length() > 0) {
ok.setEnabled(true);
} else {
ok.setEnabled(false);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
firstName = (EditText) view.findViewById(R.id.contactFirstName);
firstName.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (firstName.getText().length() > 0) {
ok.setEnabled(true); ok.setEnabled(true);
} else { } else {
ok.setEnabled(false); ok.setEnabled(false);
@ -107,7 +127,14 @@ public class EditContactFragment extends Fragment {
}); });
if (!isNewContact) { if (!isNewContact) {
displayName.setText(contact.getName()); String fn = findContactFirstName(String.valueOf(contactID));
String ln = findContactLastName(String.valueOf(contactID));
if (fn != null || ln != null) {
firstName.setText(fn);
lastName.setText(ln);
} else {
lastName.setText(contact.getName());
}
} }
AvatarWithShadow contactPicture = (AvatarWithShadow) view.findViewById(R.id.contactPicture); AvatarWithShadow contactPicture = (AvatarWithShadow) view.findViewById(R.id.contactPicture);
@ -205,6 +232,7 @@ public class EditContactFragment extends Fragment {
final NewOrUpdatedNumberOrAddress nounoa = new NewOrUpdatedNumberOrAddress(isSip); final NewOrUpdatedNumberOrAddress nounoa = new NewOrUpdatedNumberOrAddress(isSip);
final EditText noa = (EditText) view.findViewById(R.id.numoraddr); final EditText noa = (EditText) view.findViewById(R.id.numoraddr);
numbersAndAddresses.add(nounoa);
noa.setHint(isSip ? getString(R.string.sip_address) : getString(R.string.phone_number)); noa.setHint(isSip ? getString(R.string.sip_address) : getString(R.string.phone_number));
noa.requestFocus(); noa.requestFocus();
noa.addTextChangedListener(new TextWatcher() { noa.addTextChangedListener(new TextWatcher() {
@ -227,7 +255,6 @@ public class EditContactFragment extends Fragment {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
// Add a line, and change add button for a delete button // Add a line, and change add button for a delete button
numbersAndAddresses.add(nounoa);
add.setImageResource(R.drawable.list_delete); add.setImageResource(R.drawable.list_delete);
add.setOnClickListener(new OnClickListener() { add.setOnClickListener(new OnClickListener() {
@Override @Override
@ -268,40 +295,38 @@ public class EditContactFragment extends Fragment {
.withValue(RawContacts.ACCOUNT_TYPE, null) .withValue(RawContacts.ACCOUNT_TYPE, null)
.withValue(RawContacts.ACCOUNT_NAME, null).build()); .withValue(RawContacts.ACCOUNT_NAME, null).build());
if (displayName.getText().length() > 0) { if (getDisplayName() != null) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, contactID) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, contactID)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName.getText().toString()) .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, getDisplayName())
.build() .build()
); );
} }
} }
private void updateExistingContact() { private void updateExistingContact() {
if (displayName.getText().length() > 0) { if (getDisplayName() != null) {
String select = ContactsContract.Data.CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE + "'" ; String select = ContactsContract.Data.CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE + "'" ;
String[] args = new String[] { String.valueOf(contactID) }; String[] args = new String[] { String.valueOf(contactID) };
ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI) ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
.withSelection(select, args) .withSelection(select, args)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName.getText().toString()) .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, getDisplayName())
.build() .build()
); );
} }
} }
private void deleteExistingContact() { private void deleteExistingContact() {
if (displayName.getText().length() > 0) { String select = ContactsContract.Data.CONTACT_ID + "=?";
String select = ContactsContract.Data.CONTACT_ID + "=?"; String[] args = new String[] { String.valueOf(contactID) };
String[] args = new String[] { String.valueOf(contactID) };
ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI)
ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI) .withSelection(select, args)
.withSelection(select, args) .build()
.build() );
);
}
try { try {
getActivity().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); getActivity().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
@ -310,6 +335,17 @@ public class EditContactFragment extends Fragment {
} }
} }
private String getDisplayName() {
String displayName = null;
if (firstName.getText().length() > 0 && lastName.getText().length() > 0)
displayName = firstName.getText().toString() + " " + lastName.getText().toString();
else if (firstName.getText().length() > 0)
displayName = firstName.getText().toString();
else if (lastName.getText().length() > 0)
displayName = lastName.getText().toString();
return displayName;
}
private String findRawContactID(String contactID) { private String findRawContactID(String contactID) {
Cursor c = getActivity().getContentResolver().query(RawContacts.CONTENT_URI, Cursor c = getActivity().getContentResolver().query(RawContacts.CONTENT_URI,
new String[]{RawContacts._ID}, new String[]{RawContacts._ID},
@ -321,6 +357,28 @@ public class EditContactFragment extends Fragment {
return null; return null;
} }
private String findContactFirstName(String contactID) {
Cursor c = getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI,
new String[]{ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME},
RawContacts.CONTACT_ID + "=?",
new String[]{contactID}, null);
if (c != null && c.moveToFirst()) {
return c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME));
}
return null;
}
private String findContactLastName(String contactID) {
Cursor c = getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI,
new String[]{ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME},
RawContacts.CONTACT_ID + "=?",
new String[]{contactID}, null);
if (c != null && c.moveToFirst()) {
return c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));
}
return null;
}
class NewOrUpdatedNumberOrAddress { class NewOrUpdatedNumberOrAddress {
private String oldNumberOrAddress; private String oldNumberOrAddress;
private String newNumberOrAddress; private String newNumberOrAddress;

@ -1 +1 @@
Subproject commit b35e4774658ab2fe666c4b7ec2f93d8ebe59d91a Subproject commit 2123621e5648cf37dce82b5bf812c167cb2b16e7