Remove use of transitionmanager to prevent sticky header flickering.

fork-5.53.8
Alex Hart 2021-06-08 14:01:01 -03:00
rodzic 9f2d57493d
commit c5c176a818
3 zmienionych plików z 42 dodań i 34 usunięć

Wyświetl plik

@ -114,6 +114,8 @@ public final class ContactSelectionListFragment extends LoggingFragment
public static final String HIDE_COUNT = "hide_count"; public static final String HIDE_COUNT = "hide_count";
public static final String CAN_SELECT_SELF = "can_select_self"; public static final String CAN_SELECT_SELF = "can_select_self";
public static final String DISPLAY_CHIPS = "display_chips"; public static final String DISPLAY_CHIPS = "display_chips";
public static final String RV_PADDING_BOTTOM = "recycler_view_padding_bottom";
public static final String RV_CLIP = "recycler_view_clipping";
private ConstraintLayout constraintLayout; private ConstraintLayout constraintLayout;
private TextView emptyText; private TextView emptyText;
@ -245,6 +247,15 @@ public final class ContactSelectionListFragment extends LoggingFragment
Intent intent = requireActivity().getIntent(); Intent intent = requireActivity().getIntent();
Bundle arguments = safeArguments(); Bundle arguments = safeArguments();
int recyclerViewPadBottom = arguments.getInt(RV_PADDING_BOTTOM, intent.getIntExtra(RV_PADDING_BOTTOM, -1));
boolean recyclerViewClipping = arguments.getBoolean(RV_CLIP, intent.getBooleanExtra(RV_CLIP, true));
if (recyclerViewPadBottom != -1) {
ViewUtil.setPaddingBottom(recyclerView, recyclerViewPadBottom);
}
recyclerView.setClipToPadding(recyclerViewClipping);
swipeRefresh.setEnabled(arguments.getBoolean(REFRESHABLE, intent.getBooleanExtra(REFRESHABLE, true))); swipeRefresh.setEnabled(arguments.getBoolean(REFRESHABLE, intent.getBooleanExtra(REFRESHABLE, true)));
hideCount = arguments.getBoolean(HIDE_COUNT, intent.getBooleanExtra(HIDE_COUNT, false)); hideCount = arguments.getBoolean(HIDE_COUNT, intent.getBooleanExtra(HIDE_COUNT, false));

Wyświetl plik

