diff --git a/src/cheogram/AndroidManifest.xml b/src/cheogram/AndroidManifest.xml index 62396bed1af27fcdcac16db152115fbd362223ec..956e892fe1b1768858702f10c6c8aac4617bc18d 100644 --- a/src/cheogram/AndroidManifest.xml +++ b/src/cheogram/AndroidManifest.xml @@ -3,7 +3,18 @@ xmlns:tools="http://schemas.android.com/tools" package="eu.siacs.conversations"> + + + + + + + + + clazz) { if (clazz == JabberIdContact.class) { return Options.SYNCED_VIA_ADDRESSBOOK; diff --git a/src/main/java/eu/siacs/conversations/entities/Presences.java b/src/main/java/eu/siacs/conversations/entities/Presences.java index 04d378cc2602e9fd47b1da60d9a9fdf3433114c6..d0a25e884d52d0f3274bbceb0c961b99c1ccd5de 100644 --- a/src/main/java/eu/siacs/conversations/entities/Presences.java +++ b/src/main/java/eu/siacs/conversations/entities/Presences.java @@ -149,6 +149,21 @@ public class Presences { return false; } + public boolean anyIdentity(final String category, final String type) { + synchronized (this.presences) { + if (this.presences.size() == 0) { + return true; + } + for (Presence presence : this.presences.values()) { + ServiceDiscoveryResult disco = presence.getServiceDiscoveryResult(); + if (disco != null && disco.hasIdentity(category, type)) { + return true; + } + } + } + return false; + } + public Pair, Map> toTypeAndNameMap() { Map typeMap = new HashMap<>(); Map nameMap = new HashMap<>(); diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 42b699e46e806cf95b0048f0fd320930a94cb967..9c533e4905df42f2e96fa22295657518410556b2 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -233,6 +233,11 @@ public class XmppConnectionService extends Service { } } } + + if (contact.getPresences().size() > 0 && + contact.getPresences().anyIdentity("gateway", "pstn")) { + contact.registerAsPhoneAccount(this); + } }; private final PresenceGenerator mPresenceGenerator = new PresenceGenerator(this); private List accounts; @@ -1968,6 +1973,7 @@ public class XmppConnectionService extends Service { public void syncRoster(final Account account) { + unregisterPhoneAccounts(account); mRosterSyncTaskManager.execute(account, () -> databaseBackend.writeRoster(account.getRoster())); } @@ -3449,6 +3455,14 @@ public class XmppConnectionService extends Service { } } + protected void unregisterPhoneAccounts(final Account account) { + for (final Contact contact : account.getRoster().getContacts()) { + if (!contact.showInRoster()) { + contact.unregisterAsPhoneAccount(this); + } + } + } + public void createContact(final Contact contact, final boolean autoGrant) { createContact(contact, autoGrant, null); } diff --git a/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java b/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java index 8a2b87b47ed5d2499521b6fa367cca69d960a6f9..7a94829c3ac34da311c64f4cb24f7e3916fcd309 100644 --- a/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java @@ -71,12 +71,18 @@ import eu.siacs.conversations.xmpp.jingle.JingleRtpConnection; import eu.siacs.conversations.xmpp.jingle.Media; import eu.siacs.conversations.xmpp.jingle.RtpEndUserState; +import com.cheogram.android.ConnectionService.ConnectionBinder; + +import static eu.siacs.conversations.utils.PermissionUtils.getFirstDenied; +import static java.util.Arrays.asList; + public class RtpSessionActivity extends XmppActivity implements XmppConnectionService.OnJingleRtpConnectionUpdate, eu.siacs.conversations.ui.widget.SurfaceViewRenderer.OnAspectRatioChanged { public static final String EXTRA_WITH = "with"; public static final String EXTRA_SESSION_ID = "session_id"; public static final String EXTRA_LAST_REPORTED_STATE = "last_reported_state"; public static final String EXTRA_LAST_ACTION = "last_action"; + public static final String EXTRA_CONNECTION_BINDER = "connection_binder"; public static final String ACTION_ACCEPT_CALL = "action_accept_call"; public static final String ACTION_MAKE_VOICE_CALL = "action_make_voice_call"; public static final String ACTION_MAKE_VIDEO_CALL = "action_make_video_call"; @@ -142,6 +148,8 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe } } + protected android.os.IBinder connectionBinder = null; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -160,6 +168,8 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe boolean dialpadVisible = savedInstanceState.getBoolean("dialpad_visible"); binding.dialpad.setVisibility(dialpadVisible ? View.VISIBLE : View.GONE); } + + this.connectionBinder = getIntent().getExtras().getBinder(EXTRA_CONNECTION_BINDER); } @Override @@ -262,6 +272,29 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe } else { requireRtpConnection().endCall(); } + disconnectConnectionBinder(); + } + + private void disconnectConnectionBinder() { + if (connectionBinder != null) { + android.os.Parcel args = android.os.Parcel.obtain(); + try { + connectionBinder.transact(ConnectionBinder.TRANSACT_DISCONNECT, args, null, 0); + } catch (android.os.RemoteException e) {} + args.recycle(); + } + } + + private void activateConnectionBinder() { + // If we do this, the other UI takes over and kills our call + // So we can't activate that UI unless we are going to use it. + /*if (connectionBinder != null) { + android.os.Parcel args = android.os.Parcel.obtain(); + try { + connectionBinder.transact(ConnectionBinder.TRANSACT_ACTIVE, args, null, 0); + } catch (android.os.RemoteException e) {} + args.recycle(); + }*/ } private void retractSessionProposal() { @@ -1153,10 +1186,14 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe @Override public void onJingleRtpConnectionUpdate(Account account, Jid with, final String sessionId, RtpEndUserState state) { Log.d(Config.LOGTAG, "onJingleRtpConnectionUpdate(" + state + ")"); + if (state == RtpEndUserState.CONNECTED) { + activateConnectionBinder(); + } if (END_CARD.contains(state)) { Log.d(Config.LOGTAG, "end card reached"); releaseProximityWakeLock(); runOnUiThread(() -> getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)); + disconnectConnectionBinder(); } if (with.isBareJid()) { updateRtpSessionProposalState(account, with, state);