diff --git a/res/layout-hdpi/main.xml b/res/layout-hdpi/main.xml new file mode 100644 index 000000000..eacf13737 --- /dev/null +++ b/res/layout-hdpi/main.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/org/linphone/ContactFragment.java b/src/org/linphone/ContactFragment.java index 45b48ec2c..cd7cfb7a0 100644 --- a/src/org/linphone/ContactFragment.java +++ b/src/org/linphone/ContactFragment.java @@ -120,6 +120,10 @@ public class ContactFragment extends Fragment implements OnClickListener { LinphoneActivity.instance().selectMenu(FragmentsAvailable.CONTACT); } contact.refresh(getActivity().getContentResolver()); + if (contact.getName() == null || contact.getName().equals("")) { + //Contact has been deleted, return + LinphoneActivity.instance().displayContacts(); + } displayContact(inflater, view); } diff --git a/src/org/linphone/ContactsFragment.java b/src/org/linphone/ContactsFragment.java index 73b3c8db9..ad5db9e4f 100644 --- a/src/org/linphone/ContactsFragment.java +++ b/src/org/linphone/ContactsFragment.java @@ -51,6 +51,8 @@ public class ContactsFragment extends Fragment implements OnClickListener, OnIte private boolean onlyDisplayLinphoneContacts; private int lastKnownPosition; private AlphabetIndexer indexer; + private boolean editOnClick = false, editConsumed = false; + private String sipAddressToAdd; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -58,6 +60,11 @@ public class ContactsFragment extends Fragment implements OnClickListener, OnIte mInflater = inflater; View view = inflater.inflate(R.layout.contacts_list, container, false); + if (getArguments() != null) { + editOnClick = getArguments().getBoolean("EditOnClick"); + sipAddressToAdd = getArguments().getString("SipAddress"); + } + contactsList = (ListView) view.findViewById(R.id.contactsList); contactsList.setOnItemClickListener(this); @@ -91,7 +98,8 @@ public class ContactsFragment extends Fragment implements OnClickListener, OnIte } else if (id == R.id.newContact) { - Intent intent = Compatibility.prepareAddContactIntent(null, null); + editConsumed = true; + Intent intent = Compatibility.prepareAddContactIntent(null, sipAddressToAdd); startActivity(intent); } } @@ -124,22 +132,32 @@ public class ContactsFragment extends Fragment implements OnClickListener, OnIte @Override public void onItemClick(AdapterView adapter, View view, int position, long id) { - lastKnownPosition = contactsList.getFirstVisiblePosition(); - LinphoneActivity.instance().displayContact((Contact) adapter.getItemAtPosition(position)); + Contact contact = (Contact) adapter.getItemAtPosition(position); + if (editOnClick) { + editConsumed = true; + Intent intent = Compatibility.prepareEditContactIntentWithSipAddress(Integer.parseInt(contact.getID()), sipAddressToAdd); + startActivity(intent); + } else { + lastKnownPosition = contactsList.getFirstVisiblePosition(); + LinphoneActivity.instance().displayContact(contact); + } } @Override public void onResume() { super.onResume(); + + if (editConsumed) { + editOnClick = false; + sipAddressToAdd = null; + } + if (LinphoneActivity.isInstanciated()) { LinphoneActivity.instance().selectMenu(FragmentsAvailable.CONTACTS); onlyDisplayLinphoneContacts = LinphoneActivity.instance().isLinphoneContactsPrefered(); } - if (contactsList.getAdapter() == null) { - changeContactsAdapter(); - } - + changeContactsAdapter(); contactsList.setSelectionFromTop(lastKnownPosition, 0); } diff --git a/src/org/linphone/DialerFragment.java b/src/org/linphone/DialerFragment.java index 6f664413b..80a8c8650 100644 --- a/src/org/linphone/DialerFragment.java +++ b/src/org/linphone/DialerFragment.java @@ -17,7 +17,6 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -import org.linphone.compatibility.Compatibility; import org.linphone.core.LinphoneCore; import org.linphone.ui.AddressAware; import org.linphone.ui.AddressText; @@ -25,7 +24,6 @@ import org.linphone.ui.CallButton; import org.linphone.ui.EraseButton; import android.app.Activity; -import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.Fragment; @@ -81,8 +79,7 @@ public class DialerFragment extends Fragment { addContactListener = new OnClickListener() { @Override public void onClick(View v) { - Intent intent = Compatibility.prepareAddContactIntent(mAddress.getDisplayedName(), mAddress.getText().toString()); - startActivity(intent); + LinphoneActivity.instance().displayContactsForEdition(mAddress.getText().toString()); } }; cancelListener = new OnClickListener() { @@ -167,9 +164,8 @@ public class DialerFragment extends Fragment { mAddContact.setEnabled(true); mAddContact.setImageResource(R.drawable.add_contact); mAddContact.setOnClickListener(addContactListener); + enableDisableAddContact(); } - - enableDisableAddContact(); } public void enableDisableAddContact() { diff --git a/src/org/linphone/HistoryDetailFragment.java b/src/org/linphone/HistoryDetailFragment.java index e6b74a7a9..11fb87911 100644 --- a/src/org/linphone/HistoryDetailFragment.java +++ b/src/org/linphone/HistoryDetailFragment.java @@ -17,10 +17,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -import org.linphone.compatibility.Compatibility; import org.linphone.ui.AvatarWithShadow; -import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.Fragment; @@ -84,6 +82,7 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener { private void displayHistory(String status, String callTime, String callDate) { if (pictureUri != null) { LinphoneUtils.setImagePictureFromUri(view.getContext(), contactPicture.getView(), Uri.parse(pictureUri), R.drawable.unknown_small); + view.findViewById(R.id.addContactRow).setVisibility(View.GONE); } contactName.setText(displayName == null ? sipUri : displayName); @@ -121,8 +120,7 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener { } else if (id == R.id.chat) { LinphoneActivity.instance().displayChat(sipUri); } else if (id == R.id.addToContacts) { - Intent intent = Compatibility.prepareAddContactIntent(displayName, sipUri); - startActivity(intent); + LinphoneActivity.instance().displayContactsForEdition(sipUri); } } } diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java index 0ab814e38..afda1cf01 100644 --- a/src/org/linphone/LinphoneActivity.java +++ b/src/org/linphone/LinphoneActivity.java @@ -358,6 +358,13 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene changeCurrentFragment(FragmentsAvailable.CONTACTS, null); } + public void displayContactsForEdition(String sipAddress) { + Bundle extras = new Bundle(); + extras.putBoolean("EditOnClick", true); + extras.putString("SipAddress", sipAddress); + changeCurrentFragment(FragmentsAvailable.CONTACTS, extras); + } + public void displayChat(String sipUri) { LinphoneAddress lAddress = LinphoneCoreFactory.instance().createLinphoneAddress(sipUri); Uri uri = LinphoneUtils.findUriPictureOfContactAndSetDisplayName(lAddress, getContentResolver()); diff --git a/src/org/linphone/compatibility/ApiFivePlus.java b/src/org/linphone/compatibility/ApiFivePlus.java index 6a5b2f7dc..310b04bd3 100644 --- a/src/org/linphone/compatibility/ApiFivePlus.java +++ b/src/org/linphone/compatibility/ApiFivePlus.java @@ -90,6 +90,28 @@ public class ApiFivePlus { return intent; } + public static Intent prepareEditContactIntentWithSipAddress(int id, String sipUri) { + Intent intent = new Intent(Intent.ACTION_EDIT, Contacts.CONTENT_URI); + Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, id); + intent.setData(contactUri); + + if (Version.sdkAboveOrEqual(Version.API09_GINGERBREAD_23)) { + ArrayList data = new ArrayList(); + ContentValues sipAddressRow = new ContentValues(); + sipAddressRow.put(Contacts.Data.MIMETYPE, SipAddress.CONTENT_ITEM_TYPE); + sipAddressRow.put(SipAddress.SIP_ADDRESS, sipUri); + data.add(sipAddressRow); + data.add(sipAddressRow); + intent.putParcelableArrayListExtra(Insert.DATA, data); + } else { + // VoIP field not available, we store the address in the IM field + intent.putExtra(ContactsContract.Intents.Insert.IM_HANDLE, sipUri); + intent.putExtra(ContactsContract.Intents.Insert.IM_PROTOCOL, "sip"); + } + + return intent; + } + public static List extractContactNumbersAndAddresses(String id, ContentResolver cr) { List list = new ArrayList(); diff --git a/src/org/linphone/compatibility/Compatibility.java b/src/org/linphone/compatibility/Compatibility.java index d09de073a..a1f760144 100644 --- a/src/org/linphone/compatibility/Compatibility.java +++ b/src/org/linphone/compatibility/Compatibility.java @@ -60,6 +60,13 @@ public class Compatibility { return null; } + public static Intent prepareEditContactIntentWithSipAddress(int id, String sipAddress) { + if (Version.sdkAboveOrEqual(5)) { + return ApiFivePlus.prepareEditContactIntentWithSipAddress(id, sipAddress); + } + return null; + } + public static List extractContactNumbersAndAddresses(String id, ContentResolver cr) { if (Version.sdkAboveOrEqual(5)) { return ApiFivePlus.extractContactNumbersAndAddresses(id, cr);