Improve animations of VideoDetailFragment

pull/516/head
Mauricio Colli 2017-04-28 00:58:50 -03:00
rodzic 00102d4048
commit 6fd6facf72
1 zmienionych plików z 68 dodań i 23 usunięć

Wyświetl plik

@ -8,8 +8,10 @@ import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.support.annotation.FloatRange;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat; import android.support.v4.content.ContextCompat;
import android.support.v4.view.animation.FastOutSlowInInterpolator;
import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBar;
import android.support.v7.app.AlertDialog; import android.support.v7.app.AlertDialog;
import android.text.Html; import android.text.Html;
@ -126,6 +128,7 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
private TextView videoUploadDateView; private TextView videoUploadDateView;
private TextView videoDescriptionView; private TextView videoDescriptionView;
private View uploaderRootLayout;
private Button uploaderButton; private Button uploaderButton;
private TextView uploaderTextView; private TextView uploaderTextView;
private ImageView uploaderThumb; private ImageView uploaderThumb;
@ -201,7 +204,7 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
public void onViewCreated(View rootView, Bundle savedInstanceState) { public void onViewCreated(View rootView, Bundle savedInstanceState) {
super.onViewCreated(rootView, savedInstanceState); super.onViewCreated(rootView, savedInstanceState);
if (currentStreamInfo == null) selectAndLoadVideo(serviceId, videoUrl, videoTitle); if (currentStreamInfo == null) selectAndLoadVideo(serviceId, videoUrl, videoTitle);
else prepareAndLoad(currentStreamInfo); else prepareAndLoad(currentStreamInfo, false);
} }
@Override @Override
@ -364,7 +367,7 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
if (currentStreamInfo != null) StreamInfoCache.getInstance().removeInfo(currentStreamInfo); if (currentStreamInfo != null) StreamInfoCache.getInstance().removeInfo(currentStreamInfo);
currentStreamInfo = null; currentStreamInfo = null;
for (StackItem stackItem : stack) if (stackItem.getUrl().equals(videoUrl)) stackItem.setInfo(null); for (StackItem stackItem : stack) if (stackItem.getUrl().equals(videoUrl)) stackItem.setInfo(null);
prepareAndLoad(null); prepareAndLoad(null, true);
} }
private void openInBackground() { private void openInBackground() {
@ -497,7 +500,7 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
thumbsDownImageView = (ImageView) rootView.findViewById(R.id.detail_thumbs_down_img_view); thumbsDownImageView = (ImageView) rootView.findViewById(R.id.detail_thumbs_down_img_view);
thumbsDisabledTextView = (TextView) rootView.findViewById(R.id.detail_thumbs_disabled_view); thumbsDisabledTextView = (TextView) rootView.findViewById(R.id.detail_thumbs_disabled_view);
//uploaderRootLayout = (FrameLayout) rootView.findViewById(R.id.detail_uploader_root_layout); uploaderRootLayout = rootView.findViewById(R.id.detail_uploader_root_layout);
uploaderButton = (Button) rootView.findViewById(R.id.detail_uploader_button); uploaderButton = (Button) rootView.findViewById(R.id.detail_uploader_button);
uploaderTextView = (TextView) rootView.findViewById(R.id.detail_uploader_text_view); uploaderTextView = (TextView) rootView.findViewById(R.id.detail_uploader_text_view);
uploaderThumb = (ImageView) rootView.findViewById(R.id.detail_uploader_thumbnail_view); uploaderThumb = (ImageView) rootView.findViewById(R.id.detail_uploader_thumbnail_view);
@ -769,15 +772,26 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
} }
public void selectAndHandleInfo(StreamInfo info) { public void selectAndHandleInfo(StreamInfo info) {
if (DEBUG) Log.d(TAG, "selectAndHandleInfo() called with: info = [" + info + "]"); selectAndHandleInfo(info, true);
}
public void selectAndHandleInfo(StreamInfo info, boolean scrollToTop) {
if (DEBUG) Log.d(TAG, "selectAndHandleInfo() called with: info = [" + info + "], scrollToTop = [" + scrollToTop + "]");
selectVideo(info.service_id, info.webpage_url, info.title); selectVideo(info.service_id, info.webpage_url, info.title);
prepareAndLoad(info); prepareAndLoad(info, scrollToTop);
} }
public void selectAndLoadVideo(int serviceId, String videoUrl, String videoTitle) { public void selectAndLoadVideo(int serviceId, String videoUrl, String videoTitle) {
if (DEBUG) Log.d(TAG, "selectAndLoadVideo() called with: serviceId = [" + serviceId + "], videoUrl = [" + videoUrl + "], videoTitle = [" + videoTitle + "]"); selectAndLoadVideo(serviceId, videoUrl, videoTitle, true);
}
public void selectAndLoadVideo(int serviceId, String videoUrl, String videoTitle, boolean scrollToTop) {
if (DEBUG) {
Log.d(TAG, "selectAndLoadVideo() called with: serviceId = [" + serviceId + "], videoUrl = [" + videoUrl + "], videoTitle = [" + videoTitle + "], scrollToTop = [" + scrollToTop + "]");
}
selectVideo(serviceId, videoUrl, videoTitle); selectVideo(serviceId, videoUrl, videoTitle);
prepareAndLoad(null); prepareAndLoad(null, scrollToTop);
} }
/** /**
@ -787,8 +801,9 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
* If the cache doesn't have the info, load from the network. * If the cache doesn't have the info, load from the network.
* *
* @param info info to prepare and load, can be null * @param info info to prepare and load, can be null
* @param scrollToTop whether or not scroll the scrollView to y = 0
*/ */
public void prepareAndLoad(StreamInfo info) { public void prepareAndLoad(StreamInfo info, boolean scrollToTop) {
if (DEBUG) Log.d(TAG, "prepareAndLoad() called with: info = [" + info + "]"); if (DEBUG) Log.d(TAG, "prepareAndLoad() called with: info = [" + info + "]");
isLoading.set(true); isLoading.set(true);
@ -803,15 +818,11 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
if (curExtractorWorker != null && curExtractorWorker.isRunning()) curExtractorWorker.cancel(); if (curExtractorWorker != null && curExtractorWorker.isRunning()) curExtractorWorker.cancel();
animateView(spinnerToolbar, false, 200); animateView(spinnerToolbar, false, 200);
animateView(errorPanel, false, 200); animateView(errorPanel, false, 200);
animateView(videoTitleTextView, false, 100, new Runnable() {
@Override videoTitleTextView.setText(videoTitle != null ? videoTitle : "");
public void run() { videoTitleTextView.setMaxLines(1);
if (videoTitleTextView == null) return; animateView(videoTitleTextView, true, 0);
videoTitleTextView.setText(videoTitle != null ? videoTitle : "");
videoTitleTextView.setMaxLines(1);
animateView(videoTitleTextView, true, 100);
}
});
videoDescriptionRootLayout.setVisibility(View.GONE); videoDescriptionRootLayout.setVisibility(View.GONE);
videoTitleToggleArrow.setImageResource(R.drawable.arrow_down); videoTitleToggleArrow.setImageResource(R.drawable.arrow_down);
videoTitleToggleArrow.setVisibility(View.GONE); videoTitleToggleArrow.setVisibility(View.GONE);
@ -825,16 +836,24 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
if (info != null) { if (info != null) {
final StreamInfo infoFinal = info; final StreamInfo infoFinal = info;
animateView(contentRootLayoutHiding, false, 300, new Runnable() { final boolean greaterThanThreshold = parallaxScrollRootView.getScrollY() >
(int) (getResources().getDisplayMetrics().heightPixels * .1f);
if (scrollToTop) {
if (greaterThanThreshold) parallaxScrollRootView.smoothScrollTo(0, 0);
else parallaxScrollRootView.scrollTo(0, 0);
}
animateView(contentRootLayoutHiding, false, greaterThanThreshold ? 250 : 0, new Runnable() {
@Override @Override
public void run() { public void run() {
if (contentRootLayoutHiding == null) return;
handleStreamInfo(infoFinal, false); handleStreamInfo(infoFinal, false);
isLoading.set(false); isLoading.set(false);
animateView(contentRootLayoutHiding, true, 400, 200); showContentWithAnimation(greaterThanThreshold ? 120 : 200, 0, .02f);
} }
}); });
} else { } else {
if (scrollToTop) parallaxScrollRootView.smoothScrollTo(0, 0);
curExtractorWorker = new StreamExtractorWorker(activity, serviceId, videoUrl, this); curExtractorWorker = new StreamExtractorWorker(activity, serviceId, videoUrl, this);
curExtractorWorker.start(); curExtractorWorker.start();
animateView(loadingProgressBar, true, 200); animateView(loadingProgressBar, true, 200);
@ -849,8 +868,6 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
loadingProgressBar.setVisibility(View.GONE); loadingProgressBar.setVisibility(View.GONE);
animateView(thumbnailPlayButton, true, 200); animateView(thumbnailPlayButton, true, 200);
parallaxScrollRootView.scrollTo(0, 0);
// Since newpipe is designed to work even if certain information is not available, // Since newpipe is designed to work even if certain information is not available,
// the UI has to react on missing information. // the UI has to react on missing information.
@ -1001,6 +1018,33 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
} }
} }
private void showContentWithAnimation(long duration, long delay, @FloatRange(from = 0.0f, to = 1.0f) float translationPercent) {
int translationY = (int) (getResources().getDisplayMetrics().heightPixels *
(translationPercent > 0.0f ? translationPercent : .12f));
contentRootLayoutHiding.animate().setListener(null).cancel();
contentRootLayoutHiding.setAlpha(0f);
contentRootLayoutHiding.setTranslationY(translationY);
contentRootLayoutHiding.setVisibility(View.VISIBLE);
contentRootLayoutHiding.animate().alpha(1f).translationY(0)
.setStartDelay(delay).setDuration(duration).setInterpolator(new FastOutSlowInInterpolator()).start();
uploaderRootLayout.animate().setListener(null).cancel();
uploaderRootLayout.setAlpha(0f);
uploaderRootLayout.setTranslationY(translationY);
uploaderRootLayout.setVisibility(View.VISIBLE);
uploaderRootLayout.animate().alpha(1f).translationY(0)
.setStartDelay((long) (duration * .5f) + delay).setDuration(duration).setInterpolator(new FastOutSlowInInterpolator()).start();
if (showRelatedStreams) {
relatedStreamRootLayout.animate().setListener(null).cancel();
relatedStreamRootLayout.setAlpha(0f);
relatedStreamRootLayout.setTranslationY(translationY);
relatedStreamRootLayout.setVisibility(View.VISIBLE);
relatedStreamRootLayout.animate().alpha(1f).translationY(0)
.setStartDelay((long) (duration * .8f) + delay).setDuration(duration).setInterpolator(new FastOutSlowInInterpolator()).start();
}
}
/*////////////////////////////////////////////////////////////////////////// /*//////////////////////////////////////////////////////////////////////////
// OnStreamInfoReceivedListener callbacks // OnStreamInfoReceivedListener callbacks
//////////////////////////////////////////////////////////////////////////*/ //////////////////////////////////////////////////////////////////////////*/
@ -1030,7 +1074,8 @@ public class VideoDetailFragment extends BaseFragment implements StreamExtractor
if (info == null || isRemoving() || !isVisible()) return; if (info == null || isRemoving() || !isVisible()) return;
handleStreamInfo(info, true); handleStreamInfo(info, true);
animateView(contentRootLayoutHiding, true, 400); showContentWithAnimation(300, 0, 0);
animateView(loadingProgressBar, false, 200); animateView(loadingProgressBar, false, 200);
if (autoPlayEnabled) { if (autoPlayEnabled) {