diff --git a/src/android/org/linphone/chat/ChatCreationFragment.java b/src/android/org/linphone/chat/ChatCreationFragment.java index 37d099692..7764524eb 100644 --- a/src/android/org/linphone/chat/ChatCreationFragment.java +++ b/src/android/org/linphone/chat/ChatCreationFragment.java @@ -67,6 +67,8 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen private ProgressBar mContactsFetchInProgress; private SearchContactsListAdapter mSearchAdapter; private String mChatRoomSubject, mChatRoomAddress; + private ChatRoom mChatRoom; + private ChatRoomListenerStub mChatRoomCreationListener; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -161,9 +163,31 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen displayChatCreation(); + mChatRoomCreationListener = new ChatRoomListenerStub() { + @Override + public void onStateChanged(ChatRoom cr, ChatRoom.State newState) { + if (newState == ChatRoom.State.Created) { + mWaitLayout.setVisibility(View.GONE); + LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly()); + } else if (newState == ChatRoom.State.CreationFailed) { + mWaitLayout.setVisibility(View.GONE); + LinphoneActivity.instance().displayChatRoomError(); + Log.e("Group chat room for address " + cr.getPeerAddress() + " has failed !"); + } + } + }; + return view; } + @Override + public void onPause() { + if (mChatRoom != null) { + mChatRoom.removeListener(mChatRoomCreationListener); + } + super.onPause(); + } + private void displayChatCreation() { mNextButton.setVisibility(View.VISIBLE); mNextButton.setEnabled(mContactsSelected.size() > 0); @@ -301,24 +325,9 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen Address participant = mContactsSelected.get(0).getAddress(); ChatRoom chatRoom = lc.findOneToOneChatRoom(lc.getDefaultProxyConfig().getContact(), participant); if (chatRoom == null) { - chatRoom = lc.createClientGroupChatRoom(getString(R.string.dummy_group_chat_subject)); - chatRoom.setListener(new ChatRoomListenerStub() { - @Override - public void onStateChanged(ChatRoom cr, ChatRoom.State newState) { - if (newState == ChatRoom.State.Created) { - cr.setListener(null); - mWaitLayout.setVisibility(View.GONE); - LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly()); - } else if (newState == ChatRoom.State.CreationFailed) { - cr.setListener(null); - mWaitLayout.setVisibility(View.GONE); - LinphoneActivity.instance().displayChatRoomError(); - Log.e("Group chat room for address " + cr.getPeerAddress() + " has failed !"); - } - } - }); - - chatRoom.addParticipant(participant); + mChatRoom = lc.createClientGroupChatRoom(getString(R.string.dummy_group_chat_subject)); + mChatRoom.addListener(mChatRoomCreationListener); + mChatRoom.addParticipant(participant); } else { LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly()); } diff --git a/src/android/org/linphone/chat/GroupChatFragment.java b/src/android/org/linphone/chat/GroupChatFragment.java index a80e97fdf..e933230ec 100644 --- a/src/android/org/linphone/chat/GroupChatFragment.java +++ b/src/android/org/linphone/chat/GroupChatFragment.java @@ -233,7 +233,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con ContactsManager.removeContactsListener(this); removeVirtualKeyboardVisiblityListener(); LinphoneManager.getInstance().setCurrentChatRoomAddress(null); - if (mChatRoom != null) mChatRoom.setListener(null); + if (mChatRoom != null) mChatRoom.removeListener(this); mEventsAdapter.clear(); super.onPause(); } @@ -390,7 +390,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con if (mChatRoom == null) { mChatRoom = core.getChatRoomFromUri(mRemoteSipAddress.asStringUriOnly()); } - mChatRoom.setListener(this); + mChatRoom.addListener(this); mChatRoom.markAsRead(); LinphoneActivity.instance().updateMissedChatCount(); diff --git a/src/android/org/linphone/chat/GroupInfoFragment.java b/src/android/org/linphone/chat/GroupInfoFragment.java index 30d97f0f8..27b4ba292 100644 --- a/src/android/org/linphone/chat/GroupInfoFragment.java +++ b/src/android/org/linphone/chat/GroupInfoFragment.java @@ -66,8 +66,9 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener { private boolean mIsEditionEnabled; private ArrayList mParticipants; private String mSubject; - private ChatRoom mChatRoom; + private ChatRoom mChatRoom, mTempChatRoom; private Dialog mAdminStateChangedDialog; + private ChatRoomListenerStub mChatRoomCreationListener; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -195,27 +196,27 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener { }); mSubjectField.setText(mSubject); + mChatRoomCreationListener = new ChatRoomListenerStub() { + @Override + public void onStateChanged(ChatRoom cr, ChatRoom.State newState) { + if (newState == ChatRoom.State.Created) { + mWaitLayout.setVisibility(View.GONE); + LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly()); + } else if (newState == ChatRoom.State.CreationFailed) { + mWaitLayout.setVisibility(View.GONE); + LinphoneActivity.instance().displayChatRoomError(); + Log.e("Group chat room for address " + cr.getPeerAddress() + " has failed !"); + } + } + }; + mConfirmButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (!mIsAlreadyCreatedGroup) { mWaitLayout.setVisibility(View.VISIBLE); - ChatRoom chatRoom = LinphoneManager.getLc().createClientGroupChatRoom(mSubjectField.getText().toString()); - chatRoom.setListener(new ChatRoomListenerStub() { - @Override - public void onStateChanged(ChatRoom cr, ChatRoom.State newState) { - if (newState == ChatRoom.State.Created) { - cr.setListener(null); - mWaitLayout.setVisibility(View.GONE); - LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly()); - } else if (newState == ChatRoom.State.CreationFailed) { - cr.setListener(null); - mWaitLayout.setVisibility(View.GONE); - LinphoneActivity.instance().displayChatRoomError(); - Log.e("Group chat room for address " + cr.getPeerAddress() + " has failed !"); - } - } - }); + mTempChatRoom = LinphoneManager.getLc().createClientGroupChatRoom(mSubjectField.getText().toString()); + mTempChatRoom.addListener(mChatRoomCreationListener); Address addresses[] = new Address[mParticipants.size()]; int index = 0; @@ -223,7 +224,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener { addresses[index] = ca.getAddress(); index++; } - chatRoom.addParticipants(addresses); + mTempChatRoom.addParticipants(addresses); } else { // Subject String newSubject = mSubjectField.getText().toString(); @@ -292,16 +293,24 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener { mWaitLayout.setVisibility(View.GONE); if (mChatRoom != null) { - mChatRoom.setListener(this); + mChatRoom.addListener(this); } return view; } + @Override + public void onPause() { + if (mTempChatRoom != null) { + mTempChatRoom.removeListener(mChatRoomCreationListener); + } + super.onPause(); + } + @Override public void onDestroy() { if (mChatRoom != null) { - mChatRoom.setListener(null); + mChatRoom.removeListener(this); } super.onDestroy(); } diff --git a/src/android/org/linphone/contacts/ContactDetailsFragment.java b/src/android/org/linphone/contacts/ContactDetailsFragment.java index 5fd8f1040..b33d5e16c 100644 --- a/src/android/org/linphone/contacts/ContactDetailsFragment.java +++ b/src/android/org/linphone/contacts/ContactDetailsFragment.java @@ -54,6 +54,8 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener private LayoutInflater inflater; private View view; private boolean displayChatAddressOnly = false; + private ChatRoom mChatRoom; + private ChatRoomListenerStub mChatRoomCreationListener; private OnClickListener dialListener = new OnClickListener() { @Override @@ -77,21 +79,9 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly()); } else { mWaitLayout.setVisibility(View.VISIBLE); - room = LinphoneManager.getLc().createClientGroupChatRoom(getString(R.string.dummy_group_chat_subject)); - room.setListener(new ChatRoomListenerStub() { - @Override - public void onStateChanged(ChatRoom cr, ChatRoom.State newState) { - if (newState == ChatRoom.State.Created) { - mWaitLayout.setVisibility(View.GONE); - LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly()); - } else if (newState == ChatRoom.State.CreationFailed) { - mWaitLayout.setVisibility(View.GONE); - LinphoneActivity.instance().displayChatRoomError(); - Log.e("Group chat room for address " + cr.getPeerAddress() + " has failed !"); - } - } - }); - room.addParticipant(participant); + mChatRoom = lc.createClientGroupChatRoom(getString(R.string.dummy_group_chat_subject)); + mChatRoom.addListener(mChatRoomCreationListener); + mChatRoom.addParticipant(participant); } } } @@ -132,9 +122,31 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener back.setOnClickListener(this); } + mChatRoomCreationListener = new ChatRoomListenerStub() { + @Override + public void onStateChanged(ChatRoom cr, ChatRoom.State newState) { + if (newState == ChatRoom.State.Created) { + mWaitLayout.setVisibility(View.GONE); + LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly()); + } else if (newState == ChatRoom.State.CreationFailed) { + mWaitLayout.setVisibility(View.GONE); + LinphoneActivity.instance().displayChatRoomError(); + Log.e("Group chat room for address " + cr.getPeerAddress() + " has failed !"); + } + } + }; + return view; } + @Override + public void onPause() { + if (mChatRoom != null) { + mChatRoom.removeListener(mChatRoomCreationListener); + } + super.onPause(); + } + public void changeDisplayedContact(LinphoneContact newContact) { contact = newContact; displayContact(inflater, view); diff --git a/src/android/org/linphone/fragments/HistoryDetailFragment.java b/src/android/org/linphone/fragments/HistoryDetailFragment.java index 5d290f339..ed0033e46 100644 --- a/src/android/org/linphone/fragments/HistoryDetailFragment.java +++ b/src/android/org/linphone/fragments/HistoryDetailFragment.java @@ -51,6 +51,8 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener { private String sipUri, displayName, pictureUri; private RelativeLayout mWaitLayout; private LinphoneContact contact; + private ChatRoom mChatRoom; + private ChatRoomListenerStub mChatRoomCreationListener; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -100,9 +102,31 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener { displayHistory(status, callTime, callDate); + mChatRoomCreationListener = new ChatRoomListenerStub() { + @Override + public void onStateChanged(ChatRoom cr, ChatRoom.State newState) { + if (newState == ChatRoom.State.Created) { + mWaitLayout.setVisibility(View.GONE); + LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly()); + } else if (newState == ChatRoom.State.CreationFailed) { + mWaitLayout.setVisibility(View.GONE); + LinphoneActivity.instance().displayChatRoomError(); + Log.e("Group chat room for address " + cr.getPeerAddress() + " has failed !"); + } + } + }; + return view; } + @Override + public void onPause() { + if (mChatRoom != null) { + mChatRoom.removeListener(mChatRoomCreationListener); + } + super.onPause(); + } + private void displayHistory(String status, String callTime, String callDate) { if (status.equals(getResources().getString(R.string.missed))) { callDirection.setImageResource(R.drawable.call_missed); @@ -176,21 +200,9 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener { LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly()); } else { mWaitLayout.setVisibility(View.VISIBLE); - room = lc.createClientGroupChatRoom(getString(R.string.dummy_group_chat_subject)); - room.setListener(new ChatRoomListenerStub() { - @Override - public void onStateChanged(ChatRoom cr, ChatRoom.State newState) { - if (newState == ChatRoom.State.Created) { - mWaitLayout.setVisibility(View.GONE); - LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly()); - } else if (newState == ChatRoom.State.CreationFailed) { - mWaitLayout.setVisibility(View.GONE); - LinphoneActivity.instance().displayChatRoomError(); - Log.e("Group chat room for address " + cr.getPeerAddress() + " has failed !"); - } - } - }); - room.addParticipant(participant); + mChatRoom = lc.createClientGroupChatRoom(getString(R.string.dummy_group_chat_subject)); + mChatRoom.addListener(mChatRoomCreationListener); + mChatRoom.addParticipant(participant); } } else if (id == R.id.add_contact) { Address addr = Factory.instance().createAddress(sipUri); diff --git a/submodules/linphone b/submodules/linphone index 2e8f7dade..4ba2aa8af 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 2e8f7dade9dc7ec316a656094fa8e115d99b197b +Subproject commit 4ba2aa8af07c3a3ed3c20ff32fcd264561198c3a