package com.quickblox.sample.groupchatwebrtc.activities; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ListView; import com.crashlytics.android.Crashlytics; import com.quickblox.chat.QBChatService; import com.quickblox.core.QBEntityCallback; import com.quickblox.core.exception.QBResponseException; import com.quickblox.messages.services.SubscribeService; import com.quickblox.sample.core.utils.SharedPrefsHelper; import com.quickblox.sample.core.utils.Toaster; import com.quickblox.sample.core.utils.configs.CoreConfigUtils; import com.quickblox.sample.groupchatwebrtc.R; import com.quickblox.sample.groupchatwebrtc.adapters.OpponentsAdapter; import com.quickblox.sample.groupchatwebrtc.db.QbUsersDbManager; import com.quickblox.sample.groupchatwebrtc.services.CallService; import com.quickblox.sample.groupchatwebrtc.utils.CollectionsUtils; import com.quickblox.sample.groupchatwebrtc.utils.Consts; import com.quickblox.sample.groupchatwebrtc.utils.PermissionsChecker; import com.quickblox.sample.groupchatwebrtc.utils.PushNotificationSender; import com.quickblox.sample.groupchatwebrtc.utils.UsersUtils; import com.quickblox.sample.groupchatwebrtc.utils.WebRtcSessionManager; import com.quickblox.users.model.QBUser; import com.quickblox.videochat.webrtc.QBRTCClient; import com.quickblox.videochat.webrtc.QBRTCSession; import com.quickblox.videochat.webrtc.QBRTCTypes; import java.util.ArrayList; import java.util.concurrent.TimeUnit; import io.fabric.sdk.android.Fabric; /** * QuickBlox team */ public class OpponentsActivity extends BaseActivity { private static final String TAG = OpponentsActivity.class.getSimpleName(); private static final long ON_ITEM_CLICK_DELAY = TimeUnit.SECONDS.toMillis(10); private OpponentsAdapter opponentsAdapter; private ListView opponentsListView; private QBUser currentUser; private ArrayList<QBUser> currentOpponentsList; private QbUsersDbManager dbManager; private boolean isRunForCall; private WebRtcSessionManager webRtcSessionManager; private PermissionsChecker checker; public static void start(Context context, boolean isRunForCall) { Intent intent = new Intent(context, OpponentsActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); intent.putExtra(Consts.EXTRA_IS_STARTED_FOR_CALL, isRunForCall); context.startActivity(intent); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Fabric.with(this, new Crashlytics()); setContentView(R.layout.activity_opponents); initFields(); initDefaultActionBar(); initUi(); startLoadUsers(); if (isRunForCall && webRtcSessionManager.getCurrentSession() != null) { CallActivity.start(OpponentsActivity.this, true); } checker = new PermissionsChecker(getApplicationContext()); } @Override protected void onResume() { super.onResume(); initUsersList(); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (intent.getExtras() != null) { isRunForCall = intent.getExtras().getBoolean(Consts.EXTRA_IS_STARTED_FOR_CALL); if (isRunForCall && webRtcSessionManager.getCurrentSession() != null) { CallActivity.start(OpponentsActivity.this, true); } } } @Override protected View getSnackbarAnchorView() { return findViewById(R.id.list_opponents); } private void startPermissionsActivity(boolean checkOnlyAudio) { PermissionsActivity.startActivity(this, checkOnlyAudio, Consts.PERMISSIONS); } private void initFields() { Bundle extras = getIntent().getExtras(); if (extras != null) { isRunForCall = extras.getBoolean(Consts.EXTRA_IS_STARTED_FOR_CALL); } currentUser = sharedPrefsHelper.getQbUser(); dbManager = QbUsersDbManager.getInstance(getApplicationContext()); webRtcSessionManager = WebRtcSessionManager.getInstance(getApplicationContext()); } private void startLoadUsers() { showProgressDialog(R.string.dlg_loading_opponents); String currentRoomName = SharedPrefsHelper.getInstance().get(Consts.PREF_CURREN_ROOM_NAME); requestExecutor.loadUsersByTag(currentRoomName, new QBEntityCallback<ArrayList<QBUser>>() { @Override public void onSuccess(ArrayList<QBUser> result, Bundle params) { hideProgressDialog(); dbManager.saveAllUsers(result, true); initUsersList(); } @Override public void onError(QBResponseException responseException) { hideProgressDialog(); showErrorSnackbar(R.string.loading_users_error, responseException, new View.OnClickListener() { @Override public void onClick(View v) { startLoadUsers(); } }); } }); } private void initUi() { opponentsListView = (ListView) findViewById(R.id.list_opponents); } private boolean isCurrentOpponentsListActual(ArrayList<QBUser> actualCurrentOpponentsList) { boolean equalActual = actualCurrentOpponentsList.retainAll(currentOpponentsList); boolean equalCurrent = currentOpponentsList.retainAll(actualCurrentOpponentsList); return !equalActual && !equalCurrent; } private void initUsersList() { // checking whether currentOpponentsList is actual, if yes - return if (currentOpponentsList != null) { ArrayList<QBUser> actualCurrentOpponentsList = dbManager.getAllUsers(); actualCurrentOpponentsList.remove(sharedPrefsHelper.getQbUser()); if (isCurrentOpponentsListActual(actualCurrentOpponentsList)) { return; } } proceedInitUsersList(); } private void proceedInitUsersList() { currentOpponentsList = dbManager.getAllUsers(); Log.d(TAG, "proceedInitUsersList currentOpponentsList= " + currentOpponentsList); currentOpponentsList.remove(sharedPrefsHelper.getQbUser()); opponentsAdapter = new OpponentsAdapter(this, currentOpponentsList); opponentsAdapter.setSelectedItemsCountsChangedListener(new OpponentsAdapter.SelectedItemsCountsChangedListener() { @Override public void onCountSelectedItemsChanged(int count) { updateActionBar(count); } }); opponentsListView.setAdapter(opponentsAdapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { if (opponentsAdapter != null && !opponentsAdapter.getSelectedItems().isEmpty()) { getMenuInflater().inflate(R.menu.activity_selected_opponents, menu); } else { getMenuInflater().inflate(R.menu.activity_opponents, menu); } return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { case R.id.update_opponents_list: startLoadUsers(); return true; case R.id.settings: showSettings(); return true; case R.id.log_out: logOut(); return true; case R.id.start_video_call: if (isLoggedInChat()) { startCall(true); } if (checker.lacksPermissions(Consts.PERMISSIONS)) { startPermissionsActivity(false); } return true; case R.id.start_audio_call: if (isLoggedInChat()) { startCall(false); } if (checker.lacksPermissions(Consts.PERMISSIONS[1])) { startPermissionsActivity(true); } return true; default: return super.onOptionsItemSelected(item); } } private boolean isLoggedInChat() { if (!QBChatService.getInstance().isLoggedIn()) { Toaster.shortToast(R.string.dlg_signal_error); tryReLoginToChat(); return false; } return true; } private void tryReLoginToChat() { if (sharedPrefsHelper.hasQbUser()) { QBUser qbUser = sharedPrefsHelper.getQbUser(); CallService.start(this, qbUser); } } private void showSettings() { SettingsActivity.start(this); } private void startCall(boolean isVideoCall) { if (opponentsAdapter.getSelectedItems().size() > Consts.MAX_OPPONENTS_COUNT) { Toaster.longToast(String.format(getString(R.string.error_max_opponents_count), Consts.MAX_OPPONENTS_COUNT)); return; } Log.d(TAG, "startCall()"); ArrayList<Integer> opponentsList = CollectionsUtils.getIdsSelectedOpponents(opponentsAdapter.getSelectedItems()); QBRTCTypes.QBConferenceType conferenceType = isVideoCall ? QBRTCTypes.QBConferenceType.QB_CONFERENCE_TYPE_VIDEO : QBRTCTypes.QBConferenceType.QB_CONFERENCE_TYPE_AUDIO; QBRTCClient qbrtcClient = QBRTCClient.getInstance(getApplicationContext()); QBRTCSession newQbRtcSession = qbrtcClient.createNewSessionWithOpponents(opponentsList, conferenceType); WebRtcSessionManager.getInstance(this).setCurrentSession(newQbRtcSession); PushNotificationSender.sendPushMessage(opponentsList, currentUser.getFullName()); CallActivity.start(this, false); Log.d(TAG, "conferenceType = " + conferenceType); } private void initActionBarWithSelectedUsers(int countSelectedUsers) { setActionBarTitle(String.format(getString( countSelectedUsers > 1 ? R.string.tile_many_users_selected : R.string.title_one_user_selected), countSelectedUsers)); } private void updateActionBar(int countSelectedUsers) { if (countSelectedUsers < 1) { initDefaultActionBar(); } else { removeActionbarSubTitle(); initActionBarWithSelectedUsers(countSelectedUsers); } invalidateOptionsMenu(); } private void logOut() { unsubscribeFromPushes(); startLogoutCommand(); removeAllUserData(); startLoginActivity(); } private void startLogoutCommand() { CallService.logout(this); } private void unsubscribeFromPushes() { SubscribeService.unSubscribeFromPushes(this); } private void removeAllUserData() { UsersUtils.removeUserData(getApplicationContext()); requestExecutor.deleteCurrentUser(currentUser.getId(), new QBEntityCallback<Void>() { @Override public void onSuccess(Void aVoid, Bundle bundle) { Log.d(TAG, "Current user was deleted from QB"); } @Override public void onError(QBResponseException e) { Log.e(TAG, "Current user wasn't deleted from QB " + e); } }); } private void startLoginActivity() { LoginActivity.start(this); finish(); } }