diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java index 7bee5a77b..f79298f5b 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java @@ -32,6 +32,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.res.Configuration; import android.graphics.Color; +import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.media.AudioAttributes; import android.media.MediaPlayer; @@ -82,6 +83,8 @@ import com.nextcloud.talk.models.json.signaling.Signaling; import com.nextcloud.talk.models.json.signaling.SignalingOverall; import com.nextcloud.talk.models.json.signaling.settings.IceServer; import com.nextcloud.talk.models.json.signaling.settings.SignalingSettingsOverall; +import com.nextcloud.talk.ui.dialog.AudioOutputDialog; +import com.nextcloud.talk.ui.dialog.ScopeDialog; import com.nextcloud.talk.utils.ApiUtils; import com.nextcloud.talk.utils.DisplayUtils; import com.nextcloud.talk.utils.NotificationUtils; @@ -142,6 +145,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.drawable.DrawableCompat; import autodagger.AutoInjector; import io.reactivex.Observable; import io.reactivex.Observer; @@ -327,16 +331,20 @@ public class CallActivity extends CallBaseActivity { private void initClickListeners() { binding.pictureInPictureButton.setOnClickListener(l -> enterPipMode()); - binding.speakerButton.setOnClickListener(l -> { - if (audioManager != null) { - audioManager.toggleUseSpeakerphone(); - if (audioManager.isSpeakerphoneAutoOn()) { - binding.speakerButton.getHierarchy().setPlaceholderImage(R.drawable.ic_volume_up_white_24dp); - } else { - binding.speakerButton.getHierarchy().setPlaceholderImage(R.drawable.ic_volume_mute_white_24dp); - } - } - }); + binding.audioOutputButton.setOnClickListener(v -> new AudioOutputDialog( + this + ).show()); + +// binding.audioOutputButton.setOnClickListener(l -> { +// if (audioManager != null) { +// audioManager.toggleUseSpeakerphone(); +// if (audioManager.isSpeakerphoneAutoOn()) { +// binding.audioOutputButton.getHierarchy().setPlaceholderImage(R.drawable.ic_volume_up_white_24dp); +// } else { +// binding.audioOutputButton.getHierarchy().setPlaceholderImage(R.drawable.ic_volume_mute_white_24dp); +// } +// } +// }); binding.microphoneButton.setOnClickListener(l -> onMicrophoneClick()); binding.microphoneButton.setOnLongClickListener(l -> { @@ -373,6 +381,11 @@ public class CallActivity extends CallBaseActivity { }); } + public void setAudioOutputIcon(Drawable drawable){ + binding.audioOutputButton.getHierarchy().setPlaceholderImage(drawable); + DrawableCompat.setTint(drawable, Color.WHITE); + } + private void createCameraEnumerator() { boolean camera2EnumeratorIsSupported = false; try { @@ -496,7 +509,7 @@ public class CallActivity extends CallBaseActivity { } if (isVoiceOnlyCall) { - binding.speakerButton.setVisibility(View.VISIBLE); + binding.audioOutputButton.setVisibility(View.VISIBLE); binding.switchSelfVideoButton.setVisibility(View.GONE); binding.cameraButton.setVisibility(View.GONE); binding.selfVideoRenderer.setVisibility(View.GONE); @@ -513,7 +526,7 @@ public class CallActivity extends CallBaseActivity { params.setMargins(0, 0, 0, 0); binding.gridview.setLayoutParams(params); - binding.speakerButton.setVisibility(View.GONE); + binding.audioOutputButton.setVisibility(View.GONE); if (cameraEnumerator.getDeviceNames().length < 2) { binding.switchSelfVideoButton.setVisibility(View.GONE); } diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/AudioOutputDialog.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/AudioOutputDialog.kt new file mode 100644 index 000000000..c8d4cfb2a --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/AudioOutputDialog.kt @@ -0,0 +1,77 @@ +/* + * Nextcloud Talk application + * + * @author Marcel Hibbe + * @author Andy Scherzinger + * Copyright (C) 2021 Marcel Hibbe + * Copyright (C) 2021 Andy Scherzinger + * + * 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 . + */ + +package com.nextcloud.talk.ui.dialog + +import android.os.Bundle +import android.util.Log +import android.view.View +import android.view.ViewGroup +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog +import com.nextcloud.talk.R +import com.nextcloud.talk.activities.CallActivity +import com.nextcloud.talk.databinding.DialogAudioOutputBinding + +class AudioOutputDialog(val callActivity: CallActivity) : BottomSheetDialog(callActivity) { + + private lateinit var dialogAudioOutputBinding: DialogAudioOutputBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + dialogAudioOutputBinding = DialogAudioOutputBinding.inflate(layoutInflater) + setContentView(dialogAudioOutputBinding.root) + window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) + + + dialogAudioOutputBinding.audioOutputBluetooth.setOnClickListener { + Log.d(TAG, "bluetooth button clicked") + callActivity.setAudioOutputIcon(dialogAudioOutputBinding.audioOutputBluetoothIcon.drawable) + dismiss() + } + + dialogAudioOutputBinding.audioOutputSpeaker.setOnClickListener { + Log.d(TAG, "speaker button clicked") + callActivity.setAudioOutputIcon(dialogAudioOutputBinding.audioOutputSpeakerIcon.drawable) + + dismiss() + } + + dialogAudioOutputBinding.audioOutputEarspeaker.setOnClickListener { + Log.d(TAG, "earspeaker button clicked") + callActivity.setAudioOutputIcon(dialogAudioOutputBinding.audioOutputEarspeakerIcon.drawable) + + dismiss() + } + } + + override fun onStart() { + super.onStart() + val bottomSheet = findViewById(R.id.design_bottom_sheet) + val behavior = BottomSheetBehavior.from(bottomSheet as View) + behavior.state = BottomSheetBehavior.STATE_EXPANDED + } + + companion object { + private const val TAG = "AudioOutputDialog" + } +} diff --git a/app/src/main/res/drawable/ic_baseline_bluetooth_audio_24.xml b/app/src/main/res/drawable/ic_baseline_bluetooth_audio_24.xml new file mode 100644 index 000000000..3ac2dc4d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_bluetooth_audio_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_phone_in_talk_24.xml b/app/src/main/res/drawable/ic_baseline_phone_in_talk_24.xml new file mode 100644 index 000000000..42e266da8 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_phone_in_talk_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/call_activity.xml b/app/src/main/res/layout/call_activity.xml index ca1c5ddbe..310e1cba1 100644 --- a/app/src/main/res/layout/call_activity.xml +++ b/app/src/main/res/layout/call_activity.xml @@ -153,7 +153,7 @@ app:roundAsCircle="true" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 94ca857b3..00e94ad71 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -494,5 +494,9 @@ Send Error taking picture Taking a photo is not possible without permissions + Bluetooth + Speaker + Phone + Audio output