diff --git a/app/src/main/java/org/thoughtcrime/securesms/dependencies/DatabaseModule.kt b/app/src/main/java/org/thoughtcrime/securesms/dependencies/DatabaseModule.kt index 0a1171e504..a2e7d7140e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/DatabaseModule.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/DatabaseModule.kt @@ -14,6 +14,7 @@ import org.thoughtcrime.securesms.crypto.AttachmentSecretProvider import org.thoughtcrime.securesms.crypto.DatabaseSecretProvider import org.thoughtcrime.securesms.database.* import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper +import org.thoughtcrime.securesms.webrtc.data.SessionCallDataProvider import javax.inject.Singleton @Module @@ -121,6 +122,10 @@ object DatabaseModule { @Singleton fun provideStorage(@ApplicationContext context: Context, openHelper: SQLCipherOpenHelper) = Storage(context,openHelper) +// @Provides +// @Singleton +// fun provideCallDataProvider(storage: Storage) = SessionCallDataProvider(storage) + @Provides @Singleton fun provideAttachmentProvider(@ApplicationContext context: Context, openHelper: SQLCipherOpenHelper): MessageDataProvider = DatabaseAttachmentProvider(context, openHelper) diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.kt b/app/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.kt index 0a80d4f5ae..abf56860a1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.kt @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.service +import android.app.Notification import android.app.Service import android.content.Context import android.content.Intent @@ -36,6 +37,10 @@ class WebRtcCallService: Service(), SignalAudioManager.EventListener { private const val INVALID_NOTIFICATION_ID = -1 + private var lastNotificationId: Int = INVALID_NOTIFICATION_ID + private var lastNotification: Notification? = null + + fun update(context: Context, type: Int, callId: UUID) { val intent = Intent(context, WebRtcCallService::class.java) .setAction(ACTION_UPDATE) diff --git a/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallManager.kt b/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallManager.kt index 4c0a4ead2e..9526a5a168 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallManager.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallManager.kt @@ -6,12 +6,32 @@ import org.thoughtcrime.securesms.database.Storage import java.util.concurrent.Executors import javax.inject.Inject -class CallManager @Inject constructor( - private val context: Context, - private val storage: Storage, - ) { +class CallManager(private val context: Context, + private val storage: Storage) { private val serviceExecutor = Executors.newSingleThreadExecutor() private val networkExecutor = Executors.newSingleThreadExecutor() + + + fun networkChange(networkAvailable: Boolean) { + + } + + fun acceptCall() { + + } + + fun declineCall() { + + } + + fun setAudioEnabled(isEnabled: Boolean) { + + } + + fun setVideoEnabled(isEnabled: Boolean) { + + } + } \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallViewModel.kt new file mode 100644 index 0000000000..b73a7b1920 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallViewModel.kt @@ -0,0 +1,32 @@ +package org.thoughtcrime.securesms.webrtc + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import javax.inject.Inject + +@HiltViewModel +class CallViewModel @Inject constructor( + private val callManager: CallManager +): ViewModel() { + + sealed class StateEvent { + data class AudioEnabled(val isEnabled: Boolean): StateEvent() + data class VideoEnabled(val isEnabled: Boolean): StateEvent() + } + + private val audioEnabledState = MutableStateFlow(StateEvent.AudioEnabled(true)) + private val videoEnabledState = MutableStateFlow(StateEvent.VideoEnabled(false)) + + // set up listeners for establishing connection toggling video / audio + init { + audioEnabledState.onEach { (enabled) -> callManager.setAudioEnabled(enabled) } + .launchIn(viewModelScope) + videoEnabledState.onEach { (enabled) -> callManager.setVideoEnabled(enabled) } + .launchIn(viewModelScope) + } + +} \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/webrtc/WebRtcCallServiceReceivers.kt b/app/src/main/java/org/thoughtcrime/securesms/webrtc/WebRtcCallServiceReceivers.kt new file mode 100644 index 0000000000..614eff09df --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/webrtc/WebRtcCallServiceReceivers.kt @@ -0,0 +1,49 @@ +package org.thoughtcrime.securesms.webrtc + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.telephony.PhoneStateListener +import android.telephony.TelephonyManager +import dagger.hilt.android.AndroidEntryPoint +import org.session.libsignal.utilities.Log +import javax.inject.Inject + + +class HangUpRtcOnPstnCallAnsweredListener(private val hangupListener: ()->Unit): PhoneStateListener() { + + companion object { + private val TAG = Log.tag(HangUpRtcOnPstnCallAnsweredListener::class.java) + } + + override fun onCallStateChanged(state: Int, phoneNumber: String?) { + super.onCallStateChanged(state, phoneNumber) + if (state == TelephonyManager.CALL_STATE_OFFHOOK) { + hangupListener() + Log.i(TAG, "Device phone call ended Session call.") + } + } +} + +@AndroidEntryPoint +class NetworkReceiver: BroadcastReceiver() { + + @Inject + lateinit var callManager: CallManager + + override fun onReceive(context: Context?, intent: Intent?) { + TODO("Not yet implemented") + } +} + +class PowerButtonReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + TODO("Not yet implemented") + } +} + +class ProximityLockRelease: Thread.UncaughtExceptionHandler { + override fun uncaughtException(t: Thread, e: Throwable) { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/webrtc/data/SessionCallDataProvider.kt b/app/src/main/java/org/thoughtcrime/securesms/webrtc/data/SessionCallDataProvider.kt new file mode 100644 index 0000000000..bb06c2224c --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/webrtc/data/SessionCallDataProvider.kt @@ -0,0 +1,11 @@ +package org.thoughtcrime.securesms.webrtc.data + +import org.session.libsession.database.CallDataProvider +import org.session.libsession.database.StorageProtocol +import javax.inject.Inject + +class SessionCallDataProvider @Inject constructor(private val storage: StorageProtocol): CallDataProvider { + + + +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index ac70988e49..cababa1d56 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ android.useAndroidX=true android.enableJetifier=true org.gradle.jvmargs=-Xmx2048m -kotlinVersion=1.4.32 +kotlinVersion=1.5.31 kovenantVersion=3.3.0 curve25519Version=0.5.0 protobufVersion=2.5.0 diff --git a/libsession/src/main/java/org/session/libsession/database/CallDataProvider.kt b/libsession/src/main/java/org/session/libsession/database/CallDataProvider.kt new file mode 100644 index 0000000000..8ca27b50db --- /dev/null +++ b/libsession/src/main/java/org/session/libsession/database/CallDataProvider.kt @@ -0,0 +1,7 @@ +package org.session.libsession.database + +interface CallDataProvider { + // answer/offer for call by UUID + // recipient info for call by UUID + +} \ No newline at end of file