i'm trying to mute everyone in the conference call to prevent trolling/spamming, but the problem is allowed to umute audio and video at anytime even tho i'm setting the options to be muted by default. P.S : if you have any idea that may help me to prevent this issue from going on into the conference call please just write it down.
MeetingUtils.kt
object MeetingUtils {
private var isMuted: Boolean = true
fun startMeeting(context: Context, meetingCode: String) {
val serverUrl = URL(context.getString(R.string.app_server_url))
val defaultOptions = JitsiMeetConferenceOptions.Builder()
.setServerURL(serverUrl)
.setWelcomePageEnabled(false)
.setAudioMuted(isMuted)
.setVideoMuted(true)
.setFeatureFlag("invite.enabled", false)
.setFeatureFlag("live-streaming.enabled", false)
.setFeatureFlag("meeting-name.enabled", false)
.setFeatureFlag("call-integration.enabled", false)
.setFeatureFlag("recording.enabled", false)
.build()
JitsiMeet.setDefaultConferenceOptions(defaultOptions)
val options = JitsiMeetConferenceOptions.Builder()
.setRoom(meetingCode)
.setUserInfo(null)
val sharedPrefData= SharedPrefData(context)
val currentUser = FirebaseAuth.getInstance().currentUser
if (sharedPrefData.getSkip().equals("Skip"))
{
val userInfoBundle = bundleOf(
"displayName" to "User Not Sign in",
"email" to "Please Sign In",
"avatarURL" to R.drawable.ic_account
)
options.setUserInfo(JitsiMeetUserInfo(userInfoBundle))
}
else
{
if (currentUser != null) {
val userInfoBundle = bundleOf(
"displayName" to sharedPrefData.getName(),
"email" to sharedPrefData.getEmail(),
"avatarURL" to sharedPrefData.getImage()
)
options.setUserInfo(JitsiMeetUserInfo(userInfoBundle))
}
val userInfoBundle = bundleOf(
"displayName" to sharedPrefData.getName() ,
"email" to sharedPrefData.getEmail(),
"avatarURL" to "http://graph.facebook.com/${sharedPrefData.getAuthId()}/picture?type=square"
)
options.setUserInfo(JitsiMeetUserInfo(userInfoBundle))
}
JitsiMeetActivity.launch(context, options.build())
}
}
HomeFragment.kt
class HomeFragment : Fragment() {
private var binding: FragmentHomeBinding? = null
private val minMeetingCodeLength = 10
private var currentUser: FirebaseUser? = null
var email:String?=null
var firstName:String?=null
var lastName:String?=null
var profileImage:String?=null
private val viewModel by viewModel<MainViewModel>()
lateinit var auth: FirebaseAuth
private var sharedPrefData: SharedPrefData?=null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment
binding=FragmentHomeBinding.inflate(inflater,container,false)
val view = binding!!.root
onCreateMeetingCodeChange()
onCopyMeetingCodeFromClipboardClick()
onShareMeetingCodeClick()
onJoinMeetingClick()
onCreateMeetingClick()
onMeetingToggleChange()
val mAdView: AdView = view.findViewById(R.id.adView)
val adRequest = AdRequest.Builder().build()
mAdView.loadAd(adRequest)
return view
}
companion object{
fun newInstance(text: String?): HomeFragment? {
val f = HomeFragment()
val b = Bundle()
b.putString("msg", text)
f.arguments = b
return f
}
}
private fun onMeetingToggleChange() {
binding?.tgMeeting?.addOnButtonCheckedListener { toggleGroup, checkedId, isChecked ->
if (isChecked) {
when (checkedId) {
R.id.btnToggleJoinMeeting -> {
binding?.groupCreateMeeting?.makeGone()
binding?.groupJoinMeeting?.makeVisible()
}
R.id.btnToggleCreateMeeting -> {
binding?.groupJoinMeeting?.makeGone()
binding?.groupCreateMeeting?.makeVisible()
val meetingCode = generateMeetingCode()
binding?.etCodeCreateMeeting?.setText(meetingCode)
}
}
}
}
}
private fun onCreateMeetingCodeChange() {
binding?.tilCodeCreateMeeting?.etCodeCreateMeeting?.doOnTextChanged { text, start, before, count ->
if (count >= minMeetingCodeLength) binding?.tilCodeCreateMeeting!!.error = null
}
}
private fun generateMeetingCode(): String {
val allowedChars = ('A'..'Z') + ('a'..'z')
return (1..10)
.map { allowedChars.random() }
.joinToString("")
}
private fun onCopyMeetingCodeFromClipboardClick() {
binding?.tilCodeJoinMeeting?.setEndIconOnClickListener {
val clipboardText = activity?.getTextFromClipboard()
if (clipboardText != null) {
binding?.etCodeJoinMeeting?.setText(clipboardText)
activity?.toast(getString(R.string.main_meeting_code_copied))
} else {
activity?.toast(getString(R.string.main_empty_clipboard))
}
}
}
private fun onShareMeetingCodeClick() {
binding?.tilCodeCreateMeeting?.setEndIconOnClickListener {
if (binding?.etCodeCreateMeeting?.text.toString().length >= minMeetingCodeLength) {
binding!!.tilCodeCreateMeeting.error = null
activity?.startShareTextIntent(
getString(R.string.main_share_meeting_code_title),
"Meeting Code: "+binding!!.etCodeCreateMeeting.text.toString()+"\n "+
getString(R.string.profile_share_app_text, activity!!. applicationContext.packageName)
)
} else {
binding!!.tilCodeCreateMeeting.error =
getString(R.string.main_error_meeting_code_length, minMeetingCodeLength)
}
}
}
private fun onJoinMeetingClick() {
binding?.btnJoinMeeting?.setOnClickListener {
if (binding!!.etCodeJoinMeeting.text.toString().length >= minMeetingCodeLength) {
joinMeeting()
} else {
activity?.toast(getString(R.string.main_error_meeting_code_length, minMeetingCodeLength))
}
}
}
private fun joinMeeting() {
activity?.let {
MeetingUtils.startMeeting(
it,
binding?.etCodeJoinMeeting?.text.toString())
} // Start Meeting
viewModel.addMeetingToDb(
Meeting(
binding?.etCodeJoinMeeting?.text.toString(),
System.currentTimeMillis()
)
) // Add meeting to db
}
private fun onCreateMeetingClick() {
binding?.btnCreateMeeting?.setOnClickListener {
if (binding!!.etCodeCreateMeeting.text.toString().length >= minMeetingCodeLength) {
createMeeting()
} else {
activity?.toast(getString(R.string.main_error_meeting_code_length, minMeetingCodeLength))
}
}
}
private fun createMeeting() {
activity?.let {
MeetingUtils.startMeeting(
it,
binding?.etCodeCreateMeeting?.text.toString()
)
} // Start Meeting
viewModel.addMeetingToDb(
Meeting(
binding?.etCodeCreateMeeting?.text.toString(),
System.currentTimeMillis()
)
) // Add meeting to db
}
}