package com.android.livematch.activity; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.os.Bundle; import android.os.Handler; import android.util.DisplayMetrics; import android.util.Log; import android.view.View; import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import com.android.livematch.R; import com.android.livematch.adapter.ButtonAdapter; import com.android.livematch.interfaces.MeetingInterface; import com.android.livematch.useful.AppGlobal; import android.widget.Button; import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import java.util.List; import java.util.Random; import java.util.concurrent.locks.AbstractOwnableSynchronizer; import us.zoom.sdk.CustomizedNotificationData; import us.zoom.sdk.FreeMeetingNeedUpgradeType; import us.zoom.sdk.InMeetingAudioController; import us.zoom.sdk.InMeetingChatMessage; import us.zoom.sdk.InMeetingEventHandler; import us.zoom.sdk.InMeetingNotificationHandle; import us.zoom.sdk.InMeetingService; import us.zoom.sdk.InMeetingServiceListener; import us.zoom.sdk.InMeetingUserInfo; import us.zoom.sdk.InMeetingVideoController; import us.zoom.sdk.JoinMeetingOptions; import us.zoom.sdk.JoinMeetingParams; import us.zoom.sdk.MeetingError; import us.zoom.sdk.MeetingService; import us.zoom.sdk.MeetingServiceListener; import us.zoom.sdk.MeetingSettingsHelper; import us.zoom.sdk.MeetingStatus; import us.zoom.sdk.MobileRTCVideoUnitAspectMode; import us.zoom.sdk.MobileRTCVideoUnitRenderInfo; import us.zoom.sdk.MobileRTCVideoView; import us.zoom.sdk.MobileRTCVideoViewManager; public class MeetingActivity extends AppCompatActivity implements MeetingInterface { Context mContext; Activity mActivity; ButtonAdapter buttonAdapter; TextView tvWelcomeMessage; Button tvUserName; RelativeLayout outerNameLayout; RelativeLayout tabsLayout; ImageButton btnAudio; RecyclerView recyclerTabs; FrameLayout frameVideoView; InMeetingAudioController mInMeetingAudioController; InMeetingVideoController mInMeetingVideoController; MeetingService mMeetingService; InMeetingService mInMeetingService; MobileRTCVideoView mobileRTCVideoView; MobileRTCVideoViewManager mobileRTCVideoViewManager; List inMeetingUserList; String DISPLAY_NAME = ""; LinearLayoutManager layoutManager; MobileRTCVideoUnitRenderInfo renderInfo1 = new MobileRTCVideoUnitRenderInfo(0, 0, 100, 100); MobileRTCVideoUnitRenderInfo renderInfo2 = new MobileRTCVideoUnitRenderInfo(0, 0, 0, 0); boolean loadingFirstTime = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_meeting); loadingFirstTime = true; disableFullScreenMode(); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); mContext = MeetingActivity.this; mActivity = MeetingActivity.this; //findControls(); startMeeting(); } private void findControls() { setContentView(R.layout.activity_meeting); tvWelcomeMessage = findViewById(R.id.tvWelcomeMessage); tvUserName = findViewById(R.id.tvUserName); mobileRTCVideoView = findViewById(R.id.mobileRTCVideoView); frameVideoView = findViewById(R.id.frameVideoView); btnAudio = findViewById(R.id.btnAudio); outerNameLayout = findViewById(R.id.outerNameLayout); tabsLayout = findViewById(R.id.tabsLayout); recyclerTabs = findViewById(R.id.recyclerTabs); buttonAdapter = new ButtonAdapter(mContext); layoutManager = new LinearLayoutManager(mContext); recyclerTabs.setLayoutManager(layoutManager); recyclerTabs.setAdapter(buttonAdapter); DISPLAY_NAME = getString(R.string.username_prefix) + AppGlobal.UserName; tvUserName.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { OnNameSectionClicked(); } }); outerNameLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { OnNameSectionClicked(); } }); btnAudio.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mInMeetingAudioController.isAudioConnected()) { mInMeetingAudioController.disconnectAudio(); btnAudio.setBackgroundResource(R.drawable.button_mute); } else { mInMeetingAudioController.connectAudioWithVoIP(); btnAudio.setBackgroundResource(R.drawable.button_unmute); } } }); } private void OnNameSectionClicked() { if (tabsLayout.getVisibility() == View.VISIBLE) { hideMeetingTabs(1); } else { tabsLayout.setVisibility(View.VISIBLE); tabsLayout.startAnimation(AnimationUtils.loadAnimation(mActivity, R.anim.slide_right_enter)); hideMeetingTabs(8000); } } private void registerMeetingServiceListener() { mMeetingService = AppGlobal.zoomSDK.getMeetingService(); mMeetingService.addListener(meetingServiceListener); mInMeetingService = AppGlobal.zoomSDK.getInMeetingService(); mInMeetingVideoController = this.mInMeetingService.getInMeetingVideoController(); mInMeetingAudioController = this.mInMeetingService.getInMeetingAudioController(); mInMeetingAudioController.setMuteOnEntry(true); mInMeetingService.addListener(inMeetingServiceListener); //AppGlobal.zoomSDK.getMeetingSettingsHelper().disableShowMeetingNotification(true); } MeetingServiceListener meetingServiceListener = new MeetingServiceListener() { @Override public void onMeetingStatusChanged(MeetingStatus meetingStatus, int errorCode, int internalErrorCode) { Log.d("meetingStatus", meetingStatus + ""); if(loadingFirstTime && meetingStatus == meetingStatus.MEETING_STATUS_CONNECTING) { loadingFirstTime = false; findControls(); } else if (meetingStatus == meetingStatus.MEETING_STATUS_FAILED && errorCode == MeetingError.MEETING_ERROR_CLIENT_INCOMPATIBLE) { Toast.makeText(getApplicationContext(), "Version of ZoomSDK is too low!", Toast.LENGTH_LONG).show(); } else if (errorCode == MeetingError.MEETING_ERROR_INCORRECT_MEETING_NUMBER || errorCode == MeetingError.MEETING_ERROR_MEETING_NOT_EXIST) { Toast.makeText(mContext, "INVALID EVENT ID", Toast.LENGTH_SHORT).show(); FinishActivity(); } else if (meetingStatus == meetingStatus.MEETING_STATUS_WAITINGFORHOST) { Toast.makeText(mContext, "Meeting Going Live Soon", Toast.LENGTH_SHORT).show(); FinishActivity(); } else if (meetingStatus == MeetingStatus.MEETING_STATUS_INMEETING) { mobileRTCVideoViewManager = mobileRTCVideoView.getVideoViewManager(); if (mobileRTCVideoViewManager != null) { mInMeetingAudioController.connectAudioWithVoIP(); showHideViews(false); renderInfo1.aspect_mode = MobileRTCVideoUnitAspectMode.VIDEO_ASPECT_FULL_FILLED; inMeetingUserList = mInMeetingService.getInMeetingUserList(); boolean videoConfigured = false; long hostUserId = 0; for (Long l : inMeetingUserList) { InMeetingUserInfo userInfo = mInMeetingService.getUserInfoById(l.longValue()); boolean isSending = userInfo.getVideoStatus().isSending(); boolean hotSpotted = mInMeetingVideoController.isUserVideoSpotLighted(l.longValue()); boolean isHostUser = mInMeetingService.isHostUser(l.longValue()); //no use if (isHostUser) { hostUserId = l.longValue(); } if (isSending && hotSpotted) { mobileRTCVideoViewManager.addAttendeeVideoUnit(l.longValue(), renderInfo1); videoConfigured = true; break; } else { mobileRTCVideoViewManager.removeAllAttendeeVideoUnit(); mobileRTCVideoViewManager.addAttendeeVideoUnit(l.longValue(), renderInfo2); } } if (!videoConfigured) { mobileRTCVideoViewManager.addAttendeeVideoUnit(hostUserId, renderInfo1); } } } } }; InMeetingServiceListener inMeetingServiceListener = new InMeetingServiceListener() { @Override public void onMeetingNeedPasswordOrDisplayName(boolean b, boolean b1, InMeetingEventHandler inMeetingEventHandler) { } @Override public void onWebinarNeedRegister(String s) { } @Override public void onJoinWebinarNeedUserNameAndEmail(InMeetingEventHandler inMeetingEventHandler) { } @Override public void onMeetingNeedColseOtherMeeting(InMeetingEventHandler inMeetingEventHandler) { } @Override public void onMeetingFail(int i, int i1) { } @Override public void onMeetingLeaveComplete(long l) { } @Override public void onMeetingUserJoin(List list) { } @Override public void onMeetingUserLeave(List list) { } @Override public void onMeetingUserUpdated(long l) { } @Override public void onMeetingHostChanged(long l) { } @Override public void onMeetingCoHostChanged(long l) { } @Override public void onActiveVideoUserChanged(long l) { //Log.d("spl-11111", l + ""); if (mobileRTCVideoViewManager != null) { //Log.d("spl-22222", l + ""); mobileRTCVideoViewManager.removeAllAttendeeVideoUnit(); mobileRTCVideoViewManager.addAttendeeVideoUnit(l, renderInfo1); } } @Override public void onActiveSpeakerVideoUserChanged(long l) { } @Override public void onSpotlightVideoChanged(boolean b) { } @Override public void onUserVideoStatusChanged(long l, VideoStatus videoStatus) { } @Override public void onUserNetworkQualityChanged(long l) { } @Override public void onMicrophoneStatusError(InMeetingAudioController.MobileRTCMicrophoneError mobileRTCMicrophoneError) { } @Override public void onUserAudioStatusChanged(long l, AudioStatus audioStatus) { } @Override public void onHostAskUnMute(long l) { } @Override public void onHostAskStartVideo(long l) { } @Override public void onUserAudioTypeChanged(long l) { } @Override public void onMyAudioSourceTypeChanged(int i) { } @Override public void onLowOrRaiseHandStatusChanged(long l, boolean b) { } @Override public void onChatMessageReceived(InMeetingChatMessage inMeetingChatMessage) { } @Override public void onSilentModeChanged(boolean b) { } @Override public void onFreeMeetingReminder(boolean b, boolean b1, boolean b2) { } @Override public void onMeetingActiveVideo(long l) { } @Override public void onSinkAttendeeChatPriviledgeChanged(int i) { } @Override public void onSinkAllowAttendeeChatNotification(int i) { } @Override public void onUserNameChanged(long l, String s) { } @Override public void onFreeMeetingNeedToUpgrade(FreeMeetingNeedUpgradeType freeMeetingNeedUpgradeType, String s) { } @Override public void onFreeMeetingUpgradeToGiftFreeTrialStart() { } @Override public void onFreeMeetingUpgradeToGiftFreeTrialStop() { } @Override public void onFreeMeetingUpgradeToProMeeting() { } @Override public void onClosedCaptionReceived(String s) { } @Override public void onRecordingStatus(RecordingStatus recordingStatus) { } @Override public void onInvalidReclaimHostkey() { } }; private void startMeeting() { if (!AppGlobal.zoomSDK.isInitialized()) { Toast.makeText(this, "SDK has not been initialized successfully", Toast.LENGTH_LONG).show(); return; } if (AppGlobal.MeetingID.equals("")) { Toast.makeText(this, "MEETING_ID in Constants can not be NULL", Toast.LENGTH_LONG).show(); return; } registerMeetingServiceListener(); MeetingSettingsHelper meetingSettingsHelper = AppGlobal.zoomSDK.getMeetingSettingsHelper(); meetingSettingsHelper.setCustomizedMeetingUIEnabled(true); meetingSettingsHelper.disableShowMeetingNotification(true); meetingSettingsHelper.setNoUserJoinOrLeaveTipEnabled(false); meetingSettingsHelper.setHideNoVideoUsersEnabled(true); meetingSettingsHelper.setGalleryViewCapacity(4); meetingSettingsHelper.setSwitchVideoLayoutAccordingToUserCountEnabled(true); meetingSettingsHelper.setSwitchVideoLayoutUserCountThreshold(2); meetingSettingsHelper.setAlwaysShowMeetingToolbarEnabled(false); meetingSettingsHelper.setClosedCaptionHidden(true); meetingSettingsHelper.setMuteMyMicrophoneWhenJoinMeeting(true); meetingSettingsHelper.setSwitchVideoLayoutAccordingToUserCountEnabled(false); meetingSettingsHelper.setTurnOffMyVideoWhenJoinMeeting(true); meetingSettingsHelper.enable720p(true); CustomizedNotificationData customizedNotificationData = new CustomizedNotificationData(); customizedNotificationData.setContentTitleId(R.string.app_name); customizedNotificationData.setContentTextId(R.string.app_name); customizedNotificationData.setLargeIconId(R.drawable.app_icon); customizedNotificationData.setSmallIconId(R.drawable.app_icon); customizedNotificationData.setSmallIconForLorLaterId(R.drawable.app_icon); meetingSettingsHelper.setCustomizedNotificationData(customizedNotificationData, new InMeetingNotificationHandle() { public boolean handleReturnToConfNotify(Context context, Intent intent) { return false; } }); JoinMeetingOptions joinMeetingOptions = new JoinMeetingOptions(); joinMeetingOptions.no_driving_mode = true; joinMeetingOptions.no_titlebar = true; joinMeetingOptions.no_bottom_toolbar = true; joinMeetingOptions.no_invite = true; joinMeetingOptions.no_meeting_error_message = true; joinMeetingOptions.no_meeting_end_message = true; // joinMeetingOptions.no_audio = true; joinMeetingOptions.no_dial_in_via_phone = true; joinMeetingOptions.no_dial_out_to_phone = true; joinMeetingOptions.no_share = true; joinMeetingOptions.no_video = true; JoinMeetingParams joinMeetingParams = new JoinMeetingParams(); joinMeetingParams.meetingNo = AppGlobal.MeetingID; joinMeetingParams.displayName = this.DISPLAY_NAME; joinMeetingParams.password = AppGlobal.MeetingPassword; mMeetingService.joinMeetingWithParams(mContext, joinMeetingParams, joinMeetingOptions); } private void showHideViews(boolean showWelcome) { if (showWelcome) { frameVideoView.setVisibility(View.GONE); outerNameLayout.setVisibility(View.GONE); tabsLayout.setVisibility(View.GONE); tvWelcomeMessage.setVisibility(View.VISIBLE); } else { frameVideoView.setVisibility(View.VISIBLE); outerNameLayout.setVisibility(View.VISIBLE); tvWelcomeMessage.setVisibility(View.GONE); tvUserName.requestFocus(); if (loadingFirstTime) { loadingFirstTime = false; setRandom(); } } } public void random() { new Handler().postDelayed(new Runnable() { @Override public void run() { setRandom(); } }, 8000); } private void setRandom() { tvUserName.setText(AppGlobal.UserName); RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) tvUserName.getLayoutParams(); DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); params.leftMargin = new Random().nextInt(metrics.widthPixels - tvUserName.getWidth()); params.topMargin = new Random().nextInt(metrics.heightPixels - tvUserName.getHeight()); tvUserName.setLayoutParams(params); random(); } private void hideMeetingTabs(int duration) { (new Handler()).postDelayed(new Runnable() { @Override public void run() { if (tabsLayout.getVisibility() == View.VISIBLE) { Animation hideAnimation = AnimationUtils.loadAnimation(mActivity, R.anim.slide_left_out); tabsLayout.startAnimation(hideAnimation); hideAnimation.setAnimationListener(new Animation.AnimationListener() { public void onAnimationRepeat(Animation animation) { } public void onAnimationStart(Animation animation) { } public void onAnimationEnd(Animation animation) { tabsLayout.setVisibility(View.GONE); } }); } } }, duration); } @Override public void onClickCallback(final int position) { if (AppGlobal.MeetingList.get(position).MeetingID.equals(AppGlobal.MeetingID)) { Toast.makeText(mContext, "Meeting is already running", Toast.LENGTH_SHORT).show(); } else { showHideViews(true); tvWelcomeMessage.setText("Switching Meeting, Please Wait..."); mMeetingService.leaveCurrentMeeting(true); mMeetingService.removeListener(meetingServiceListener); new Handler().postDelayed(new Runnable() { @Override public void run() { AppGlobal.EventID = AppGlobal.MeetingList.get(position).EventID; AppGlobal.ScrappingID = AppGlobal.MeetingList.get(position).ScrapingID; AppGlobal.MeetingID = AppGlobal.MeetingList.get(position).MeetingID; AppGlobal.MeetingPassword = AppGlobal.MeetingList.get(position).Password; startMeeting(); } }, 3000); } } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); disableFullScreenMode(); } private void disableFullScreenMode() { getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } @Override protected void onPause() { super.onPause(); } @Override protected void onStop() { super.onStop(); if (!AppGlobal.ReceivedPhoneCall && AppGlobal.isNetworkAvailable(this)) { AppGlobal.ReceivedPhoneCall = false; if (mMeetingService.getMeetingStatus() == MeetingStatus.MEETING_STATUS_INMEETING) { AppGlobal.AppInBackground = true; AppGlobal.zoomSDK = null; mInMeetingService.leaveCurrentMeeting(true); //showLoginActivity(); } FinishActivity(); } } @Override public void onDestroy() { super.onDestroy(); } @Override protected void onStart() { super.onStart(); } @Override protected void onRestart() { super.onRestart(); } @Override public void onBackPressed() { if (mMeetingService.getMeetingStatus() == MeetingStatus.MEETING_STATUS_INMEETING || mMeetingService.getMeetingStatus() == MeetingStatus.MEETING_STATUS_CONNECTING || mMeetingService.getMeetingStatus() == MeetingStatus.MEETING_STATUS_WAITINGFORHOST) { AppGlobal.EventID = "1"; FinishActivity(); } } @Override protected void onResume() { super.onResume(); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); overridePendingTransition(0, 0); } private void FinishActivity() { if (AppGlobal.MeetingFinished) return; AppGlobal.MeetingFinished = true; AppGlobal.MatchTabClicked = true; Intent intent = new Intent(MeetingActivity.this, DashboardActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); try { mInMeetingService.leaveCurrentMeeting(true); mMeetingService.leaveCurrentMeeting(true); //AppGlobal.zoomSDK.getMeetingService().leaveCurrentMeeting(true); //AppGlobal.zoomSDK.getInMeetingService().leaveCurrentMeeting(true); } catch (Exception ex) { ex.printStackTrace(); } } }