@ -32,11 +32,9 @@ import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.ConstraintSet;
import androidx.core.util.Consumer; import androidx.core.util.Consumer;
import androidx.lifecycle.ViewModelProviders; import androidx.lifecycle.ViewModelProviders;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import androidx.transition.TransitionManager;
import com.annimon.stream.Collectors; import com.annimon.stream.Collectors;
import com.annimon.stream.Stream; import com.annimon.stream.Stream;
@ -59,6 +57,7 @@ import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
import org.thoughtcrime.securesms.util.DynamicTheme; import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.concurrent.SimpleTask; import org.thoughtcrime.securesms.util.concurrent.SimpleTask;
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog; import org.thoughtcrime.securesms.util.views.SimpleProgressDialog;
import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.libsignal.util.guava.Optional;
@ -97,6 +96,8 @@ public class ShareActivity extends PassphraseRequiredActivity
private SearchToolbar searchToolbar; private SearchToolbar searchToolbar;
private ImageView searchAction; private ImageView searchAction;
private View shareConfirm; private View shareConfirm;
private RecyclerView contactsRecycler;
private View contactsRecyclerDivider;
private ShareSelectionAdapter adapter; private ShareSelectionAdapter adapter;
private boolean disallowMultiShare; private boolean disallowMultiShare;
@ -190,23 +191,21 @@ public class ShareActivity extends PassphraseRequiredActivity
} }
private void animateInSelection() { private void animateInSelection() {
TransitionManager.endTransitions(shareContainer); contactsRecyclerDivider.animate()
TransitionManager.beginDelayedTransition(shareContainer); .alpha(1f)
.translationY(0);
ConstraintSet constraintSet = new ConstraintSet(); contactsRecycler.animate()
constraintSet.clone(shareContainer); .alpha(1f)
constraintSet.setVisibility(R.id.selection_group, ConstraintSet.VISIBLE); .translationY(0);
constraintSet.applyTo(shareContainer);
} }
private void animateOutSelection() { private void animateOutSelection() {
TransitionManager.endTransitions(shareContainer); contactsRecyclerDivider.animate()
TransitionManager.beginDelayedTransition(shareContainer); .alpha(0f)
.translationY(ViewUtil.dpToPx(48));
ConstraintSet constraintSet = new ConstraintSet(); contactsRecycler.animate()
constraintSet.clone(shareContainer); .alpha(0f)
constraintSet.setVisibility(R.id.selection_group, ConstraintSet.GONE); .translationY(ViewUtil.dpToPx(48));
constraintSet.applyTo(shareContainer);
} }
private void initializeIntent() { private void initializeIntent() {
@ -228,6 +227,8 @@ public class ShareActivity extends PassphraseRequiredActivity
getIntent().putExtra(ContactSelectionListFragment.HIDE_COUNT, true); getIntent().putExtra(ContactSelectionListFragment.HIDE_COUNT, true);
getIntent().putExtra(ContactSelectionListFragment.DISPLAY_CHIPS, false); getIntent().putExtra(ContactSelectionListFragment.DISPLAY_CHIPS, false);
getIntent().putExtra(ContactSelectionListFragment.CAN_SELECT_SELF, true); getIntent().putExtra(ContactSelectionListFragment.CAN_SELECT_SELF, true);
getIntent().putExtra(ContactSelectionListFragment.RV_CLIP, false);
getIntent().putExtra(ContactSelectionListFragment.RV_PADDING_BOTTOM, ViewUtil.dpToPx(48));
} }
private void initializeToolbar() { private void initializeToolbar() {
@ -242,14 +243,15 @@ public class ShareActivity extends PassphraseRequiredActivity
} }
private void initializeResources() { private void initializeResources() {
searchToolbar = findViewById(R.id.search_toolbar); searchToolbar = findViewById(R.id.search_toolbar);
searchAction = findViewById(R.id.search_action); searchAction = findViewById(R.id.search_action);
shareConfirm = findViewById(R.id.share_confirm); shareConfirm = findViewById(R.id.share_confirm);
shareContainer = findViewById(R.id.container); shareContainer = findViewById(R.id.container);
contactsFragment = new ContactSelectionListFragment(); contactsFragment = new ContactSelectionListFragment();
adapter = new ShareSelectionAdapter(); adapter = new ShareSelectionAdapter();
contactsRecycler = findViewById(R.id.selected_list);
contactsRecyclerDivider = findViewById(R.id.divider);
RecyclerView contactsRecycler = findViewById(R.id.selected_list);
contactsRecycler.setAdapter(adapter); contactsRecycler.setAdapter(adapter);
RecyclerView.ItemAnimator itemAnimator = Objects.requireNonNull(contactsRecycler.getItemAnimator()); RecyclerView.ItemAnimator itemAnimator = Objects.requireNonNull(contactsRecycler.getItemAnimator());

Wyświetl plik

@ -42,13 +42,12 @@
</androidx.appcompat.widget.Toolbar> </androidx.appcompat.widget.Toolbar>
<FrameLayout <FrameLayout
android:id="@+id/contact_selection_list_fragment" android:id="@+id/contact_selection_list_fragment"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_below="@id/toolbar" android:layout_below="@id/toolbar"
app:layout_constraintBottom_toTopOf="@id/selected_list" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/toolbar" /> app:layout_constraintTop_toBottomOf="@id/toolbar" />
<org.thoughtcrime.securesms.components.SearchToolbar <org.thoughtcrime.securesms.components.SearchToolbar
@ -64,8 +63,9 @@
android:id="@+id/divider" android:id="@+id/divider"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="2dp" android:layout_height="2dp"
android:alpha="1" android:alpha="0"
android:background="@drawable/compose_divider_background" android:background="@drawable/compose_divider_background"
android:translationY="48dp"
app:layout_constraintBottom_toTopOf="@id/selected_list" /> app:layout_constraintBottom_toTopOf="@id/selected_list" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
@ -73,10 +73,13 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="44dp" android:layout_height="44dp"
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:alpha="0"
android:background="@color/signal_background_primary"
android:clipToPadding="false" android:clipToPadding="false"
android:orientation="horizontal" android:orientation="horizontal"
android:paddingStart="16dp" android:paddingStart="16dp"
android:paddingEnd="78dp" android:paddingEnd="78dp"
android:translationY="48dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
@ -94,12 +97,4 @@
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:srcCompat="@drawable/ic_continue_24" /> app:srcCompat="@drawable/ic_continue_24" />
<androidx.constraintlayout.widget.Group
android:id="@+id/selection_group"
android:layout_width="0dp"
android:layout_height="0dp"
android:visibility="gone"
app:constraint_referenced_ids="divider,selected_list"
tools:visibility="visible" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>