Skip to content

Commit

Permalink
Add animation when replying to a message.
Browse files Browse the repository at this point in the history
  • Loading branch information
alex-signal authored and greyson-signal committed Apr 3, 2020
1 parent 711715c commit 6f3c443
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 16 deletions.
Original file line number Diff line number Diff line change
@@ -1,20 +1,16 @@
package org.thoughtcrime.securesms.components;

import android.animation.Animator;
import android.animation.ValueAnimator;
import android.annotation.TargetApi;
import android.content.Context;
import android.net.Uri;
import android.os.Build;
import androidx.annotation.DimenRes;
import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.ViewCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.text.format.DateUtils;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
Expand All @@ -24,7 +20,16 @@
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.DimenRes;
import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.ViewCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.animation.AnimationCompleteListener;
import org.thoughtcrime.securesms.components.emoji.EmojiKeyboardProvider;
import org.thoughtcrime.securesms.components.emoji.EmojiToggle;
import org.thoughtcrime.securesms.components.emoji.MediaKeyboard;
Expand Down Expand Up @@ -73,6 +78,7 @@ public class InputPanel extends LinearLayout
private MicrophoneRecorderView microphoneRecorderView;
private SlideToCancel slideToCancel;
private RecordTime recordTime;
private ValueAnimator quoteAnimator;

private @Nullable Listener listener;
private boolean emojiVisible;
Expand Down Expand Up @@ -157,7 +163,20 @@ public void setQuote(@NonNull GlideRequests glideRequests,
@NonNull SlideDeck attachments)
{
this.quoteView.setQuote(glideRequests, id, author, body, false, attachments);
this.quoteView.setVisibility(View.VISIBLE);

int originalHeight = this.quoteView.getVisibility() == VISIBLE ? this.quoteView.getMeasuredHeight()
: 0;

this.quoteView.setVisibility(VISIBLE);
this.quoteView.measure(0, 0);

if (quoteAnimator != null) {
quoteAnimator.cancel();
}

quoteAnimator = createHeightAnimator(quoteView, originalHeight, this.quoteView.getMeasuredHeight(), null);

quoteAnimator.start();

if (this.linkPreview.getVisibility() == View.VISIBLE) {
int cornerRadius = readDimen(R.dimen.message_corner_collapse_radius);
Expand All @@ -166,12 +185,43 @@ public void setQuote(@NonNull GlideRequests glideRequests,
}

public void clearQuote() {
this.quoteView.dismiss();
if (quoteAnimator != null) {
quoteAnimator.cancel();
}

if (this.linkPreview.getVisibility() == View.VISIBLE) {
int cornerRadius = readDimen(R.dimen.message_corner_radius);
this.linkPreview.setCorners(cornerRadius, cornerRadius);
quoteAnimator = createHeightAnimator(quoteView, quoteView.getMeasuredHeight(), 0, new AnimationCompleteListener() {
@Override
public void onAnimationEnd(Animator animation) {
quoteView.dismiss();

if (linkPreview.getVisibility() == View.VISIBLE) {
int cornerRadius = readDimen(R.dimen.message_corner_radius);
linkPreview.setCorners(cornerRadius, cornerRadius);
}
}
});

quoteAnimator.start();
}

private static ValueAnimator createHeightAnimator(@NonNull View view,
int originalHeight,
int finalHeight,
@Nullable AnimationCompleteListener onAnimationComplete)
{
ValueAnimator animator = ValueAnimator.ofInt(originalHeight, finalHeight);

animator.addUpdateListener(animation -> {
ViewGroup.LayoutParams params = view.getLayoutParams();
params.height = (int) animation.getAnimatedValue();
view.setLayoutParams(params);
});

if (onAnimationComplete != null) {
animator.addListener(onAnimationComplete);
}

return animator;
}

public Optional<QuoteModel> getQuote() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Build;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
Expand All @@ -17,6 +14,10 @@
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;

import com.annimon.stream.Stream;
import com.bumptech.glide.load.engine.DiskCacheStrategy;

Expand Down Expand Up @@ -248,6 +249,7 @@ private void setQuoteAttachment(@NonNull GlideRequests glideRequests, @NonNull S
}
glideRequests.load(new DecryptableUri(imageVideoSlides.get(0).getThumbnailUri()))
.centerCrop()
.override(getContext().getResources().getDimensionPixelSize(R.dimen.quote_thumb_size))
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
.into(thumbnailView);
} else if (!documentSlides.isEmpty()){
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/layout/quote_view.xml
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@

<ImageView
android:id="@+id/quote_thumbnail"
android:layout_width="60dp"
android:layout_width="@dimen/quote_thumb_size"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:visibility="gone"
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/dimens.xml
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@
<dimen name="quote_corner_radius_large">10dp</dimen>
<dimen name="quote_corner_radius_bottom">4dp</dimen>
<dimen name="quote_corner_radius_preview">18dp</dimen>
<dimen name="quote_thumb_size">60dp</dimen>

<integer name="media_overview_cols">3</integer>
<dimen name="message_details_table_row_pad">10dp</dimen>
Expand Down

0 comments on commit 6f3c443

Please sign in to comment.