From b2b3365202b8206c21acdf00ad4a7df2c2a2a3f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Turnel?= Date: Thu, 24 May 2018 14:39:40 +0200 Subject: [PATCH] Fix file sharing from SEND intent --- .../linphone/activities/LinphoneActivity.java | 44 ++++++++++++++----- .../linphone/chat/ChatCreationFragment.java | 30 ++++++++++--- .../org/linphone/chat/ChatListFragment.java | 4 +- .../org/linphone/chat/ChatRoomsAdapter.java | 2 +- .../org/linphone/chat/GroupChatFragment.java | 21 ++++++++- .../org/linphone/chat/GroupInfoFragment.java | 27 +++++++++--- .../org/linphone/chat/ImdnFragment.java | 2 +- .../contacts/ContactDetailsFragment.java | 6 +-- .../fragments/HistoryDetailFragment.java | 6 +-- 9 files changed, 106 insertions(+), 36 deletions(-) diff --git a/src/android/org/linphone/activities/LinphoneActivity.java b/src/android/org/linphone/activities/LinphoneActivity.java index b51a9faa7..f56c41991 100644 --- a/src/android/org/linphone/activities/LinphoneActivity.java +++ b/src/android/org/linphone/activities/LinphoneActivity.java @@ -685,6 +685,7 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick private void displayChat(String sipUri, String message, String fileUri, String pictureUri, String thumbnailUri, String displayName, Address lAddress) { Bundle extras = new Bundle(); extras.putString("SipUri", sipUri); + if (message != null) extras.putString("messageDraft", message); if (fileUri != null) @@ -694,14 +695,11 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick extras.putString("PictureUri", pictureUri); extras.putString("ThumbnailUri", thumbnailUri); } - if (sipUri == null && message == null && fileUri == null) { - changeCurrentFragment(FragmentsAvailable.CREATE_CHAT, extras); - } else { - changeCurrentFragment(FragmentsAvailable.GROUP_CHAT, extras); - } + + changeCurrentFragment(FragmentsAvailable.CREATE_CHAT, extras); } - public void goToChatCreator(String address, ArrayList selectedContacts, String subject, boolean isGoBack) { + public void goToChatCreator(String address, ArrayList selectedContacts, String subject, boolean isGoBack, Bundle shareInfos) { if (currentFragment == FragmentsAvailable.INFO_GROUP_CHAT && isGoBack) { getFragmentManager().popBackStackImmediate(); getFragmentManager().popBackStackImmediate(); @@ -710,23 +708,37 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick extras.putSerializable("selectedContacts", selectedContacts); extras.putString("subject", subject); extras.putString("groupChatRoomAddress", address); + + if (shareInfos != null) { + if (shareInfos.getString("fileSharedUri") != null) + extras.putString("fileSharedUri", shareInfos.getString("fileSharedUri")); + if (shareInfos.getString("messageDraft") != null) + extras.putString("messageDraft", shareInfos.getString("messageDraft")); + } + changeCurrentFragment(FragmentsAvailable.CREATE_CHAT, extras); } - public void goToChat(String sipUri) { + public void goToChat(String sipUri, Bundle shareInfos) { + Bundle extras = new Bundle(); + extras.putString("SipUri", sipUri); + + if (shareInfos != null) { + if (shareInfos.getString("fileSharedUri") != null) + extras.putString("fileSharedUri", shareInfos.getString("fileSharedUri")); + if (shareInfos.getString("messageDraft") != null) + extras.putString("messageDraft", shareInfos.getString("messageDraft")); + } + if (isTablet()) { Fragment fragment2 = getFragmentManager().findFragmentById(R.id.fragmentContainer2); if (fragment2 != null && fragment2.isVisible() && currentFragment == FragmentsAvailable.GROUP_CHAT && !emptyFragment) { GroupChatFragment chatFragment = (GroupChatFragment) fragment2; chatFragment.changeDisplayedChat(sipUri); } else { - Bundle extras = new Bundle(); - extras.putString("SipUri", sipUri); changeCurrentFragment(FragmentsAvailable.GROUP_CHAT, extras); } } else { - Bundle extras = new Bundle(); - extras.putString("SipUri", sipUri); changeCurrentFragment(FragmentsAvailable.GROUP_CHAT, extras); } @@ -734,7 +746,7 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick displayMissedChats(LinphoneManager.getInstance().getUnreadMessageCount()); } - public void goToChatGroupInfos(String address, ArrayList contacts, String subject, boolean isEditionEnabled, boolean isGoBack) { + public void goToChatGroupInfos(String address, ArrayList contacts, String subject, boolean isEditionEnabled, boolean isGoBack, Bundle shareInfos) { if (currentFragment == FragmentsAvailable.CREATE_CHAT && isGoBack) { getFragmentManager().popBackStackImmediate(); getFragmentManager().popBackStackImmediate(); @@ -744,6 +756,14 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick extras.putBoolean("isEditionEnabled", isEditionEnabled); extras.putSerializable("ContactAddress", contacts); extras.putString("subject", subject); + + if (shareInfos != null) { + if (shareInfos.getString("fileSharedUri") != null) + extras.putString("fileSharedUri", shareInfos.getString("fileSharedUri")); + if (shareInfos.getString("messageDraft") != null) + extras.putString("messageDraft", shareInfos.getString("messageDraft")); + } + changeCurrentFragment(FragmentsAvailable.INFO_GROUP_CHAT, extras); } diff --git a/src/android/org/linphone/chat/ChatCreationFragment.java b/src/android/org/linphone/chat/ChatCreationFragment.java index fef50b4fe..a3f1c4bad 100644 --- a/src/android/org/linphone/chat/ChatCreationFragment.java +++ b/src/android/org/linphone/chat/ChatCreationFragment.java @@ -76,6 +76,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen private String mChatRoomSubject, mChatRoomAddress; private ChatRoom mChatRoom; private ChatRoomListenerStub mChatRoomCreationListener; + private Bundle mShareInfos; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -177,7 +178,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen public void onStateChanged(ChatRoom cr, ChatRoom.State newState) { if (newState == ChatRoom.State.Created) { mWaitLayout.setVisibility(View.GONE); - LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly()); + LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly(), mShareInfos); } else if (newState == ChatRoom.State.CreationFailed) { mWaitLayout.setVisibility(View.GONE); LinphoneActivity.instance().displayChatRoomError(); @@ -186,6 +187,23 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen } }; + if (getArguments() != null) { + String fileSharedUri = getArguments().getString("fileSharedUri"); + String messageDraft = getArguments().getString("messageDraft"); + + if (fileSharedUri != null || messageDraft != null) + mShareInfos = new Bundle(); + + if (fileSharedUri != null) { + LinphoneActivity.instance().checkAndRequestPermissionsToSendImage(); + mShareInfos.putString("fileSharedUri", fileSharedUri); + } + + if (messageDraft != null) + mShareInfos.putString("messageDraft", messageDraft); + } + + return view; } @@ -367,17 +385,17 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen mChatRoom.addParticipant(participant); } else { chatRoom = lc.getChatRoom(participant); - LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly()); + LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly(), mShareInfos); } } else { - LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly()); + LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly(), mShareInfos); } } else { mContactsSelectedLayout.removeAllViews(); - LinphoneActivity.instance().goToChatGroupInfos(null, mContactsSelected, null, true, false); + LinphoneActivity.instance().goToChatGroupInfos(null, mContactsSelected, null, true, false, mShareInfos); } } else { - LinphoneActivity.instance().goToChatGroupInfos(mChatRoomAddress, mContactsSelected, mChatRoomSubject, true, true); + LinphoneActivity.instance().goToChatGroupInfos(mChatRoomAddress, mContactsSelected, mChatRoomSubject, true, true, mShareInfos); } } else if (id == R.id.clearSearchField) { mSearchField.setText(""); @@ -395,7 +413,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen ProxyConfig lpc = lc.getDefaultProxyConfig(); if (lpc == null || lpc.getConferenceFactoryUri() == null) { ChatRoom chatRoom = lc.getChatRoom(ca.getAddress()); - LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly()); + LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly(), mShareInfos); } else { removeContactFromSelection(ca); } diff --git a/src/android/org/linphone/chat/ChatListFragment.java b/src/android/org/linphone/chat/ChatListFragment.java index f7fb2ec16..b98669a42 100644 --- a/src/android/org/linphone/chat/ChatListFragment.java +++ b/src/android/org/linphone/chat/ChatListFragment.java @@ -85,7 +85,7 @@ public class ChatListFragment extends Fragment implements ContactsUpdatedListene mNewDiscussionButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - LinphoneActivity.instance().goToChatCreator(null, null, null, false); + LinphoneActivity.instance().goToChatCreator(null, null, null, false, null); } }); @@ -142,7 +142,7 @@ public class ChatListFragment extends Fragment implements ContactsUpdatedListene ChatRoomsAdapter adapter = (ChatRoomsAdapter)mChatRoomsList.getAdapter(); if (adapter != null && adapter.getCount() > 0) { ChatRoom room = (ChatRoom) adapter.getItem(0); - LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly()); + LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly(), null); } else { LinphoneActivity.instance().displayEmptyFragment(); } diff --git a/src/android/org/linphone/chat/ChatRoomsAdapter.java b/src/android/org/linphone/chat/ChatRoomsAdapter.java index fe510fe95..c916ffdff 100644 --- a/src/android/org/linphone/chat/ChatRoomsAdapter.java +++ b/src/android/org/linphone/chat/ChatRoomsAdapter.java @@ -244,7 +244,7 @@ public class ChatRoomsAdapter extends ListSelectionAdapter { @Override public void onClick(View v) { ChatRoom chatRoom = mRooms.get(position); - LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asString()); + LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asString(), null); } }); holder.delete.setVisibility(isEditionEnabled() ? View.VISIBLE : View.GONE); diff --git a/src/android/org/linphone/chat/GroupChatFragment.java b/src/android/org/linphone/chat/GroupChatFragment.java index efd54fa38..b8792d393 100644 --- a/src/android/org/linphone/chat/GroupChatFragment.java +++ b/src/android/org/linphone/chat/GroupChatFragment.java @@ -162,7 +162,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con ContactAddress ca = new ContactAddress(c, a.asString(), "", c.isFriend(), p.isAdmin()); participants.add(ca); } - LinphoneActivity.instance().goToChatGroupInfos(mRemoteSipAddress.asString(), participants, mChatRoom.getSubject(), mChatRoom.getMe() != null ? mChatRoom.getMe().isAdmin() : false, false); + LinphoneActivity.instance().goToChatGroupInfos(mRemoteSipAddress.asString(), participants, mChatRoom.getSubject(), mChatRoom.getMe() != null ? mChatRoom.getMe().isAdmin() : false, false, null); } }); @@ -215,6 +215,25 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con mChatEventsList = view.findViewById(R.id.chat_message_list); registerForContextMenu(mChatEventsList); + if (getArguments() != null) { + String fileSharedUri = getArguments().getString("fileSharedUri"); + if (fileSharedUri != null) { + if (LinphoneUtils.isExtensionImage(fileSharedUri)) { + addImageToPendingList(fileSharedUri); + } else { + if (fileSharedUri.startsWith("content://") || fileSharedUri.startsWith("file://")) { + fileSharedUri = LinphoneUtils.getFilePath(this.getActivity().getApplicationContext(), Uri.parse(fileSharedUri)); + } else if (fileSharedUri.contains("com.android.contacts/contacts/")) { + fileSharedUri = LinphoneUtils.getCVSPathFromLookupUri(fileSharedUri).toString(); + } + addFileToPendingList(fileSharedUri); + } + } + + if (getArguments().getString("messageDraft") != null) + mMessageTextToSend.setText(getArguments().getString("messageDraft")); + } + return view; } diff --git a/src/android/org/linphone/chat/GroupInfoFragment.java b/src/android/org/linphone/chat/GroupInfoFragment.java index 6828c823e..d7906c08c 100644 --- a/src/android/org/linphone/chat/GroupInfoFragment.java +++ b/src/android/org/linphone/chat/GroupInfoFragment.java @@ -72,6 +72,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener { private ChatRoom mChatRoom, mTempChatRoom; private Dialog mAdminStateChangedDialog; private ChatRoomListenerStub mChatRoomCreationListener; + private Bundle mShareInfos; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -118,18 +119,30 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener { mParticipantsList.setAdapter(mAdapter); mAdapter.setChatRoom(mChatRoom); + String fileSharedUri = getArguments().getString("fileSharedUri"); + String messageDraft = getArguments().getString("messageDraft"); + + if (fileSharedUri != null || messageDraft != null) + mShareInfos = new Bundle(); + + if (fileSharedUri != null) + mShareInfos.putString("fileSharedUri", fileSharedUri); + + if (messageDraft != null) + mShareInfos.putString("messageDraft", messageDraft); + mBackButton = view.findViewById(R.id.back); mBackButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mIsAlreadyCreatedGroup) { if (LinphoneActivity.instance().isTablet()) { - LinphoneActivity.instance().goToChat(mGroupChatRoomAddress.asStringUriOnly()); + LinphoneActivity.instance().goToChat(mGroupChatRoomAddress.asStringUriOnly(), mShareInfos); } else { getFragmentManager().popBackStack(); } } else { - LinphoneActivity.instance().goToChatCreator(null, mParticipants, null, true); + LinphoneActivity.instance().goToChatCreator(null, mParticipants, null, true, mShareInfos); } } }); @@ -150,7 +163,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener { public void onClick(View view) { if (mChatRoom != null) { mChatRoom.leave(); - LinphoneActivity.instance().goToChat(mGroupChatRoomAddress.asString()); + LinphoneActivity.instance().goToChat(mGroupChatRoomAddress.asString(), null); } else { Log.e("Can't leave, chatRoom for address " + mGroupChatRoomAddress.asString() + " is null..."); } @@ -174,7 +187,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener { @Override public void onClick(View view) { if (mIsEditionEnabled) { - LinphoneActivity.instance().goToChatCreator(mGroupChatRoomAddress != null ? mGroupChatRoomAddress.asString() : null, mParticipants, mSubject, !mIsAlreadyCreatedGroup); + LinphoneActivity.instance().goToChatCreator(mGroupChatRoomAddress != null ? mGroupChatRoomAddress.asString() : null, mParticipants, mSubject, !mIsAlreadyCreatedGroup, null); } } }); @@ -182,7 +195,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener { mAddParticipantsButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - LinphoneActivity.instance().goToChatCreator(mGroupChatRoomAddress != null ? mGroupChatRoomAddress.asString() : null, mParticipants, mSubject, !mIsAlreadyCreatedGroup); + LinphoneActivity.instance().goToChatCreator(mGroupChatRoomAddress != null ? mGroupChatRoomAddress.asString() : null, mParticipants, mSubject, !mIsAlreadyCreatedGroup, null); } }); @@ -213,7 +226,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener { // This will remove both the creation fragment and the group info fragment from the back stack getFragmentManager().popBackStack(); getFragmentManager().popBackStack(); - LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly()); + LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly(), mShareInfos); } else if (newState == ChatRoom.State.CreationFailed) { mWaitLayout.setVisibility(View.GONE); LinphoneActivity.instance().displayChatRoomError(); @@ -289,7 +302,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener { toAdd.toArray(participantsToAdd); mChatRoom.addParticipants(participantsToAdd); - LinphoneActivity.instance().goToChat(mGroupChatRoomAddress.asString()); + LinphoneActivity.instance().goToChat(mGroupChatRoomAddress.asString(), null); } } }); diff --git a/src/android/org/linphone/chat/ImdnFragment.java b/src/android/org/linphone/chat/ImdnFragment.java index 88bcafad7..d3ecd797a 100644 --- a/src/android/org/linphone/chat/ImdnFragment.java +++ b/src/android/org/linphone/chat/ImdnFragment.java @@ -88,7 +88,7 @@ public class ImdnFragment extends Fragment { @Override public void onClick(View view) { if (LinphoneActivity.instance().isTablet()) { - LinphoneActivity.instance().goToChat(mRoomUri); + LinphoneActivity.instance().goToChat(mRoomUri, null); } else { LinphoneActivity.instance().onBackPressed(); } diff --git a/src/android/org/linphone/contacts/ContactDetailsFragment.java b/src/android/org/linphone/contacts/ContactDetailsFragment.java index a4c92ac7a..d830dd381 100644 --- a/src/android/org/linphone/contacts/ContactDetailsFragment.java +++ b/src/android/org/linphone/contacts/ContactDetailsFragment.java @@ -77,7 +77,7 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener Address participant = Factory.instance().createAddress(tag); ChatRoom room = lc.findOneToOneChatRoom(lc.getDefaultProxyConfig().getContact(), participant); if (room != null) { - LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly()); + LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly(), null); } else { ProxyConfig lpc = lc.getDefaultProxyConfig(); if (lpc != null && lpc.getConferenceFactoryUri() != null && !LinphonePreferences.instance().useBasicChatRoomFor1To1()) { @@ -87,7 +87,7 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener mChatRoom.addParticipant(participant); } else { room = lc.getChatRoom(participant); - LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly()); + LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly(), null); } } } @@ -134,7 +134,7 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener public void onStateChanged(ChatRoom cr, ChatRoom.State newState) { if (newState == ChatRoom.State.Created) { mWaitLayout.setVisibility(View.GONE); - LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly()); + LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly(), null); } else if (newState == ChatRoom.State.CreationFailed) { mWaitLayout.setVisibility(View.GONE); LinphoneActivity.instance().displayChatRoomError(); diff --git a/src/android/org/linphone/fragments/HistoryDetailFragment.java b/src/android/org/linphone/fragments/HistoryDetailFragment.java index e6754af9f..a1a62063a 100644 --- a/src/android/org/linphone/fragments/HistoryDetailFragment.java +++ b/src/android/org/linphone/fragments/HistoryDetailFragment.java @@ -109,7 +109,7 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener { public void onStateChanged(ChatRoom cr, ChatRoom.State newState) { if (newState == ChatRoom.State.Created) { mWaitLayout.setVisibility(View.GONE); - LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly()); + LinphoneActivity.instance().goToChat(cr.getPeerAddress().asStringUriOnly(), null); } else if (newState == ChatRoom.State.CreationFailed) { mWaitLayout.setVisibility(View.GONE); LinphoneActivity.instance().displayChatRoomError(); @@ -199,7 +199,7 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener { Address participant = Factory.instance().createAddress(sipUri); ChatRoom room = lc.findOneToOneChatRoom(lc.getDefaultProxyConfig().getContact(), participant); if (room != null) { - LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly()); + LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly(), null); } else { ProxyConfig lpc = lc.getDefaultProxyConfig(); if (lpc != null && lpc.getConferenceFactoryUri() != null && !LinphonePreferences.instance().useBasicChatRoomFor1To1()) { @@ -209,7 +209,7 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener { mChatRoom.addParticipant(participant); } else { room = lc.getChatRoom(participant); - LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly()); + LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly(), null); } } } else if (id == R.id.add_contact) {