diff --git a/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java index 034e88443557ce35f4ca9123d9a1efdaf4f5e6e1..a832ac44142daa9badcdbf6b91f8337ce47dc09c 100644 --- a/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java +++ b/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java @@ -126,8 +126,6 @@ public class ConversationFragment extends BaseSupportFragment<ConversationPresen public static final int REQ_ADD_CONTACT = 42; - public static final String KEY_CONTACT_RING_ID = BuildConfig.APPLICATION_ID + ".CONTACT_RING_ID"; - public static final String KEY_ACCOUNT_ID = BuildConfig.APPLICATION_ID + ".ACCOUNT_ID"; public static final String KEY_PREFERENCE_PENDING_MESSAGE = "pendingMessage"; public static final String KEY_PREFERENCE_CONVERSATION_COLOR = "color"; public static final String KEY_PREFERENCE_CONVERSATION_LAST_READ = "lastRead"; diff --git a/ring-android/app/src/main/java/cx/ring/fragments/ShareWithFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/ShareWithFragment.java index 75738a0cf38486bb45f3523dd6160c533b150a9e..7e8941ff8ff9a2f5cecbfbd398295c5566206ccb 100644 --- a/ring-android/app/src/main/java/cx/ring/fragments/ShareWithFragment.java +++ b/ring-android/app/src/main/java/cx/ring/fragments/ShareWithFragment.java @@ -145,8 +145,7 @@ public class ShareWithFragment extends Fragment { if (type != null && type.startsWith("text/")) { intent.putExtra(Intent.EXTRA_TEXT, previewText.getText().toString()); } - intent.putExtra(ConversationFragment.KEY_ACCOUNT_ID, smartListViewModel.getAccountId()); - intent.putExtra(ConversationFragment.KEY_CONTACT_RING_ID, smartListViewModel.getUri().getUri()); + intent.putExtras(ConversationPath.toBundle(smartListViewModel.getAccountId(), smartListViewModel.getUri())); intent.setClass(requireActivity(), ConversationActivity.class); startActivity(intent); } diff --git a/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java index bf708184b9e3d450e1b29814d0e21614178f70fc..8984f90944ed74cb240af7ce8606e4b6b2d7494d 100644 --- a/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java +++ b/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java @@ -426,7 +426,7 @@ public class SmartListFragment extends BaseSupportFragment<SmartListPresenter> i public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == HomeActivity.REQUEST_CODE_QR_CONVERSATION && data != null && resultCode == Activity.RESULT_OK) { - String contactId = data.getStringExtra(ConversationFragment.KEY_CONTACT_RING_ID); + String contactId = data.getStringExtra(ConversationPath.KEY_CONVERSATION_URI); if (contactId != null) { presenter.startConversation(net.jami.model.Uri.fromString(contactId)); } diff --git a/ring-android/app/src/main/java/cx/ring/tv/call/TVCallActivity.java b/ring-android/app/src/main/java/cx/ring/tv/call/TVCallActivity.java index a167743112064c11cced7716e6ed41fcfad259c0..eda7b028cb715fb235d15327746336b90b6e4d8e 100644 --- a/ring-android/app/src/main/java/cx/ring/tv/call/TVCallActivity.java +++ b/ring-android/app/src/main/java/cx/ring/tv/call/TVCallActivity.java @@ -22,7 +22,6 @@ import android.content.Intent; import android.media.AudioManager; import android.os.Build; import android.os.Bundle; -import android.text.TextUtils; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.WindowManager; @@ -34,8 +33,11 @@ import androidx.fragment.app.FragmentTransaction; import cx.ring.R; import cx.ring.application.JamiApplication; + import net.jami.call.CallView; -import cx.ring.fragments.ConversationFragment; + +import cx.ring.utils.ConversationPath; + import net.jami.services.NotificationService; import net.jami.utils.Log; @@ -59,7 +61,7 @@ public class TVCallActivity extends FragmentActivity { setTurnScreenOn(true); setShowWhenLocked(true); } else { - getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED| + getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); } setContentView(R.layout.tv_activity_call); @@ -69,19 +71,18 @@ public class TVCallActivity extends FragmentActivity { JamiApplication.getInstance().getInjectionComponent().inject(this); JamiApplication.getInstance().startDaemon(); - boolean audioOnly = false; - String accountId = getIntent().getStringExtra(ConversationFragment.KEY_ACCOUNT_ID); - String ringId = getIntent().getStringExtra(ConversationFragment.KEY_CONTACT_RING_ID); + ConversationPath path = ConversationPath.fromIntent(intent); FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); - if (!TextUtils.isEmpty(ringId)) { - Log.d(TAG, "onCreate: outgoing call"); - callFragment = TVCallFragment.newInstance(TVCallFragment.ACTION_PLACE_CALL, - accountId, - ringId, - audioOnly); + if (path != null) { + Log.d(TAG, "onCreate: outgoing call " + path); + callFragment = TVCallFragment.newInstance(intent.getAction(), + path.getAccountId(), + path.getConversationId(), + intent.getExtras().getString(Intent.EXTRA_PHONE_NUMBER, path.getConversationId()), + false); fragmentTransaction.replace(R.id.main_call_layout, callFragment, CALL_FRAGMENT_TAG).commit(); } else { Log.d(TAG, "onCreate: incoming call"); @@ -89,14 +90,13 @@ public class TVCallActivity extends FragmentActivity { String confId = getIntent().getStringExtra(NotificationService.KEY_CALL_ID); Log.d(TAG, "onCreate: conf " + confId); - callFragment = TVCallFragment.newInstance(TVCallFragment.ACTION_GET_CALL, confId); + callFragment = TVCallFragment.newInstance(Intent.ACTION_VIEW, confId); fragmentTransaction.replace(R.id.main_call_layout, callFragment, CALL_FRAGMENT_TAG).commit(); } } - @Override - public void onUserLeaveHint () { + public void onUserLeaveHint() { Fragment fragment = getSupportFragmentManager().findFragmentByTag(CALL_FRAGMENT_TAG); if (fragment instanceof CallView) { CallView callFragment = (CallView) fragment; diff --git a/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java b/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java index a38fd4d13fc5da3ca9c4a70828c485492b77a7d6..0d140715d382ab533a000aee041a5a8bedc78410 100644 --- a/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java +++ b/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java @@ -100,13 +100,8 @@ public class TVCallFragment extends BaseSupportFragment<CallPresenter> implement public static final String TAG = TVCallFragment.class.getSimpleName(); - public static final String ACTION_PLACE_CALL = "PLACE_CALL"; - public static final String ACTION_GET_CALL = "GET_CALL"; - public static final String KEY_ACTION = "action"; - public static final String KEY_ACCOUNT_ID = "accountId"; public static final String KEY_CONF_ID = "confId"; - public static final String KEY_CONTACT_RING_ID = "CONTACT_RING_ID"; public static final String KEY_AUDIO_ONLY = "AUDIO_ONLY"; private static final int REQUEST_CODE_ADD_PARTICIPANT = 6; @@ -137,15 +132,15 @@ public class TVCallFragment extends BaseSupportFragment<CallPresenter> implement @Inject DeviceRuntimeService mDeviceRuntimeService; - public static TVCallFragment newInstance(@NonNull String action, @Nullable String accountID, @Nullable String contactRingId, boolean audioOnly) { + public static TVCallFragment newInstance(@NonNull String action, @NonNull String accountId, @NonNull String conversationId, @NonNull String contactUri, boolean audioOnly) { Bundle bundle = new Bundle(); bundle.putString(KEY_ACTION, action); - bundle.putString(KEY_ACCOUNT_ID, accountID); - bundle.putSerializable(KEY_CONTACT_RING_ID, contactRingId); + bundle.putAll(ConversationPath.toBundle(accountId, conversationId)); + bundle.putString(Intent.EXTRA_PHONE_NUMBER, contactUri); bundle.putBoolean(KEY_AUDIO_ONLY, audioOnly); - TVCallFragment countDownFragment = new TVCallFragment(); - countDownFragment.setArguments(bundle); - return countDownFragment; + TVCallFragment fragment = new TVCallFragment(); + fragment.setArguments(bundle); + return fragment; } public static TVCallFragment newInstance(@NonNull String action, @Nullable String confId) { @@ -168,9 +163,9 @@ public class TVCallFragment extends BaseSupportFragment<CallPresenter> implement super.initPresenter(presenter); String action = getArguments().getString(KEY_ACTION); if (action != null) { - if (action.equals(ACTION_PLACE_CALL)) { + if (action.equals(Intent.ACTION_CALL)) { prepareCall(false); - } else if (action.equals(ACTION_GET_CALL)) { + } else if (action.equals(Intent.ACTION_VIEW)) { presenter.initIncomingCall(getArguments().getString(KEY_CONF_ID), true); } } @@ -451,15 +446,13 @@ public class TVCallFragment extends BaseSupportFragment<CallPresenter> implement PopupMenu popup = new PopupMenu(context, view); popup.inflate(R.menu.conference_participant_actions); popup.setOnMenuItemClickListener(item -> { - switch (item.getItemId()) { - case R.id.conv_contact_details: - presenter.openParticipantContact(call); - break; - case R.id.conv_contact_hangup: - presenter.hangupParticipant(call); - break; - default: - return false; + int itemId = item.getItemId(); + if (itemId == R.id.conv_contact_details) { + presenter.openParticipantContact(call); + } else if (itemId == R.id.conv_contact_hangup) { + presenter.hangupParticipant(call); + } else { + return false; } return true; }); diff --git a/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactFragment.java b/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactFragment.java index 62530c26415e5cbdd81a0f9eae3dda025a688c5b..5db0ccb3c3ab9a6f78d71e1c20725a07c3d8c51d 100644 --- a/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactFragment.java +++ b/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactFragment.java @@ -15,8 +15,7 @@ * GNU General Public License for more details. * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package cx.ring.tv.contact; @@ -46,6 +45,9 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; import cx.ring.R; import cx.ring.application.JamiApplication; +import cx.ring.client.CallActivity; +import cx.ring.client.HomeActivity; +import cx.ring.fragments.CallFragment; import cx.ring.fragments.ConversationFragment; import net.jami.model.Uri; import net.jami.services.NotificationService; @@ -195,20 +197,17 @@ public class TVContactFragment extends BaseDetailFragment<TVContactPresenter> im } @Override - public void callContact(String accountID, Uri uri) { - Context context = requireContext(); - Intent intent = new Intent(context, TVCallActivity.class); - intent.putExtra(ConversationFragment.KEY_ACCOUNT_ID, accountID); - intent.putExtra(ConversationFragment.KEY_CONTACT_RING_ID, uri.getRawUriString()); - context.startActivity(intent, null); + public void callContact(String accountId, Uri conversationUri, Uri uri) { + startActivity(new Intent(Intent.ACTION_CALL) + .setClass(requireContext(), TVCallActivity.class) + .putExtras(ConversationPath.toBundle(accountId, conversationUri)) + .putExtra(Intent.EXTRA_PHONE_NUMBER, uri.getUri())); } @Override public void goToCallActivity(String id) { - Context context = requireContext(); - Intent intent = new Intent(context, TVCallActivity.class); - intent.putExtra(NotificationService.KEY_CALL_ID, id); - context.startActivity(intent, null); + startActivity(new Intent(requireContext(), TVCallActivity.class) + .putExtra(NotificationService.KEY_CALL_ID, id)); } @Override diff --git a/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactPresenter.java b/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactPresenter.java index cfd0056e1274d4c45ae278a3f20dbee68f65b648..527218aaea8174e377065b020a298935fb238ee8 100644 --- a/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactPresenter.java +++ b/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactPresenter.java @@ -77,14 +77,19 @@ public class TVContactPresenter extends RootPresenter<TVContactView> { public void contactClicked() { Account account = mAccountService.getAccount(mAccountId); if (account != null) { - Conference conf = account.getByUri(mUri).getCurrentCall(); + Conversation conversation = account.getByUri(mUri); + Conference conf = conversation.getCurrentCall(); if (conf != null && !conf.getParticipants().isEmpty() && conf.getParticipants().get(0).getCallStatus() != Call.CallStatus.INACTIVE && conf.getParticipants().get(0).getCallStatus() != Call.CallStatus.FAILURE) { getView().goToCallActivity(conf.getId()); } else { - getView().callContact(mAccountId, mUri); + if (conversation.isSwarm()) { + getView().callContact(mAccountId, mUri, conversation.getContact().getUri()); + } else { + getView().callContact(mAccountId, mUri, mUri); + } } } } diff --git a/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactView.java b/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactView.java index 629c454359fcd67b503308f64fbabb7df97f47dd..d891d3bc08c8981f47df5eab2700d2adb5eb328f 100644 --- a/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactView.java +++ b/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactView.java @@ -27,7 +27,7 @@ import net.jami.smartlist.SmartListViewModel; public interface TVContactView extends BaseView { void showContact(SmartListViewModel model); - void callContact(String accountID, Uri uri); + void callContact(String accountID, Uri conversationUri, Uri uri); void goToCallActivity(String id); diff --git a/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationAdapter.java b/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationAdapter.java index 7fa1975dd254fe7f703c458c3770ba97f68ebc91..be71fb6d6b0690d40d56b4aea72b287912ccd074 100644 --- a/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationAdapter.java +++ b/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationAdapter.java @@ -365,7 +365,7 @@ public class TvConversationAdapter extends RecyclerView.Adapter<TvConversationVi private void configureForFileInfoTextMessage(@NonNull final TvConversationViewHolder viewHolder, @NonNull final Interaction interaction, int position) { DataTransfer file = (DataTransfer) interaction; - File path = presenter.getDeviceRuntimeService().getConversationPath(file.getConversationId(), file.getStoragePath()); + File path = presenter.getDeviceRuntimeService().getConversationPath(interaction.getConversationId() == null ? interaction.getConversation().getParticipant() : interaction.getConversationId(), file.getStoragePath()); file.setSize(path.length()); String timeString = timestampToDetailString(viewHolder.itemView.getContext(), file.getTimestamp()); diff --git a/ring-android/app/src/main/java/cx/ring/tv/main/MainFragment.java b/ring-android/app/src/main/java/cx/ring/tv/main/MainFragment.java index cd6b6edd9e15126804b8fc9ae8cee0841ab45835..92d37c83f48721617b4baee89bd4ef3b0a619d13 100644 --- a/ring-android/app/src/main/java/cx/ring/tv/main/MainFragment.java +++ b/ring-android/app/src/main/java/cx/ring/tv/main/MainFragment.java @@ -14,8 +14,7 @@ * GNU General Public License for more details. * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package cx.ring.tv.main; @@ -362,9 +361,7 @@ public class MainFragment extends BaseBrowseFragment<MainPresenter> implements M @Override public void callContact(String accountID, String number) { - Intent intent = new Intent(getActivity(), TVCallActivity.class); - intent.putExtra(ConversationFragment.KEY_ACCOUNT_ID, accountID); - intent.putExtra(ConversationFragment.KEY_CONTACT_RING_ID, number); + Intent intent = new Intent(Intent.ACTION_CALL, ConversationPath.toUri(accountID, number), getActivity(), TVCallActivity.class); startActivity(intent, null); } diff --git a/ring-android/app/src/main/java/cx/ring/tv/search/ContactSearchFragment.java b/ring-android/app/src/main/java/cx/ring/tv/search/ContactSearchFragment.java index 2b4ec6cb93499dfbfea7fefe8b86ce524ffb128c..8e92f0a043af7478643d6ed888b8bea82ce5ef5d 100644 --- a/ring-android/app/src/main/java/cx/ring/tv/search/ContactSearchFragment.java +++ b/ring-android/app/src/main/java/cx/ring/tv/search/ContactSearchFragment.java @@ -14,8 +14,7 @@ * GNU General Public License for more details. * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package cx.ring.tv.search; @@ -36,7 +35,6 @@ import android.view.View; import cx.ring.R; import cx.ring.application.JamiApplication; import cx.ring.client.CallActivity; -import cx.ring.fragments.ConversationFragment; import net.jami.model.Contact; import net.jami.smartlist.SmartListViewModel; import cx.ring.tv.call.TVCallActivity; @@ -138,7 +136,6 @@ public class ContactSearchFragment extends BaseSearchFragment<ContactSearchPrese @Override public void startCall(String accountID, String number) { Intent intent = new Intent(CallActivity.ACTION_CALL, ConversationPath.toUri(accountID, number), getActivity(), TVCallActivity.class); - intent.putExtra(ConversationFragment.KEY_ACCOUNT_ID, accountID); intent.putExtra(Intent.EXTRA_PHONE_NUMBER, number); startActivity(intent); getActivity().finish(); diff --git a/ring-android/app/src/main/java/cx/ring/utils/ConversationPath.java b/ring-android/app/src/main/java/cx/ring/utils/ConversationPath.java index 6ea001131a008bd570b13c0da6bdefbd4864421d..255ed21426b11f0d61e4c8ec79fb3eaf7abefe77 100644 --- a/ring-android/app/src/main/java/cx/ring/utils/ConversationPath.java +++ b/ring-android/app/src/main/java/cx/ring/utils/ConversationPath.java @@ -1,3 +1,21 @@ +/* + * Copyright (C) 2004-2021 Savoir-faire Linux Inc. + * + * Authors: Adrien Béraud <adrien.beraud@savoirfairelinux.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ package cx.ring.utils; import android.content.Intent; @@ -8,17 +26,21 @@ import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; - -import cx.ring.fragments.ConversationFragment; import net.jami.model.Conversation; import net.jami.model.Interaction; import net.jami.utils.StringUtils; import net.jami.utils.Tuple; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +import cx.ring.BuildConfig; + public class ConversationPath { + public static final String KEY_CONVERSATION_URI = BuildConfig.APPLICATION_ID + ".conversationUri"; + public static final String KEY_ACCOUNT_ID = BuildConfig.APPLICATION_ID + ".accountId"; + private final String accountId; private final String conversationId; public ConversationPath(String account, String contact) { @@ -84,14 +106,14 @@ public class ConversationPath { return toBundle(accountId, conversationId); } public void toBundle(Bundle bundle) { - bundle.putString(ConversationFragment.KEY_CONTACT_RING_ID, conversationId); - bundle.putString(ConversationFragment.KEY_ACCOUNT_ID, accountId); + bundle.putString(KEY_CONVERSATION_URI, conversationId); + bundle.putString(KEY_ACCOUNT_ID, accountId); } public static Bundle toBundle(String accountId, String uri) { Bundle bundle = new Bundle(); - bundle.putString(ConversationFragment.KEY_CONTACT_RING_ID, uri); - bundle.putString(ConversationFragment.KEY_ACCOUNT_ID, accountId); + bundle.putString(KEY_CONVERSATION_URI, uri); + bundle.putString(KEY_ACCOUNT_ID, accountId); return bundle; } public static Bundle toBundle(String accountId, net.jami.model.Uri uri) { @@ -135,8 +157,8 @@ public class ConversationPath { public static ConversationPath fromBundle(@Nullable Bundle bundle) { if (bundle != null) { - String accountId = bundle.getString(ConversationFragment.KEY_ACCOUNT_ID); - String contactId = bundle.getString(ConversationFragment.KEY_CONTACT_RING_ID); + String accountId = bundle.getString(KEY_ACCOUNT_ID); + String contactId = bundle.getString(KEY_CONVERSATION_URI); if (accountId != null && contactId != null) { return new ConversationPath(accountId, contactId); }