Update collapsed toolbar state for group calling.

This commit is contained in:
Alex Hart
2023-04-04 14:39:11 -03:00
parent 89a3c62637
commit d3daaff6a4
5 changed files with 115 additions and 168 deletions

View File

@@ -851,11 +851,6 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan
}
}
@Override
public void onShowParticipantsList() {
CallParticipantsListDialog.show(getSupportFragmentManager());
}
@Override
public void onPageChanged(@NonNull CallParticipantsState.SelectedPage page) {
viewModel.setIsViewingFocusedParticipant(page);
@@ -877,6 +872,16 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan
callStateUpdatePopupWindow.onCallStateUpdate(CallStateUpdatePopupWindow.CallStateUpdate.RINGING_DISABLED);
}
}
@Override
public void onCallInfoClicked() {
CallParticipantsListDialog.show(getSupportFragmentManager());
}
@Override
public void onNavigateUpClicked() {
onBackPressed();
}
}
private class WindowLayoutInfoConsumer implements Consumer<WindowLayoutInfo> {

View File

@@ -18,7 +18,9 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.annotation.StringRes;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.appcompat.widget.Toolbar;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.ConstraintSet;
import androidx.constraintlayout.widget.Guideline;
@@ -105,7 +107,7 @@ public class WebRtcCallView extends ConstraintLayout {
private View startCallControls;
private ViewPager2 callParticipantsPager;
private RecyclerView callParticipantsRecycler;
private ConstraintLayout toolbar;
private ConstraintLayout largeHeader;
private MaterialButton startCall;
private Stub<FrameLayout> groupCallSpeakerHint;
private Stub<View> groupCallFullStub;
@@ -115,15 +117,13 @@ public class WebRtcCallView extends ConstraintLayout {
private Guideline showParticipantsGuideline;
private Guideline topFoldGuideline;
private Guideline callScreenTopFoldGuideline;
private View foldParticipantCountWrapper;
private TextView foldParticipantCount;
private AvatarImageView largeHeaderAvatar;
private ConstraintSet largeHeaderConstraints;
private ConstraintSet smallHeaderConstraints;
private Guideline statusBarGuideline;
private Guideline navigationBarGuideline;
private int navBarBottomInset;
private View fullScreenShade;
private Toolbar collapsedToolbar;
private Toolbar headerToolbar;
private WebRtcCallParticipantsPagerAdapter pagerAdapter;
private WebRtcCallParticipantsRecyclerAdapter recyclerAdapter;
@@ -185,21 +185,21 @@ public class WebRtcCallView extends ConstraintLayout {
footerGradient = findViewById(R.id.call_screen_footer_gradient);
startCallControls = findViewById(R.id.call_screen_start_call_controls);
callParticipantsPager = findViewById(R.id.call_screen_participants_pager);
callParticipantsRecycler = findViewById(R.id.call_screen_participants_recycler);
toolbar = findViewById(R.id.call_screen_header);
startCall = findViewById(R.id.call_screen_start_call_start_call);
callParticipantsRecycler = findViewById(R.id.call_screen_participants_recycler);
largeHeader = findViewById(R.id.call_screen_header);
startCall = findViewById(R.id.call_screen_start_call_start_call);
errorButton = findViewById(R.id.call_screen_error_cancel);
groupCallSpeakerHint = new Stub<>(findViewById(R.id.call_screen_group_call_speaker_hint));
groupCallFullStub = new Stub<>(findViewById(R.id.group_call_call_full_view));
showParticipantsGuideline = findViewById(R.id.call_screen_show_participants_guideline);
topFoldGuideline = findViewById(R.id.fold_top_guideline);
callScreenTopFoldGuideline = findViewById(R.id.fold_top_call_screen_guideline);
foldParticipantCountWrapper = findViewById(R.id.fold_show_participants_menu_counter_wrapper);
foldParticipantCount = findViewById(R.id.fold_show_participants_menu_counter);
largeHeaderAvatar = findViewById(R.id.call_screen_header_avatar);
statusBarGuideline = findViewById(R.id.call_screen_status_bar_guideline);
navigationBarGuideline = findViewById(R.id.call_screen_navigation_bar_guideline);
fullScreenShade = findViewById(R.id.call_screen_full_shade);
collapsedToolbar = findViewById(R.id.webrtc_call_view_toolbar_text);
headerToolbar = findViewById(R.id.webrtc_call_view_toolbar_no_text);
View decline = findViewById(R.id.call_screen_decline_call);
View answerLabel = findViewById(R.id.call_screen_answer_call_label);
@@ -224,7 +224,7 @@ public class WebRtcCallView extends ConstraintLayout {
}
});
topViews.add(toolbar);
topViews.add(largeHeader);
topViews.add(topGradient);
incomingCallViews.add(answer);
@@ -302,6 +302,36 @@ public class WebRtcCallView extends ConstraintLayout {
}
});
collapsedToolbar.setNavigationOnClickListener(unused -> {
if (controlsListener != null) {
controlsListener.onNavigateUpClicked();
}
});
collapsedToolbar.setOnMenuItemClickListener(item -> {
if (item.getItemId() == R.id.action_info && controlsListener != null) {
controlsListener.onCallInfoClicked();
return true;
}
return false;
});
headerToolbar.setNavigationOnClickListener(unused -> {
if (controlsListener != null) {
controlsListener.onNavigateUpClicked();
}
});
headerToolbar.setOnMenuItemClickListener(item -> {
if (item.getItemId() == R.id.action_info && controlsListener != null) {
controlsListener.onCallInfoClicked();
return true;
}
return false;
});
rotatableControls.add(hangup);
rotatableControls.add(answer);
rotatableControls.add(answerWithoutVideo);
@@ -312,12 +342,6 @@ public class WebRtcCallView extends ConstraintLayout {
rotatableControls.add(decline);
rotatableControls.add(smallLocalAudioIndicator);
rotatableControls.add(ringToggle);
largeHeaderConstraints = new ConstraintSet();
largeHeaderConstraints.clone(getContext(), R.layout.webrtc_call_view_header_large);
smallHeaderConstraints = new ConstraintSet();
smallHeaderConstraints.clone(getContext(), R.layout.webrtc_call_view_header_small);
}
@Override
@@ -357,9 +381,9 @@ public class WebRtcCallView extends ConstraintLayout {
if ((visible & SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) {
if (controls.adjustForFold()) {
pictureInPictureGestureHelper.clearVerticalBoundaries();
pictureInPictureGestureHelper.setTopVerticalBoundary(toolbar.getTop());
pictureInPictureGestureHelper.setTopVerticalBoundary(largeHeader.getTop());
} else {
pictureInPictureGestureHelper.setTopVerticalBoundary(toolbar.getBottom());
pictureInPictureGestureHelper.setTopVerticalBoundary(largeHeader.getBottom());
pictureInPictureGestureHelper.setBottomVerticalBoundary(videoToggle.getTop());
}
} else {
@@ -407,21 +431,21 @@ public class WebRtcCallView extends ConstraintLayout {
if (state.getGroupCallState().isNotIdle()) {
if (state.getCallState() == WebRtcViewModel.State.CALL_PRE_JOIN) {
status.setText(state.getPreJoinGroupDescription(getContext()));
setStatus(state.getPreJoinGroupDescription(getContext()));
} else if (state.getCallState() == WebRtcViewModel.State.CALL_CONNECTED && state.isInOutgoingRingingMode()) {
status.setText(state.getOutgoingRingingGroupDescription(getContext()));
setStatus(state.getOutgoingRingingGroupDescription(getContext()));
} else if (state.getGroupCallState().isRinging()) {
status.setText(state.getIncomingRingingGroupDescription(getContext()));
setStatus(state.getIncomingRingingGroupDescription(getContext()));
}
}
if (state.getGroupCallState().isNotIdle()) {
String text = state.getParticipantCount()
.mapToObj(String::valueOf).orElse("\u2014");
boolean enabled = state.getParticipantCount().isPresent();
foldParticipantCount.setText(text);
foldParticipantCount.setEnabled(enabled);
collapsedToolbar.getMenu().getItem(0).setVisible(enabled);
headerToolbar.getMenu().getItem(0).setVisible(enabled);
} else {
collapsedToolbar.getMenu().getItem(0).setVisible(false);
headerToolbar.getMenu().getItem(0).setVisible(false);
}
pagerAdapter.submitList(pages);
@@ -527,34 +551,34 @@ public class WebRtcCallView extends ConstraintLayout {
}
recipientId = recipient.getId();
largeHeaderAvatar.setRecipient(recipient, false);
if (recipient.isGroup()) {
foldParticipantCountWrapper.setOnClickListener(unused -> showParticipantsList());
}
collapsedToolbar.setTitle(recipient.getDisplayName(getContext()));
recipientName.setText(recipient.getDisplayName(getContext()));
}
public void setStatus(@NonNull String status) {
public void setStatus(@Nullable String status) {
this.status.setText(status);
collapsedToolbar.setSubtitle(status);
}
private void setStatus(@StringRes int statusRes) {
setStatus(getContext().getString(statusRes));
}
public void setStatusFromHangupType(@NonNull HangupMessage.Type hangupType) {
switch (hangupType) {
case NORMAL:
case NEED_PERMISSION:
status.setText(R.string.RedPhone_ending_call);
setStatus(R.string.RedPhone_ending_call);
break;
case ACCEPTED:
status.setText(R.string.WebRtcCallActivity__answered_on_a_linked_device);
setStatus(R.string.WebRtcCallActivity__answered_on_a_linked_device);
break;
case DECLINED:
status.setText(R.string.WebRtcCallActivity__declined_on_a_linked_device);
setStatus(R.string.WebRtcCallActivity__declined_on_a_linked_device);
break;
case BUSY:
status.setText(R.string.WebRtcCallActivity__busy_on_a_linked_device);
setStatus(R.string.WebRtcCallActivity__busy_on_a_linked_device);
break;
default:
throw new IllegalStateException("Unknown hangup type: " + hangupType);
@@ -564,18 +588,18 @@ public class WebRtcCallView extends ConstraintLayout {
public void setStatusFromGroupCallState(@NonNull WebRtcViewModel.GroupCallState groupCallState) {
switch (groupCallState) {
case DISCONNECTED:
status.setText(R.string.WebRtcCallView__disconnected);
setStatus(R.string.WebRtcCallView__disconnected);
break;
case RECONNECTING:
status.setText(R.string.WebRtcCallView__reconnecting);
setStatus(R.string.WebRtcCallView__reconnecting);
break;
case CONNECTED_AND_JOINING:
status.setText(R.string.WebRtcCallView__joining);
setStatus(R.string.WebRtcCallView__joining);
break;
case CONNECTING:
case CONNECTED_AND_JOINED:
case CONNECTED:
status.setText("");
setStatus("");
break;
}
}
@@ -597,11 +621,6 @@ public class WebRtcCallView extends ConstraintLayout {
callScreenTopFoldGuideline.setGuidelineEnd(0);
}
if (webRtcControls.displayGroupMembersButton()) {
visibleViewSet.add(foldParticipantCountWrapper);
foldParticipantCount.setClickable(webRtcControls.adjustForFold());
}
if (webRtcControls.displayStartCallControls()) {
visibleViewSet.add(footerGradient);
visibleViewSet.add(startCallControls);
@@ -855,7 +874,7 @@ public class WebRtcCallView extends ConstraintLayout {
}
private void toggleControls() {
if (controls.isFadeOutEnabled() && toolbar.getVisibility() == VISIBLE) {
if (controls.isFadeOutEnabled() && largeHeader.getVisibility() == VISIBLE) {
fadeOutControls();
} else {
fadeInControls();
@@ -978,11 +997,13 @@ public class WebRtcCallView extends ConstraintLayout {
constraintSet.applyTo(parent);
if (showSmallHeader) {
smallHeaderConstraints.setVisibility(incomingRingStatus.getId(), visibleViewSet.contains(incomingRingStatus) ? View.VISIBLE : View.GONE);
smallHeaderConstraints.applyTo(toolbar);
collapsedToolbar.setVisibility(View.VISIBLE);
headerToolbar.setVisibility(View.GONE);
largeHeader.setVisibility(View.GONE);
} else {
largeHeaderConstraints.setVisibility(incomingRingStatus.getId(), visibleViewSet.contains(incomingRingStatus) ? View.VISIBLE : View.GONE);
largeHeaderConstraints.applyTo(toolbar);
collapsedToolbar.setVisibility(View.GONE);
headerToolbar.setVisibility(View.VISIBLE);
largeHeader.setVisibility(View.VISIBLE);
}
}
@@ -1032,11 +1053,6 @@ public class WebRtcCallView extends ConstraintLayout {
ringToggle.setBackgroundResource(R.drawable.webrtc_call_screen_ring_toggle_small);
}
private boolean showParticipantsList() {
controlsListener.onShowParticipantsList();
return true;
}
public void switchToSpeakerView() {
if (pagerAdapter.getItemCount() > 0) {
callParticipantsPager.setCurrentItem(pagerAdapter.getItemCount() - 1, false);
@@ -1067,9 +1083,10 @@ public class WebRtcCallView extends ConstraintLayout {
void onDenyCallPressed();
void onAcceptCallWithVoiceOnlyPressed();
void onAcceptCallPressed();
void onShowParticipantsList();
void onPageChanged(@NonNull CallParticipantsState.SelectedPage page);
void onLocalPictureInPictureClicked();
void onRingGroupChanged(boolean ringGroup, boolean ringingAllowed);
void onCallInfoClicked();
void onNavigateUpClicked();
}
}

View File

@@ -200,6 +200,27 @@
</com.google.android.material.card.MaterialCardView>
</org.thoughtcrime.securesms.util.views.TouchInterceptingFrameLayout>
<androidx.appcompat.widget.Toolbar
android:id="@+id/webrtc_call_view_toolbar_no_text"
android:layout_width="match_parent"
android:layout_height="@dimen/signal_m3_toolbar_height"
android:minHeight="@dimen/signal_m3_toolbar_height"
app:layout_constraintTop_toTopOf="@id/call_screen_status_bar_guideline"
app:menu="@menu/webrtc_toolbar_menu"
app:navigationIcon="@drawable/ic_arrow_left_24" />
<androidx.appcompat.widget.Toolbar
android:id="@+id/webrtc_call_view_toolbar_text"
android:layout_width="match_parent"
android:layout_height="@dimen/signal_m3_toolbar_height"
android:minHeight="@dimen/signal_m3_toolbar_height"
android:visibility="gone"
app:layout_constraintTop_toTopOf="@id/call_screen_status_bar_guideline"
app:menu="@menu/webrtc_toolbar_menu"
app:navigationIcon="@drawable/ic_arrow_left_24"
app:subtitleTextAppearance="@style/Signal.Text.BodyMedium"
app:titleTextAppearance="@style/Signal.Text.TitleMedium" />
<include
layout="@layout/webrtc_call_view_header_large"
android:layout_width="match_parent"
@@ -454,39 +475,6 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<LinearLayout
android:id="@+id/fold_show_participants_menu_counter_wrapper"
android:layout_width="wrap_content"
android:layout_height="56dp"
android:background="?attr/selectableItemBackground"
android:gravity="center"
android:minWidth="48dp"
android:orientation="horizontal"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/call_screen_show_participants_guideline"
tools:visibility="visible">
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="4dp"
app:srcCompat="@drawable/ic_group_solid_24"
app:tint="@color/core_white" />
<TextView
android:id="@+id/fold_show_participants_menu_counter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/core_white"
android:textSize="13sp"
android:textStyle="bold"
tools:text="0" />
</LinearLayout>
<androidx.constraintlayout.widget.Barrier
android:id="@+id/call_screen_footer_gradient_barrier"
android:layout_width="wrap_content"

View File

@@ -1,72 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:viewBindingIgnore="true"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/call_screen_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal">
<TextView
android:id="@+id/call_screen_ringing_call_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:gravity="center"
android:textAppearance="@style/TextAppearance.Signal.Body2"
android:textColor="@color/core_white"
app:drawableStartCompat="@drawable/ic_signal_logo_small"
android:drawablePadding="4dp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/action_bar_guideline"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Signal video call" />
<org.thoughtcrime.securesms.components.AvatarImageView
android:id="@+id/call_screen_header_avatar"
android:layout_width="96dp"
android:layout_height="96dp"
android:layout_marginTop="106dp"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/action_bar_guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_begin="?actionBarSize" />
<org.thoughtcrime.securesms.components.emoji.EmojiTextView
android:id="@+id/call_screen_recipient_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:gravity="center_horizontal"
android:maxLines="2"
android:textAppearance="@style/TextAppearance.Signal.Body1.Bold"
android:textColor="@color/core_white"
app:layout_constraintBottom_toTopOf="@id/action_bar_guideline"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Kiera Thompson" />
<TextView
android:id="@+id/call_screen_status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:textAppearance="@style/TextAppearance.Signal.Body2"
android:textColor="@color/core_white"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/call_screen_recipient_name"
tools:text="Signal Calling..." />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_info"
android:icon="@drawable/symbol_info_24"
android:title="@string/CallContextMenu__info"
app:showAsAction="always" />
</menu>