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();
}
}