Skip to content

Commit a7bf769

Browse files
authored
Merge pull request #22 from webex/develop
2.8.0 Release
2 parents cd84f96 + 1edb6c4 commit a7bf769

File tree

14 files changed

+253
-72
lines changed

14 files changed

+253
-72
lines changed

app/build.gradle

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ apply plugin: 'com.android.application'
22
apply plugin: 'org.greenrobot.greendao'
33

44
android {
5-
compileSdkVersion 27
6-
buildToolsVersion "28.0.3"
5+
compileSdkVersion 30
6+
buildToolsVersion "29.0.3"
77
defaultConfig {
88
applicationId "com.ciscowebex.androidsdk.kitchensink"
99
minSdkVersion 21
10-
targetSdkVersion 27
10+
targetSdkVersion 30
1111
versionCode 1
1212
versionName "1.0"
1313
testInstrumentationRunner "android.support.test.agent.AndroidJUnitRunner"
@@ -53,7 +53,7 @@ repositories {
5353
}
5454

5555
dependencies {
56-
implementation('com.ciscowebex:androidsdk:2.7.0@aar', {
56+
implementation('com.ciscowebex:androidsdk:2.8.0@aar', {
5757
transitive = true
5858
changing = true
5959
})

app/src/main/java/com/ciscowebex/androidsdk/kitchensink/actions/WebexAgent.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,4 +342,17 @@ public Phone.AudioBRNMode getAudioBNRMode() {
342342
}
343343
return null;
344344
}
345+
346+
public void setVideoStreamMode(Phone.VideoStreamMode mode) {
347+
if (phone != null) {
348+
phone.setVideoStreamMode(mode);
349+
}
350+
}
351+
352+
public Phone.VideoStreamMode getVideoStreamMode() {
353+
if (phone != null) {
354+
return phone.getVideoStreamMode();
355+
}
356+
return null;
357+
}
345358
}

app/src/main/java/com/ciscowebex/androidsdk/kitchensink/actions/commands/RequirePermissionAction.java

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,21 +46,27 @@ public RequirePermissionAction(Activity activity) {
4646

4747
@Override
4848
public void execute() {
49-
int permissionCheck = ContextCompat.checkSelfPermission(activity,
50-
Manifest.permission.READ_EXTERNAL_STORAGE);
51-
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
52-
String[] permissions = {
53-
Manifest.permission.READ_EXTERNAL_STORAGE
54-
};
55-
ActivityCompat.requestPermissions(activity, permissions, 0);
56-
} else {
57-
WebexAgentEvent.postEvent(new PermissionAcquiredEvent());
49+
String[] permissions = {
50+
Manifest.permission.READ_EXTERNAL_STORAGE,
51+
Manifest.permission.CAMERA
52+
};
53+
for (String permission : permissions) {
54+
int permissionCheck = ContextCompat.checkSelfPermission(activity, permission);
55+
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
56+
ActivityCompat.requestPermissions(activity, permissions, 0);
57+
return;
58+
}
5859
}
60+
WebexAgentEvent.postEvent(new PermissionAcquiredEvent());
5961
}
6062

6163
public static void PermissionsRequired(int requestCode, int[] grantResults) {
62-
if (requestCode == 0 && grantResults.length == 1
63-
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
64+
if (requestCode == 0) {
65+
for (int grant : grantResults) {
66+
if (grant != PackageManager.PERMISSION_GRANTED) {
67+
return;
68+
}
69+
}
6470
WebexAgentEvent.postEvent(new PermissionAcquiredEvent());
6571
}
6672
}

app/src/main/java/com/ciscowebex/androidsdk/kitchensink/launcher/LauncherActivity.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import com.ciscowebex.androidsdk.kitchensink.actions.commands.RequirePermissionAction;
3939
import com.ciscowebex.androidsdk.kitchensink.actions.events.OnCallMembershipEvent;
4040
import com.ciscowebex.androidsdk.kitchensink.actions.events.OnMediaChangeEvent;
41+
import com.ciscowebex.androidsdk.kitchensink.launcher.fragments.CallFragment;
4142
import com.ciscowebex.androidsdk.kitchensink.launcher.fragments.LauncherFragment;
4243
import com.ciscowebex.androidsdk.kitchensink.ui.BaseFragment;
4344
import com.ciscowebex.androidsdk.phone.CallObserver;
@@ -123,7 +124,7 @@ public void onEventMainThread(OnMediaChangeEvent event) {
123124
@Subscribe(threadMode = ThreadMode.MAIN)
124125
public void onEventMainThread(OnCallMembershipEvent event) {
125126
if (event.callEvent instanceof CallObserver.MembershipSendingSharingEvent) {
126-
Ln.d("Activity CallMembership email: " + event.callEvent.getCallMembership().getEmail() +
127+
Ln.d("Activity CallMembership displayName: " + event.callEvent.getCallMembership().getDisplayName() +
127128
" isSendingSharing: " + event.callEvent.getCallMembership().isSendingSharing());
128129
}
129130
}

app/src/main/java/com/ciscowebex/androidsdk/kitchensink/launcher/fragments/CallFragment.java

Lines changed: 47 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@
2626

2727
import android.app.AlertDialog;
2828
import android.app.AppOpsManager;
29+
import android.app.Notification;
30+
import android.app.NotificationChannel;
2931
import android.app.NotificationManager;
3032
import android.app.PendingIntent;
3133
import android.app.PictureInPictureParams;
32-
import android.bluetooth.BluetoothDevice;
33-
import android.content.BroadcastReceiver;
3434
import android.content.ComponentName;
3535
import android.content.Context;
3636
import android.content.Intent;
@@ -275,8 +275,7 @@ public void onLetInClick(ParticipantsAdapter.CallMembershipEntity entity) {
275275
setViewAndChildrenEnabled(layout, false);
276276
((SurfaceView) localView).setZOrderMediaOverlay(true);
277277
((SurfaceView) screenShare).setZOrderMediaOverlay(true);
278-
//requirePermission();
279-
makeCall();
278+
requirePermission();
280279
}
281280
}
282281

@@ -320,6 +319,12 @@ private void requirePermission() {
320319
new RequirePermissionAction(getActivity()).execute();
321320
}
322321

322+
@SuppressWarnings("unused")
323+
@Subscribe(threadMode = ThreadMode.MAIN)
324+
public void onEventMainThread(PermissionAcquiredEvent event) {
325+
makeCall();
326+
}
327+
323328
@Override
324329
public void onStop() {
325330
super.onStop();
@@ -391,14 +396,28 @@ public void onSwitchCallAbility(Switch s) {
391396
agent.receiveAudio(s.isChecked());
392397
break;
393398
case R.id.switchShareContent:
394-
if (s.isChecked())
395-
agent.getActiveCall().startSharing(r -> {
399+
if (s.isChecked()) {
400+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
401+
NotificationChannel mChannel = new NotificationChannel("screen_share_notification_channel", "screen_share_notification_channel", NotificationManager.IMPORTANCE_HIGH);
402+
NotificationManager notifyManager = (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);
403+
notifyManager.createNotificationChannel(mChannel);
404+
}
405+
Notification notification = new NotificationCompat.Builder(getActivity(), "screen_share_notification_channel")
406+
.setSmallIcon(R.mipmap.ic_launcher)
407+
.setContentTitle("Cisco Kitchensink")
408+
.setContentText("Sharing screen to others")
409+
.setTicker("Screen Sharing")
410+
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
411+
.setDefaults(Notification.DEFAULT_SOUND)
412+
.build();
413+
414+
agent.getActiveCall().startSharing(notification, 0xabcde, r -> {
396415
Ln.d("startSharing result: " + r);
397416
if (!r.isSuccessful()) {
398417
switchShareContent.setChecked(false);
399418
}
400419
});
401-
else
420+
} else
402421
agent.getActiveCall().stopSharing(r -> {
403422
Ln.d("stopSharing result: " + r);
404423
});
@@ -530,7 +549,7 @@ private void makeCall() {
530549
agent.answer(localView, remoteView, screenShare, false, null);
531550
return;
532551
}
533-
552+
agent.startPreview(localView);
534553
agent.dial(callee, localView, remoteView, screenShare, false, null);
535554
new AddCallHistoryAction(callee, "out").execute();
536555
setButtonsEnable(true);
@@ -682,9 +701,9 @@ private void updateParticipants() {
682701
Ln.d("updateParticipants: " + callMemberships.size());
683702
for (CallMembership membership : callMemberships) {
684703
String personId = membership.getPersonId();
685-
if (/*membership.getState() != CallMembership.State.JOINED || */personId == null || personId.isEmpty() || membership.getEmail() == null || membership.getEmail().isEmpty())
704+
if (/*membership.getState() != CallMembership.State.JOINED || */personId == null || personId.isEmpty() || membership.getDisplayName() == null || membership.getDisplayName().isEmpty())
686705
continue;
687-
participantsAdapter.addOrUpdateItem(new ParticipantsAdapter.CallMembershipEntity(personId, membership.getEmail(), "", membership.isSendingAudio(), membership.isSendingVideo(), membership.getState()));
706+
participantsAdapter.addOrUpdateItem(new ParticipantsAdapter.CallMembershipEntity(personId, membership.getDisplayName(), "", membership.isSendingAudio(), membership.isSendingVideo(), membership.getState()));
688707
agent.getWebex().people().get(personId, r -> {
689708
if (r == null || !r.isSuccessful() || r.getData() == null) return;
690709
mIdPersonMap.put(personId, r.getData());
@@ -699,7 +718,7 @@ private void updatePersonInfoForParticipants(String personId, Person person) {
699718
}
700719

701720
private void updatePersonInfoForActiveSpeaker(String personId, Person person) {
702-
if (participantsAdapter.getActiveSpeaker() == null || personId == null || person == null || !participantsAdapter.getActiveSpeaker().equals(personId))
721+
if (participantsAdapter.getActiveSpeaker() == null || person == null || !participantsAdapter.getActiveSpeaker().equals(personId))
703722
return;
704723
String avatar = person.getAvatar();
705724
if (avatar == null || avatar.isEmpty()) {
@@ -744,13 +763,22 @@ public void onEventMainThread(OnDisconnectEvent event) {
744763
@SuppressWarnings("unused")
745764
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
746765
public void onEventMainThread(OnMediaChangeEvent event) {
747-
if (event.callEvent instanceof RemoteSendingSharingEvent) {
766+
if (event.callEvent instanceof CallObserver.RemoteSendingVideoEvent) {
767+
Ln.d("RemoteSendingVideoEvent: " + ((CallObserver.RemoteSendingVideoEvent) event.callEvent).isSending());
768+
} else if (event.callEvent instanceof RemoteSendingSharingEvent) {
748769
Ln.d("RemoteSendingSharingEvent: " + ((RemoteSendingSharingEvent) event.callEvent).isSending());
770+
if (((RemoteSendingSharingEvent) event.callEvent).isSending()) {
771+
event.callEvent.getCall().setVideoRenderViews(new Pair<>(localView, screenShare));
772+
event.callEvent.getCall().setSharingRenderView(remoteView);
773+
} else {
774+
event.callEvent.getCall().setSharingRenderView(null);
775+
event.callEvent.getCall().setVideoRenderViews(new Pair<>(localView, remoteView));
776+
}
749777
updateScreenShareView();
750778
} else if (event.callEvent instanceof SendingSharingEvent) {
751779
Ln.d("SendingSharingEvent: " + ((SendingSharingEvent) event.callEvent).isSending());
752780
if (((SendingSharingEvent) event.callEvent).isSending()) {
753-
sendNotification();
781+
// sendNotification();
754782
backToHome();
755783
}
756784
} else if (event.callEvent instanceof CallObserver.ActiveSpeakerChangedEvent) {
@@ -859,7 +887,7 @@ public void onEventMainThread(OnAuxStreamEvent event) {
859887
Person person = mIdPersonMap.get(personId);
860888
auxStreamViewHolder.viewAvatar.setVisibility(membership.isSendingVideo() ? View.GONE : View.VISIBLE);
861889
if (person == null) {
862-
auxStreamViewHolder.textView.setText(membership.getEmail());
890+
auxStreamViewHolder.textView.setText(membership.getDisplayName());
863891
auxStreamViewHolder.viewAvatar.setImageResource(R.drawable.google_contacts_android);
864892
agent.getWebex().people().get(personId, r -> {
865893
if (!r.isSuccessful() || r.getData() == null) return;
@@ -890,9 +918,9 @@ public void onEventMainThread(OnCallMembershipEvent event) {
890918
String personId = membership.getPersonId();
891919
if (event.callEvent instanceof CallObserver.MembershipJoinedEvent) {
892920
Ln.d("MembershipJoinedEvent: ");
893-
if (membership.getState() != CallMembership.State.JOINED || personId == null || personId.isEmpty() || membership.getEmail() == null || membership.getEmail().isEmpty())
921+
if (membership.getState() != CallMembership.State.JOINED || personId == null || personId.isEmpty() || membership.getDisplayName() == null || membership.getDisplayName().isEmpty())
894922
return;
895-
participantsAdapter.addOrUpdateItem(new ParticipantsAdapter.CallMembershipEntity(personId, membership.getEmail(), "", membership.isSendingAudio(), membership.isSendingVideo(), membership.getState()));
923+
participantsAdapter.addOrUpdateItem(new ParticipantsAdapter.CallMembershipEntity(personId, membership.getDisplayName(), "", membership.isSendingAudio(), membership.isSendingVideo(), membership.getState()));
896924
agent.getWebex().people().get(personId, r -> {
897925
if (r == null || !r.isSuccessful() || r.getData() == null) return;
898926
updatePersonInfoForParticipants(personId, r.getData());
@@ -932,9 +960,9 @@ public void onEventMainThread(OnCallMembershipEvent event) {
932960
}
933961
} else if (event.callEvent instanceof CallObserver.MembershipWaitingEvent) {
934962
Ln.d("MembershipJoinedLobbyEvent: ");
935-
if (membership.getState() != CallMembership.State.WAITING || personId == null || personId.isEmpty() || membership.getEmail() == null || membership.getEmail().isEmpty())
963+
if (membership.getState() != CallMembership.State.WAITING || personId == null || personId.isEmpty() || membership.getDisplayName() == null || membership.getDisplayName().isEmpty())
936964
return;
937-
participantsAdapter.addOrUpdateItem(new ParticipantsAdapter.CallMembershipEntity(personId, membership.getEmail(), "", membership.isSendingAudio(), membership.isSendingVideo(), membership.getState()));
965+
participantsAdapter.addOrUpdateItem(new ParticipantsAdapter.CallMembershipEntity(personId, membership.getDisplayName(), "", membership.isSendingAudio(), membership.isSendingVideo(), membership.getState()));
938966
agent.getWebex().people().get(personId, r -> {
939967
if (r == null || !r.isSuccessful() || r.getData() == null) return;
940968
Ln.d("people: " + r.getData());
@@ -944,18 +972,12 @@ public void onEventMainThread(OnCallMembershipEvent event) {
944972
Ln.d("MembershipAudioMutedControlledEvent: ");
945973
Ln.d(membership.getPersonId() + (membership.isAudioMutedControlled() ? " muted by " : " unmuted by ") + membership.audioModifiedBy());
946974
if (membership.audioModifiedBy() != null) {
947-
String text = membership.getEmail() + (membership.isAudioMutedControlled() ? " muted" : " unmuted") + " by others";
975+
String text = membership.getDisplayName() + (membership.isAudioMutedControlled() ? " muted" : " unmuted") + " by others";
948976
toast(text);
949977
}
950978
}
951979
}
952980

953-
@SuppressWarnings("unused")
954-
@Subscribe(threadMode = ThreadMode.MAIN)
955-
public void onEventMainThread(PermissionAcquiredEvent event) {
956-
makeCall();
957-
}
958-
959981
private void backToHome() {
960982
Intent intent = new Intent(Intent.ACTION_MAIN);
961983
intent.addCategory(Intent.CATEGORY_HOME);

0 commit comments

Comments
 (0)