Skip to content

Commit 225ebf8

Browse files
committed
4.4.0-conference-java
1 parent 9178794 commit 225ebf8

18 files changed

+558
-338
lines changed

sample-conference-java/app/build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ android {
3434
applicationId "com.quickblox.sample.videochat.conference.java"
3535
minSdkVersion 16
3636
targetSdkVersion 29
37-
versionCode 433000
38-
versionName '4.3.3-java'
37+
versionCode 440000
38+
versionName '4.4.0'
3939
multiDexEnabled true
4040
}
4141

sample-conference-java/app/src/main/java/com/quickblox/sample/videochat/conference/java/App.java

+3-7
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import com.crashlytics.android.Crashlytics;
77
import com.quickblox.auth.session.QBSettings;
88
import com.quickblox.conference.ConferenceConfig;
9-
import com.quickblox.core.ServiceZone;
109
import com.quickblox.sample.videochat.conference.java.managers.ActivityLifecycle;
1110
import com.quickblox.sample.videochat.conference.java.managers.BackgroundListener;
1211
import com.quickblox.sample.videochat.conference.java.managers.ChatHelper;
@@ -43,10 +42,7 @@ public class App extends Application {
4342
private static final String AUTH_KEY = "";
4443
private static final String AUTH_SECRET = "";
4544
private static final String ACCOUNT_KEY = "";
46-
47-
private static final String JANUS_SERVER_URL = "";
48-
49-
// TODO Firebase keys in - google-services.json
45+
private static final String SERVER_URL = "";
5046

5147
public static final String USER_DEFAULT_PASSWORD = "quickblox";
5248

@@ -145,8 +141,8 @@ private void initCredentials() {
145141
}
146142

147143
private void initConferenceConfig() {
148-
if (!TextUtils.isEmpty(JANUS_SERVER_URL)) {
149-
ConferenceConfig.setUrl(JANUS_SERVER_URL);
144+
if (!TextUtils.isEmpty(SERVER_URL)) {
145+
ConferenceConfig.setUrl(SERVER_URL);
150146
} else {
151147
throw new AssertionError(getString(R.string.error_server_url_null));
152148
}

sample-conference-java/app/src/main/java/com/quickblox/sample/videochat/conference/java/activities/BaseActivity.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
import android.view.MenuItem;
1212
import android.view.View;
1313

14+
import androidx.annotation.Nullable;
15+
import androidx.annotation.StringRes;
16+
import androidx.appcompat.app.AppCompatActivity;
17+
1418
import com.google.android.material.snackbar.Snackbar;
1519
import com.quickblox.chat.QBChatService;
1620
import com.quickblox.core.QBEntityCallback;
@@ -26,10 +30,6 @@
2630
import com.quickblox.users.QBUsers;
2731
import com.quickblox.users.model.QBUser;
2832

29-
import androidx.annotation.Nullable;
30-
import androidx.annotation.StringRes;
31-
import androidx.appcompat.app.AppCompatActivity;
32-
3333

3434
public abstract class BaseActivity extends AppCompatActivity {
3535
private static final String TAG = BaseActivity.class.getSimpleName();
@@ -131,6 +131,7 @@ protected void hideProgressDialog() {
131131
if (progressDialog != null && progressDialog.isShowing()) {
132132
try {
133133
progressDialog.dismiss();
134+
progressDialog = null;
134135
} catch (IllegalArgumentException e) {
135136
e.printStackTrace();
136137
}

sample-conference-java/app/src/main/java/com/quickblox/sample/videochat/conference/java/activities/CallActivity.java

+114-35
Original file line numberDiff line numberDiff line change
@@ -11,26 +11,28 @@
1111
import android.os.IBinder;
1212
import android.preference.PreferenceManager;
1313
import android.util.Log;
14+
import android.view.View;
1415
import android.view.Window;
16+
import android.widget.LinearLayout;
17+
18+
import androidx.annotation.Nullable;
19+
import androidx.core.content.ContextCompat;
1520

1621
import com.quickblox.conference.ConferenceSession;
1722
import com.quickblox.conference.WsException;
1823
import com.quickblox.conference.WsHangUpException;
1924
import com.quickblox.conference.WsNoResponseException;
2025
import com.quickblox.conference.callbacks.ConferenceSessionCallbacks;
21-
import com.quickblox.core.QBEntityCallback;
22-
import com.quickblox.core.exception.QBResponseException;
2326
import com.quickblox.sample.videochat.conference.java.R;
2427
import com.quickblox.sample.videochat.conference.java.fragments.ConversationFragment;
2528
import com.quickblox.sample.videochat.conference.java.fragments.ConversationFragmentCallback;
29+
import com.quickblox.sample.videochat.conference.java.fragments.ReconnectionCallback;
2630
import com.quickblox.sample.videochat.conference.java.fragments.ScreenShareFragment;
2731
import com.quickblox.sample.videochat.conference.java.managers.WebRtcSessionManager;
2832
import com.quickblox.sample.videochat.conference.java.services.CallService;
2933
import com.quickblox.sample.videochat.conference.java.utils.Consts;
3034
import com.quickblox.sample.videochat.conference.java.utils.SettingsUtils;
3135
import com.quickblox.sample.videochat.conference.java.utils.ToastUtils;
32-
import com.quickblox.users.QBUsers;
33-
import com.quickblox.users.model.QBUser;
3436
import com.quickblox.videochat.webrtc.BaseSession;
3537
import com.quickblox.videochat.webrtc.QBRTCScreenCapturer;
3638
import com.quickblox.videochat.webrtc.callbacks.QBRTCSessionStateCallback;
@@ -41,11 +43,9 @@
4143
import java.io.Serializable;
4244
import java.util.ArrayList;
4345
import java.util.HashMap;
46+
import java.util.HashSet;
4447
import java.util.List;
45-
46-
import androidx.annotation.Nullable;
47-
import androidx.core.content.ContextCompat;
48-
import androidx.fragment.app.Fragment;
48+
import java.util.Set;
4949

5050
public class CallActivity extends BaseActivity implements QBRTCSessionStateCallback<ConferenceSession>, ConferenceSessionCallbacks,
5151
ConversationFragmentCallback, ScreenShareFragment.OnSharingEvents {
@@ -65,6 +65,9 @@ public class CallActivity extends BaseActivity implements QBRTCSessionStateCallb
6565
private ArrayList<CallService.CurrentCallStateCallback> currentCallStateCallbackList = new ArrayList<>();
6666
private volatile boolean connectedToJanus;
6767
private CallService callService;
68+
private final Set<ReconnectionCallback> reconnectionCallbacks = new HashSet<>();
69+
private final ReconnectionListenerImpl reconnectionListener = new ReconnectionListenerImpl(TAG);
70+
private LinearLayout reconnectingLayout;
6871

6972
public static void start(Context context, String roomID, String roomTitle, String dialogID,
7073
List<Integer> occupants, boolean listenerRole) {
@@ -84,6 +87,16 @@ public static void start(Context context) {
8487
context.startActivity(intent);
8588
}
8689

90+
@Override
91+
public void addReconnectionCallback(ReconnectionCallback reconnectionCallback) {
92+
reconnectionCallbacks.add(reconnectionCallback);
93+
}
94+
95+
@Override
96+
public void removeReconnectionCallback(ReconnectionCallback reconnectionCallback) {
97+
reconnectionCallbacks.remove(reconnectionCallback);
98+
}
99+
87100
@Override
88101
protected void onCreate(Bundle savedInstanceState) {
89102
super.onCreate(savedInstanceState);
@@ -95,6 +108,8 @@ protected void onCreate(Bundle savedInstanceState) {
95108
PreferenceManager.setDefaultValues(this, R.xml.preferences_video, false);
96109
PreferenceManager.setDefaultValues(this, R.xml.preferences_audio, false);
97110

111+
reconnectingLayout = findViewById(R.id.llReconnecting);
112+
98113
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
99114
Window w = getWindow();
100115
w.setStatusBarColor(ContextCompat.getColor(this, R.color.color_new_blue));
@@ -116,8 +131,12 @@ private void initScreen() {
116131
currentSession = sessionManager.getCurrentSession();
117132
initListeners(currentSession);
118133

119-
if (callService.isSharingScreenState()) {
120-
startScreenSharing(null);
134+
if (callService != null && callService.isSharingScreenState()) {
135+
if (callService.getReconnectionState() == CallService.ReconnectionState.COMPLETED) {
136+
QBRTCScreenCapturer.requestPermissions(this);
137+
} else {
138+
startScreenSharing(null);
139+
}
121140
} else {
122141
startConversationFragment();
123142
}
@@ -128,6 +147,27 @@ protected void onResume() {
128147
super.onResume();
129148
settingsSharedPref = PreferenceManager.getDefaultSharedPreferences(this);
130149
bindCallService();
150+
if (callService != null) {
151+
switch (callService.getReconnectionState()) {
152+
case COMPLETED:
153+
reconnectingLayout.setVisibility(View.GONE);
154+
for (ReconnectionCallback reconnectionCallback : reconnectionCallbacks) {
155+
reconnectionCallback.completed();
156+
}
157+
break;
158+
case IN_PROGRESS:
159+
reconnectingLayout.setVisibility(View.VISIBLE);
160+
for (ReconnectionCallback reconnectionCallback : reconnectionCallbacks) {
161+
reconnectionCallback.inProgress();
162+
}
163+
break;
164+
case FAILED:
165+
ToastUtils.shortToast(getApplicationContext(), R.string.reconnection_failed);
166+
callService.leaveCurrentSession();
167+
finish();
168+
break;
169+
}
170+
}
131171
}
132172

133173
@Override
@@ -137,6 +177,8 @@ protected void onPause() {
137177
unbindService(callServiceConnection);
138178
callServiceConnection = null;
139179
}
180+
181+
callService.unsubscribeReconnectionListener(reconnectionListener);
140182
removeListeners();
141183
}
142184

@@ -161,6 +203,7 @@ private void bindCallService() {
161203

162204
private void leaveCurrentSession() {
163205
callService.leaveCurrentSession();
206+
finish();
164207
}
165208

166209
private void initListeners(ConferenceSession session) {
@@ -324,23 +367,23 @@ protected void onActivityResult(int requestCode, int resultCode, @Nullable Inten
324367
&& resultCode == Activity.RESULT_OK && data != null) {
325368
startScreenSharing(data);
326369
Log.i(TAG, "Starting Screen Capture");
370+
} else if (requestCode == QBRTCScreenCapturer.REQUEST_MEDIA_PROJECTION && resultCode == Activity.RESULT_CANCELED) {
371+
callService.stopScreenSharing();
372+
startConversationFragment();
327373
}
328374
if (requestCode == REQUEST_CODE_OPEN_CONVERSATION_CHAT) {
329375
Log.d(TAG, "Returning back from ChatActivity");
330376
}
331377
}
332378

333379
private void startScreenSharing(final Intent data) {
334-
Fragment fragmentByTag = getSupportFragmentManager().findFragmentByTag(ScreenShareFragment.class.getSimpleName());
335-
if (!(fragmentByTag instanceof ScreenShareFragment)) {
336-
ScreenShareFragment screenShareFragment = ScreenShareFragment.newInstance();
337-
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
338-
screenShareFragment, ScreenShareFragment.class.getSimpleName())
339-
.commitAllowingStateLoss();
340-
341-
callService.setVideoEnabled(true);
342-
callService.startScreenSharing(data);
343-
}
380+
ScreenShareFragment screenShareFragment = ScreenShareFragment.newInstance();
381+
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
382+
screenShareFragment, ScreenShareFragment.class.getSimpleName())
383+
.commitAllowingStateLoss();
384+
385+
callService.setVideoEnabled(true);
386+
callService.startScreenSharing(data);
344387
}
345388

346389
@Override
@@ -408,9 +451,6 @@ public void onError(WsException exception) {
408451
@Override
409452
public void onSessionClosed(final ConferenceSession session) {
410453
Log.d(TAG, "Session " + session.getSessionID() + " start stop session");
411-
if (session.equals(currentSession)) {
412-
finish();
413-
}
414454
}
415455

416456
private class CallServiceConnection implements ServiceConnection {
@@ -425,27 +465,66 @@ public void onServiceConnected(ComponentName name, IBinder service) {
425465
callService = binder.getService();
426466
if (callService.currentSessionExist()) {
427467
currentDialogID = callService.getDialogID();
428-
login();
468+
if (callService.getReconnectionState() != CallService.ReconnectionState.IN_PROGRESS){
469+
initScreen();
470+
}
429471
} else {
430472
//we have already currentSession == null, so it's no reason to do further initialization
431473
CallService.stop(CallActivity.this);
432474
finish();
433475
}
476+
callService.subscribeReconnectionListener(reconnectionListener);
434477
}
478+
}
435479

436-
private void login() {
437-
QBUser qbUser = getSharedPrefsHelper().getQbUser();
438-
QBUsers.signIn(qbUser).performAsync(new QBEntityCallback<QBUser>() {
439-
@Override
440-
public void onSuccess(QBUser qbUser, Bundle bundle) {
441-
initScreen();
442-
}
480+
private class ReconnectionListenerImpl implements CallService.ReconnectionListener {
481+
private final String tag;
443482

444-
@Override
445-
public void onError(QBResponseException e) {
483+
ReconnectionListenerImpl(String tag) {
484+
this.tag = tag;
485+
}
486+
487+
@Override
488+
public void onChangedState(CallService.ReconnectionState reconnectionState) {
489+
switch (reconnectionState) {
490+
case COMPLETED:
491+
reconnectingLayout.setVisibility(View.GONE);
492+
for (ReconnectionCallback reconnectionCallback : reconnectionCallbacks) {
493+
reconnectionCallback.completed();
494+
}
495+
initScreen();
496+
callService.setReconnectionState(CallService.ReconnectionState.DEFAULT);
497+
break;
498+
case IN_PROGRESS:
499+
reconnectingLayout.setVisibility(View.VISIBLE);
500+
for (ReconnectionCallback reconnectionCallback : reconnectionCallbacks) {
501+
reconnectionCallback.inProgress();
502+
}
503+
break;
504+
case FAILED:
505+
ToastUtils.shortToast(getApplicationContext(), R.string.reconnection_failed);
506+
callService.leaveCurrentSession();
446507
finish();
447-
}
448-
});
508+
break;
509+
}
510+
}
511+
512+
@Override
513+
public int hashCode() {
514+
int hash = 3;
515+
hash = 53 * hash + tag.hashCode();
516+
return hash;
517+
}
518+
519+
@Override
520+
public boolean equals(Object obj) {
521+
boolean equals;
522+
if (obj instanceof ReconnectionListenerImpl) {
523+
equals = TAG.equals(((ReconnectionListenerImpl) obj).tag);
524+
} else {
525+
equals = super.equals(obj);
526+
}
527+
return equals;
449528
}
450529
}
451530
}

0 commit comments

Comments
 (0)