package com.garethevans.church.opensongtablet; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.annotation.TargetApi; import android.app.Presentation; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.SurfaceTexture; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.ThumbnailUtils; import android.os.Build; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.Log; import android.view.Display; import android.view.Surface; import android.view.TextureView; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.view.ViewTreeObserver; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import java.io.File; import java.io.IOException; @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) public final class MyPresentation extends Presentation implements TextureView.SurfaceTextureListener, MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnVideoSizeChangedListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener{ static File img1File = new File(FullscreenActivity.dirbackgrounds + "/" + FullscreenActivity.backgroundImage1); static File img2File = new File(FullscreenActivity.dirbackgrounds + "/" + FullscreenActivity.backgroundImage2); static String vid1File = FullscreenActivity.dirbackgrounds + "/" + FullscreenActivity.backgroundVideo1; static String vid2File = FullscreenActivity.dirbackgrounds + "/" + FullscreenActivity.backgroundVideo2; static String vidFile; static File imgFile; // Views on the presentation window static TextView presoLyrics1; static TextView presoLyrics2; static TextView presoLyricsOUT; static TextView presoLyricsIN; static TextView presoAuthor1; static TextView presoAuthor2; static TextView presoAuthorOUT; static TextView presoAuthorIN; static int whichPresoLyricsToUse = 1; static TextView presoCopyright1; static TextView presoCopyright2; static TextView presoCopyrightOUT; static TextView presoCopyrightIN; static TextView presoTitle1; static TextView presoTitle2; static TextView presoTitleIN; static TextView presoTitleOUT; static TextView presoAlert; static ImageView presoLogo; static ImageView presoBGImage; static TextureView presoBGVideo; static RelativeLayout bottomBit; static FrameLayout preso; static FrameLayout lyricsHolder; static ImageView slideImage1; static ImageView slideImage2; static ImageView slideImageIN; static ImageView slideImageOUT; static View lyricsINVScrollHolder; static View lyricsOUTVScrollHolder; static View lyricsINHScrollHolder; static View lyricsOUTHScrollHolder; static View lyrics1VScrollHolder; static View lyrics2VScrollHolder; static View lyrics1HScrollHolder; static View lyrics2HScrollHolder; int lyricsTextColor = FullscreenActivity.dark_lyricsTextColor; int lyricsShadowColor = FullscreenActivity.dark_lyricsBackgroundColor; static Drawable defimage; static Bitmap myBitmap; static Drawable dr; static int screenwidth; static int textwidth; static int screenheight; static int textheight; //MediaController static MediaPlayer mMediaPlayer; static Surface s; Context context; public MyPresentation(Context outerContext, Display display) { super(outerContext, display); } @SuppressWarnings("deprecation") @Override protected void onCreate(Bundle savedinstancestate) { // Notice that we get resources from the context of the Presentation //Resources resources = getContext().getResources(); setContentView(R.layout.projector_screen); context = getContext(); // Get width and height DisplayMetrics metrics = new DisplayMetrics(); Display mDisplay = MyPresentation.this.getDisplay(); mDisplay.getMetrics(metrics); preso = (FrameLayout) findViewById(R.id.preso); bottomBit = (RelativeLayout) findViewById(R.id.bottomBit); lyricsHolder = (FrameLayout) findViewById(R.id.lyricsHolder); presoBGImage = (ImageView) findViewById(R.id.presoBGImage); presoBGVideo = (TextureView) findViewById(R.id.presoBGVideo); presoBGVideo.setSurfaceTextureListener(this); slideImage1 = (ImageView) findViewById(R.id.slideImage1); slideImage1.setVisibility(View.GONE); slideImage2 = (ImageView) findViewById(R.id.slideImage2); slideImage2.setVisibility(View.GONE); slideImageIN = slideImage1; slideImageOUT = slideImage2; fixBackground(); SetTypeFace.setTypeface(); presoLyrics1 = (TextView) findViewById(R.id.presoLyrics1); presoLyrics1.setTextColor(0xffffffff); presoLyrics1.setTypeface(FullscreenActivity.presofont); presoLyrics1.setText(" "); presoLyrics1.setTextSize(72); presoLyrics1.setShadowLayer(25.0f, -5, 5, lyricsShadowColor); presoLyrics1.setAlpha(0.0f); presoLyrics1.setVisibility(View.GONE); presoLyrics1.setHorizontallyScrolling(true); presoLyrics1.setPivotY(0); presoLyrics1.setTranslationY(0); presoLyrics1.setY(0); presoLyrics2 = (TextView) findViewById(R.id.presoLyrics2); presoLyrics2.setTextColor(0xffffffff); presoLyrics2.setTypeface(FullscreenActivity.presofont); presoLyrics2.setText(" "); presoLyrics2.setTextSize(72); presoLyrics2.setShadowLayer(25.0f, -5, 5, lyricsShadowColor); presoLyrics2.setAlpha(0.0f); presoLyrics2.setVisibility(View.GONE); presoLyrics2.setHorizontallyScrolling(true); presoLyrics2.setPivotY(0); presoLyrics2.setTranslationY(0); presoLyrics2.setY(0); presoTitle1 = (TextView) findViewById(R.id.presoTitle1); presoTitle1.setShadowLayer(25.0f, -5, 5, lyricsShadowColor); presoTitle1.setTextColor(lyricsTextColor); presoTitle1.setTextSize(FullscreenActivity.presoTitleSize); presoTitle1.setTypeface(FullscreenActivity.presofont); presoTitle1.setText(" "); presoTitle2 = (TextView) findViewById(R.id.presoTitle2); presoTitle2.setShadowLayer(25.0f, -5, 5, lyricsShadowColor); presoTitle2.setTextColor(lyricsTextColor); presoTitle2.setTextSize(FullscreenActivity.presoTitleSize); presoTitle2.setTypeface(FullscreenActivity.presofont); presoTitle2.setText(" "); presoAuthor1 = (TextView) findViewById(R.id.presoAuthor1); presoAuthor1.setShadowLayer(25.0f, -5, 5, lyricsShadowColor); presoAuthor1.setTextColor(lyricsTextColor); presoAuthor1.setText(" "); presoAuthor1.setTextSize(FullscreenActivity.presoAuthorSize); presoAuthor1.setTypeface(FullscreenActivity.presofont); presoAuthor2 = (TextView) findViewById(R.id.presoAuthor2); presoAuthor2.setShadowLayer(25.0f, -5, 5, lyricsShadowColor); presoAuthor2.setTextColor(lyricsTextColor); presoAuthor2.setText(" "); presoAuthor2.setTextSize(FullscreenActivity.presoAuthorSize); presoAuthor2.setTypeface(FullscreenActivity.presofont); presoAlert = (TextView) findViewById(R.id.presoAlert); presoAlert.setVisibility(View.INVISIBLE); presoAlert.setShadowLayer(25.0f, -5, 5, lyricsShadowColor); presoAlert.setTextColor(lyricsTextColor); presoAlert.setTextSize(FullscreenActivity.presoAlertSize); presoAlert.setTypeface(FullscreenActivity.presofont); presoAlert.setText(""); presoCopyright1 = (TextView) findViewById(R.id.presoCopyright1); presoCopyright1.setShadowLayer(25.0f, -5, 5, lyricsShadowColor); presoCopyright1.setTextColor(lyricsTextColor); presoCopyright1.setTextSize(FullscreenActivity.presoCopyrightSize); presoCopyright1.setTypeface(FullscreenActivity.presofont); presoCopyright1.setText(" "); presoCopyright2 = (TextView) findViewById(R.id.presoCopyright2); presoCopyright2.setShadowLayer(25.0f, -5, 5, lyricsShadowColor); presoCopyright2.setTextColor(lyricsTextColor); presoCopyright2.setTextSize(FullscreenActivity.presoCopyrightSize); presoCopyright2.setTypeface(FullscreenActivity.presofont); presoCopyright2.setText(" "); presoLogo = (ImageView) findViewById(R.id.presoLogo); lyrics1VScrollHolder = findViewById(R.id.scrollView9); lyrics2VScrollHolder = findViewById(R.id.scrollView10); lyrics1HScrollHolder = findViewById(R.id.horizontalScrollView1); lyrics2HScrollHolder = findViewById(R.id.horizontalScrollView2); lyricsINVScrollHolder = lyrics1VScrollHolder; lyricsOUTVScrollHolder = lyrics2VScrollHolder; lyricsINHScrollHolder = lyrics1HScrollHolder; lyricsOUTHScrollHolder = lyrics2HScrollHolder; presoLyrics1.setPadding(FullscreenActivity.xmargin_presentation, FullscreenActivity.ymargin_presentation, FullscreenActivity.xmargin_presentation, 0); presoLyrics2.setPadding(FullscreenActivity.xmargin_presentation, FullscreenActivity.ymargin_presentation, FullscreenActivity.xmargin_presentation, 0); presoLogo.setPadding(FullscreenActivity.xmargin_presentation, FullscreenActivity.ymargin_presentation, FullscreenActivity.xmargin_presentation, FullscreenActivity.ymargin_presentation); bottomBit.setPadding(FullscreenActivity.xmargin_presentation, 0, FullscreenActivity.xmargin_presentation, FullscreenActivity.ymargin_presentation); LayoutParams params = preso.getLayoutParams(); params.width = metrics.widthPixels; params.height = metrics.heightPixels; preso.setLayoutParams(params); presoBGVideo.setSurfaceTextureListener(this); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { defimage = getResources().getDrawable(R.drawable.preso_default_bg,null); } else { defimage = getResources().getDrawable(R.drawable.preso_default_bg); } // Set a listener for the presoLyrics to listen for size changes // This is used for the scale presoLyricsIN = presoLyrics1; presoAuthorIN = presoAuthor1; presoTitleIN = presoTitle1; presoCopyrightIN = presoCopyright1; presoLyricsIN.setHorizontallyScrolling(true); presoLyricsIN.setTextSize(72); ViewTreeObserver vto = presoLyricsIN.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { presoLyricsIN.getViewTreeObserver().removeGlobalOnLayoutListener(this); // Get the width and height of this text //screenwidth = lyricsHolder.getWidth(); screenwidth = lyricsHolder.getWidth(); textwidth = presoLyricsIN.getWidth(); screenheight = lyricsHolder.getHeight(); textheight = presoLyricsIN.getHeight(); if (PresenterMode.autoscale) { doScale(); } else { presoLyricsIN.setTextSize(FullscreenActivity.presoFontSize); updateFontSize(); } } }); updateAlpha(); } public static void UpDatePresentation() { // See what has changed and fade those bits out/in // Crossfade the views if (PresenterMode.blackout.equals("Y")) { blackoutPresentation(); } else if (PresenterMode.logo_on.equals("Y")) { fadeInLogo(); } else if (PresenterMode.song_on.equals("Y")) { crossFadeSong(); } } public static void doScale() { presoLyricsIN.setHorizontallyScrolling(true); lyricsINVScrollHolder.setScaleX(1.0f); lyricsINVScrollHolder.setScaleY(1.0f); lyricsINHScrollHolder.setScaleX(1.0f); lyricsINHScrollHolder.setScaleY(1.0f); // Get possible xscale value float xscale; if (textwidth != 0 && screenwidth != 0) { xscale = (float) screenwidth / (float) textwidth; } else { xscale = 1; } // Get possible yscale value float yscale; if (textheight != 0 && screenheight != 0) { yscale = (float) screenheight / (float) textheight; } else { yscale = 1; } // We have to use the smallest scale factor to make sure both fit if (xscale > yscale) { xscale = yscale; } presoLyricsIN.setPivotY(0); presoLyricsIN.setTranslationY(0); presoLyrics1.setPivotY(0); presoLyrics1.setTranslationY(0); presoLyrics2.setPivotY(0); presoLyrics2.setTranslationY(0); presoLyricsIN.setY(0); presoLyrics1.setY(0); presoLyrics2.setY(0); presoLyricsIN.setPivotX(textwidth / 2); if ((72*xscale)>FullscreenActivity.presoMaxFontSize) { presoLyricsIN.setTextSize(FullscreenActivity.presoMaxFontSize); } else { presoLyricsIN.setTextSize(72 * xscale); } } public static void fadeoutImage1() { // If slideImage1 is visible, fade it out if (slideImage1.getVisibility() == View.VISIBLE && slideImage1.getAlpha() > 0.0f) { slideImage1.setAlpha(1.0f); slideImage1.setVisibility(View.VISIBLE); slideImage1.animate().alpha(0f).setDuration(1000).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { slideImage1.setVisibility(View.INVISIBLE); } }); } else { slideImage1.setAlpha(0.0f); slideImage1.setVisibility(View.INVISIBLE); } } public static void fadeoutImage2() { // If slideImage2 is visible, fade it out if (slideImage2.getVisibility() == View.VISIBLE && slideImage2.getAlpha() > 0.0f) { slideImage2.setAlpha(1.0f); slideImage2.setVisibility(View.VISIBLE); slideImage2.animate().alpha(0f).setDuration(1000).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { slideImage2.setVisibility(View.INVISIBLE); } }); } else { slideImage2.setAlpha(0.0f); slideImage2.setVisibility(View.INVISIBLE); } } public static void fadeoutCopyright1() { // If presoCopyright1 is visible, fade it out if (presoCopyright1.getVisibility() == View.VISIBLE && presoCopyright1.getAlpha() > 0.0f) { presoCopyright1.setAlpha(1.0f); presoCopyright1.setVisibility(View.VISIBLE); presoCopyright1.animate().alpha(0f).setDuration(1000).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { presoCopyright1.setVisibility(View.INVISIBLE); } }); } else { presoCopyright1.setAlpha(0.0f); presoCopyright1.setVisibility(View.INVISIBLE); } } public static void fadeoutCopyright2() { // If presoCopyright2 is visible, it out if (presoCopyright2.getVisibility() == View.VISIBLE && presoCopyright2.getAlpha() > 0.0f) { presoCopyright2.setAlpha(1.0f); presoCopyright2.setVisibility(View.VISIBLE); presoCopyright2.animate().alpha(0f).setDuration(1000).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { presoCopyright2.setVisibility(View.INVISIBLE); } }); } else { presoCopyright2.setAlpha(0.0f); presoCopyright2.setVisibility(View.INVISIBLE); } } public static void fadeoutTitle1() { // If presoTitle1 is visible, fade it out if (presoTitle1.getVisibility() == View.VISIBLE && presoTitle1.getAlpha() > 0.0f) { presoTitle1.setAlpha(1.0f); presoTitle1.setVisibility(View.VISIBLE); presoTitle1.animate().alpha(0f).setDuration(1000).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { presoTitle1.setVisibility(View.INVISIBLE); } }); } else { presoTitle1.setAlpha(0.0f); presoTitle1.setVisibility(View.INVISIBLE); } } public static void fadeoutTitle2() { // If presoTitle2 is visible, it out if (presoTitle2.getVisibility() == View.VISIBLE && presoTitle2.getAlpha() > 0.0f) { presoTitle2.setAlpha(1.0f); presoTitle2.setVisibility(View.VISIBLE); presoTitle2.animate().alpha(0f).setDuration(1000).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { presoTitle2.setVisibility(View.INVISIBLE); } }); } else { presoTitle2.setAlpha(0.0f); presoTitle2.setVisibility(View.INVISIBLE); } } public static void fadeoutAuthor1() { // If presoAuthor1 is visible, fade it out if (presoAuthor1.getVisibility() == View.VISIBLE && presoAuthor1.getAlpha() > 0.0f) { presoAuthor1.setAlpha(1.0f); presoAuthor1.setVisibility(View.VISIBLE); presoAuthor1.animate().alpha(0f).setDuration(1000).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { presoAuthor1.setVisibility(View.INVISIBLE); } }); } else { presoAuthor1.setAlpha(0.0f); presoAuthor1.setVisibility(View.INVISIBLE); } } public static void fadeoutAuthor2() { // If presoAuthor2 is visible, it out if (presoAuthor2.getVisibility() == View.VISIBLE && presoAuthor2.getAlpha() > 0.0f) { presoAuthor2.setAlpha(1.0f); presoAuthor2.setVisibility(View.VISIBLE); presoAuthor2.animate().alpha(0f).setDuration(1000).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { presoAuthor2.setVisibility(View.INVISIBLE); } }); } else { presoAuthor2.setAlpha(0.0f); presoAuthor2.setVisibility(View.INVISIBLE); } } public static void fadeinAlert() { presoAlert.setText(PresenterMode.myAlert); presoAlert.setTypeface(FullscreenActivity.presofont); if (PresenterMode.alert_on.equals("Y") && presoAlert.getVisibility() == View.INVISIBLE) { presoAlert.setAlpha(0f); presoAlert.setVisibility(View.VISIBLE); presoAlert.animate().alpha(1f).setDuration(1000).setListener(null); } else { presoAlert.setAlpha(0f); presoAlert.setVisibility(View.VISIBLE); } } public static void fadeoutAlert() { presoAlert.setText(PresenterMode.myAlert); if (presoAlert.getVisibility() == View.VISIBLE) { presoAlert.setAlpha(1f); presoAlert.animate().alpha(0f).setDuration(1000).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { presoAlert.setVisibility(View.INVISIBLE); } }); } else { presoAlert.setAlpha(0f); presoAlert.setVisibility(View.INVISIBLE); } } public static void fadeoutLyrics2() { // If presoLyrics are visible, fade them out if (presoLyrics2.getVisibility() == View.VISIBLE && presoLyrics2.getAlpha() > 0.0f) { presoLyrics2.setAlpha(1.0f); presoLyrics2.setVisibility(View.VISIBLE); presoLyrics2.animate().alpha(0f).setDuration(1000).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { presoLyrics2.setVisibility(View.INVISIBLE); } }); } else { presoLyrics2.setAlpha(0.0f); presoLyrics2.setVisibility(View.INVISIBLE); } } public static void fadeoutLyrics1() { // If presoLyrics are visible, fade them out if (presoLyrics1.getVisibility() == View.VISIBLE && presoLyrics1.getAlpha() > 0.0f) { presoLyrics1.setAlpha(1.0f); presoLyrics1.setVisibility(View.VISIBLE); presoLyrics1.animate().alpha(0f).setDuration(1000).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { presoLyrics1.setVisibility(View.INVISIBLE); } }); } else { presoLyrics1.setAlpha(0.0f); presoLyrics1.setVisibility(View.INVISIBLE); } } public static void fadeInLogo() { // If logo is invisible or faded out, fade it in if (presoLogo.getVisibility() == View.INVISIBLE || presoLogo.getVisibility() == View.GONE || presoLogo.getAlpha() == 0f) { presoLogo.setAlpha(0.0f); presoLogo.setVisibility(View.VISIBLE); presoLogo.animate().alpha(1f).setDuration(1000).setListener(null); } else { presoLogo.setAlpha(1.0f); presoLogo.setVisibility(View.VISIBLE); } // We want to fade out the song details fadeoutLyrics1(); fadeoutLyrics2(); fadeoutTitle1(); fadeoutTitle2(); fadeoutAuthor1(); fadeoutAuthor2(); fadeoutCopyright1(); fadeoutCopyright2(); fadeoutImage1(); fadeoutImage2(); PresenterMode.logo_on = "Y"; } public static void fadeOutLogo() { // If presoLogo is visible, fade it out if (presoLogo.getVisibility() == View.VISIBLE && presoLogo.getAlpha() > 0.0f) { presoLogo.setAlpha(1.0f); presoLogo.setVisibility(View.VISIBLE); presoLogo.animate().alpha(0f).setDuration(1000).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { presoLogo.setVisibility(View.INVISIBLE); } }); } else { presoLogo.setAlpha(0.0f); presoLogo.setVisibility(View.INVISIBLE); } } public static void crossFadeSong() { // There are two views for each song element (presoLyrics, presoAuthor, presoCopyright, presoAlert, slideImage) // This is to allow for smooth crossfading. // If the logo is showing, fade it out then hide it if (presoLogo.getVisibility() == View.VISIBLE) { fadeOutLogo(); } // If the user is on a blank screen, we need to fade back in the background image or video if (preso.getVisibility() == View.INVISIBLE || preso.getVisibility() == View.GONE) { fadeInPage(); } // Decide which view we are fading in. By default its the 1st view whichPresoLyricsToUse = 1; slideImageIN = slideImage1; slideImageOUT = slideImage2; presoLyricsIN = presoLyrics1; presoLyricsOUT = presoLyrics2; presoTitleIN = presoTitle1; presoTitleOUT = presoTitle2; presoAuthorIN = presoAuthor1; presoAuthorOUT = presoAuthor2; presoCopyrightIN = presoCopyright1; presoCopyrightOUT = presoCopyright2; lyricsINVScrollHolder = lyrics1VScrollHolder; lyricsOUTVScrollHolder = lyrics2VScrollHolder; lyricsINHScrollHolder = lyrics1HScrollHolder; lyricsOUTHScrollHolder = lyrics2HScrollHolder; if (presoLyrics1.getVisibility() == View.VISIBLE) { // 1st is on already, so we are fading in the 2nd view whichPresoLyricsToUse = 2; slideImageIN = slideImage2; slideImageOUT = slideImage1; presoLyricsIN = presoLyrics2; presoLyricsOUT = presoLyrics1; presoTitleIN = presoTitle2; presoTitleOUT = presoTitle1; presoAuthorIN = presoAuthor2; presoAuthorOUT = presoAuthor1; presoCopyrightIN = presoCopyright2; presoCopyrightOUT = presoCopyright1; lyricsINVScrollHolder = lyrics2VScrollHolder; lyricsOUTVScrollHolder = lyrics1VScrollHolder; lyricsINHScrollHolder = lyrics2HScrollHolder; lyricsOUTHScrollHolder = lyrics1HScrollHolder; } // Make sure the visibilities and alphas of the fade in view are ready presoLyricsIN.setAlpha(0.0f); presoLyricsIN.setVisibility(View.VISIBLE); presoLyricsIN.setScaleX(1); presoLyricsIN.setScaleY(1); if (PresenterMode.buttonPresentText.equals("$$_IMAGE_$$!")) { slideImageIN.setAlpha(0.0f); slideImageIN.setVisibility(View.VISIBLE); presoBGImage.setVisibility(View.INVISIBLE); presoBGVideo.setVisibility(View.INVISIBLE); } // Decide on the font being used SetTypeFace.setTypeface(); presoLyricsIN.setTypeface(FullscreenActivity.presofont); presoTitleIN.setTypeface(FullscreenActivity.presofont); presoAuthorIN.setTypeface(FullscreenActivity.presofont); presoCopyrightIN.setTypeface(FullscreenActivity.presofont); presoAlert.setTypeface(FullscreenActivity.presofont); presoLyricsIN.setTextSize(72); // Make sure the listener is ready for the new text being drawn to deal with scaling ViewTreeObserver vto = presoLyricsIN.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { presoLyricsIN.getViewTreeObserver().removeOnGlobalLayoutListener(this); //presoLyricsIN.getViewTreeObserver().removeGlobalOnLayoutListener(this); // Get the width and height of this text screenwidth = lyricsHolder.getWidth(); textwidth = presoLyricsIN.getWidth(); screenheight = lyricsHolder.getHeight(); textheight = presoLyricsIN.getHeight(); if (PresenterMode.autoscale) { doScale(); } else { presoLyricsIN.setTextSize(FullscreenActivity.presoFontSize); presoLyricsOUT.setTextSize(FullscreenActivity.presoFontSize); } // Animate the view in presoLyricsIN.animate().alpha(1f).setDuration(1000).setListener(null); // Animate the other view out - ONLY IF IT IS VISIBLE if (presoLyricsOUT.getVisibility() == View.VISIBLE) { presoLyricsOUT.setAlpha(1.0f); presoLyricsOUT.animate().alpha(0f).setDuration(1000).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { presoLyricsOUT.setVisibility(View.INVISIBLE); presoLyricsOUT.setScaleX(1); presoLyricsOUT.setScaleY(1); presoLyricsOUT.setPivotX(textwidth / 2); presoLyricsOUT.setPivotY(0); presoLyricsOUT.setY(0); presoLyricsOUT.setTranslationY(0); } }); } else { // Just hide the out one if wasn't already visible presoLyricsOUT.setAlpha(0.0f); presoLyricsOUT.setVisibility(View.INVISIBLE); presoLyricsOUT.setScaleX(1); presoLyricsOUT.setScaleY(1); presoLyricsOUT.setPivotX(textwidth / 2); presoLyricsOUT.setPivotY(0); presoLyricsOUT.setY(0); presoLyricsOUT.setTranslationY(0); } } }); // Set the text of the view that is being faded in // This should call the vto once updated presoLyricsIN.setText(PresenterMode.buttonPresentText); // Now we can do the same to the title, author, copyright and other fields // We only need to crossfade if the contents have changed (i.e. a different song). // Otherwise just switch them over presoTitleIN.setText(PresenterMode.presoTitle); presoAuthorIN.setText(PresenterMode.presoAuthor); presoCopyrightIN.setText(PresenterMode.presoCopyright); presoTitleIN.setTypeface(FullscreenActivity.presofont); presoAuthorIN.setTypeface(FullscreenActivity.presofont); presoCopyrightIN.setTypeface(FullscreenActivity.presofont); if (PresenterMode.buttonPresentText.equals("$$_IMAGE_$$")) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; Bitmap ThumbImage; // Check if the image exists File checkImgFile = new File(PresenterMode.imageAddress); if (checkImgFile.exists()) { //Returns null, sizes are in the options variable BitmapFactory.decodeFile(PresenterMode.imageAddress, options); int width = options.outWidth; int height = options.outHeight; if (width > 1024) { width = 1024; float newheight = height / ((float) width / 1024.0f); height = Math.round(newheight); } if (height > 768) { height = 768; float newwidth = width / ((float) height / 768.0f); width = Math.round(newwidth); } ThumbImage = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(PresenterMode.imageAddress), width, height); } else { ThumbImage = null; } slideImageIN.setImageBitmap(ThumbImage); slideImageIN.setAlpha(0.0f); slideImageIN.setVisibility(View.VISIBLE); presoLyricsIN.setText(""); presoTitleIN.setText(""); presoAuthorIN.setText(""); presoCopyrightIN.setText(""); } if (presoTitleOUT.getVisibility() == View.VISIBLE && presoTitleOUT.getAlpha() > 0 && !presoTitleOUT.getText().toString().equals(PresenterMode.presoTitle)) { presoTitleOUT.animate().alpha(0f).setDuration(1000).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { presoTitleOUT.setVisibility(View.INVISIBLE); } }).start(); presoTitleIN.setAlpha(0f); presoTitleIN.setVisibility(View.VISIBLE); presoTitleIN.animate().alpha(1f).setDuration(1000).setListener(null); } else { presoTitleOUT.setAlpha(0f); presoTitleOUT.setVisibility(View.INVISIBLE); presoTitleIN.setAlpha(1f); presoTitleIN.setVisibility(View.VISIBLE); } if (presoAuthorOUT.getVisibility() == View.VISIBLE && presoAuthorOUT.getAlpha() > 0 && !presoAuthorOUT.getText().toString().equals(PresenterMode.presoAuthor)) { presoAuthorOUT.animate().alpha(0f).setDuration(1000).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { presoAuthorOUT.setVisibility(View.INVISIBLE); } }).start(); presoAuthorIN.setAlpha(0f); presoAuthorIN.setVisibility(View.VISIBLE); presoAuthorIN.animate().alpha(1f).setDuration(1000).setListener(null); } else { presoAuthorOUT.setAlpha(0f); presoAuthorOUT.setVisibility(View.INVISIBLE); presoAuthorIN.setAlpha(1f); presoAuthorIN.setVisibility(View.VISIBLE); } if (presoCopyrightOUT.getVisibility() == View.VISIBLE && presoCopyrightOUT.getAlpha() > 0 && !presoCopyrightOUT.getText().toString().equals(PresenterMode.presoCopyright)) { presoCopyrightOUT.animate().alpha(0f).setDuration(1000).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { presoCopyrightOUT.setVisibility(View.INVISIBLE); } }).start(); presoCopyrightIN.setAlpha(0f); presoCopyrightIN.setVisibility(View.VISIBLE); presoCopyrightIN.animate().alpha(1f).setDuration(1000).setListener(null).start(); } else { presoCopyrightOUT.setAlpha(0f); presoCopyrightOUT.setVisibility(View.INVISIBLE); presoCopyrightIN.setAlpha(1f); presoCopyrightIN.setVisibility(View.VISIBLE); } if (slideImageOUT.getVisibility() == View.VISIBLE && slideImageOUT.getAlpha() > 0) { slideImageOUT.animate().alpha(0f).setDuration(1000).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { slideImageOUT.setVisibility(View.INVISIBLE); slideImageOUT.setImageDrawable(null); } }).start(); } else { slideImageOUT.setVisibility(View.INVISIBLE); slideImageOUT.setAlpha(0.0f); slideImageOUT.setImageDrawable(null); } if (PresenterMode.buttonPresentText.equals("$$_IMAGE_$$")) { slideImageIN.setAlpha(0f); slideImageIN.setVisibility(View.VISIBLE); slideImageIN.animate().alpha(1f).setDuration(1000).setListener(null).start(); } } public static void fadeInPage() { // Simply fade in preso PresenterMode.blackout = "N"; // Switch the logo button back off in case PresenterMode.logo_on = "N"; presoLogo.setVisibility(View.GONE); preso.setAlpha(0f); preso.setVisibility(View.VISIBLE); preso.animate().alpha(1f).setDuration(1000).setListener(null).start(); } public static void fadeOutPage() { // Simply fade out preso preso.setAlpha(1f); preso.setVisibility(View.VISIBLE); preso.animate().alpha(0f).setDuration(1000).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { preso.setVisibility(View.GONE); // Empty the string values on the presentation - resets it all presoLyrics1.setText(" "); presoLyrics2.setText(" "); presoTitle1.setText(" "); presoTitle2.setText(" "); presoAuthor1.setText(" "); presoAuthor2.setText(" "); presoCopyright1.setText(" "); presoCopyright2.setText(" "); presoAlert.setText(""); } }).start(); } public static void fixBackground() { // Decide if user is using video or image for background switch (FullscreenActivity.backgroundTypeToUse) { case "image": presoBGImage.setVisibility(View.VISIBLE); presoBGVideo.setVisibility(View.INVISIBLE); if (mMediaPlayer != null && mMediaPlayer.isPlaying()) { mMediaPlayer.pause(); } if (FullscreenActivity.backgroundToUse.equals("img1")) { imgFile = img1File; } else { imgFile = img2File; } if (imgFile.exists()) { if (imgFile.toString().contains("ost_bg.png")) { presoBGImage.setImageDrawable(defimage); } else { myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); dr = new BitmapDrawable(null,myBitmap); //dr = new BitmapDrawable(myBitmap); presoBGImage.setImageDrawable(dr); } presoBGImage.setVisibility(View.VISIBLE); } break; case "video": presoBGImage.setVisibility(View.INVISIBLE); presoBGVideo.setVisibility(View.VISIBLE); if (FullscreenActivity.backgroundToUse.equals("vid1")) { vidFile = vid1File; } else { vidFile = vid2File; } if (mMediaPlayer != null) { mMediaPlayer.start(); } preso.setBackgroundColor(0xff000000); myBitmap = null; dr = null; presoBGImage.setImageDrawable(null); presoBGImage.setVisibility(View.GONE); break; default: preso.setBackgroundColor(0xff000000); myBitmap = null; dr = null; presoBGImage.setImageDrawable(null); presoBGImage.setVisibility(View.GONE); break; } updateAlpha(); } public static void blackoutPresentation() { if (preso.getVisibility() == View.GONE) { fadeInPage(); } else { fadeOutPage(); } } public static void updateFontSize() { presoLyrics1.setScaleX(1.0f); presoLyrics1.setScaleY(1.0f); presoLyrics2.setScaleX(1.0f); presoLyrics2.setScaleY(1.0f); lyricsINVScrollHolder.setScaleX(1.0f); lyricsINVScrollHolder.setScaleY(1.0f); lyricsOUTVScrollHolder.setScaleX(1.0f); lyricsOUTVScrollHolder.setScaleY(1.0f); lyricsINHScrollHolder.setScaleX(1.0f); lyricsINHScrollHolder.setScaleY(1.0f); lyricsOUTHScrollHolder.setScaleX(1.0f); lyricsOUTHScrollHolder.setScaleY(1.0f); presoLyrics1.setTextSize(FullscreenActivity.presoFontSize); presoLyrics2.setTextSize(FullscreenActivity.presoFontSize); presoTitle1.setTextSize(FullscreenActivity.presoTitleSize); presoTitle2.setTextSize(FullscreenActivity.presoTitleSize); presoAuthor1.setTextSize(FullscreenActivity.presoAuthorSize); presoAuthor2.setTextSize(FullscreenActivity.presoAuthorSize); presoCopyright1.setTextSize(FullscreenActivity.presoCopyrightSize); presoCopyright2.setTextSize(FullscreenActivity.presoCopyrightSize); presoAlert.setTextSize(FullscreenActivity.presoAlertSize); } public static void resetFontSize() { lyricsINVScrollHolder.setScaleX(1.0f); lyricsINVScrollHolder.setScaleY(1.0f); lyricsOUTVScrollHolder.setScaleX(1.0f); lyricsOUTVScrollHolder.setScaleY(1.0f); lyricsINHScrollHolder.setScaleX(1.0f); lyricsINHScrollHolder.setScaleY(1.0f); lyricsOUTHScrollHolder.setScaleX(1.0f); lyricsOUTHScrollHolder.setScaleY(1.0f); presoLyricsIN.setScaleX(1.0f); presoLyricsIN.setScaleY(1.0f); presoLyricsOUT.setScaleX(1.0f); presoLyricsOUT.setScaleY(1.0f); presoLyricsIN.setTextSize(72); presoLyricsOUT.setTextSize(72); ViewTreeObserver vto = presoLyricsIN.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { presoLyricsIN.getViewTreeObserver().removeOnGlobalLayoutListener(this); //presoLyricsIN.getViewTreeObserver().removeGlobalOnLayoutListener(this); // Get the width and height of this text screenwidth = lyricsHolder.getWidth(); textwidth = presoLyricsIN.getWidth(); screenheight = lyricsHolder.getHeight(); textheight = presoLyricsIN.getHeight(); if (PresenterMode.autoscale) { doScale(); } else { presoLyricsIN.setTextSize(FullscreenActivity.presoFontSize); presoLyricsOUT.setTextSize(FullscreenActivity.presoFontSize); } } }); } public static void changeMargins() { // Get width and height presoLyricsIN.setTextSize(72); preso.setPadding(PresenterMode.tempxmargin, PresenterMode.tempymargin, PresenterMode.tempxmargin, PresenterMode.tempymargin); if (PresenterMode.autoscale) { doScale(); } else { presoLyrics1.setTextSize(FullscreenActivity.presoFontSize); presoLyrics2.setTextSize(FullscreenActivity.presoFontSize); } } public static void updateAlpha() { presoBGImage.setAlpha(FullscreenActivity.presoAlpha); presoBGVideo.setAlpha(FullscreenActivity.presoAlpha); } @Override public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { s = new Surface(surface); mMediaPlayer = new MediaPlayer(); mMediaPlayer.setSurface(s); mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mMediaPlayer.setOnPreparedListener(this); mMediaPlayer.setOnCompletionListener(this); if (FullscreenActivity.backgroundTypeToUse.equals("video")) { try { mMediaPlayer.setDataSource(vidFile); mMediaPlayer.prepareAsync(); } catch (IllegalArgumentException | SecurityException | IllegalStateException | IOException e) { e.printStackTrace(); } } } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { return false; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surface) { } @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { } public static void reloadVideo() throws IOException { if (mMediaPlayer==null) { mMediaPlayer = new MediaPlayer(); mMediaPlayer.setSurface(s); } mMediaPlayer.reset(); try { mMediaPlayer.setDataSource(vidFile); } catch (IOException e1) { e1.printStackTrace(); } try { mMediaPlayer.prepareAsync(); } catch (Exception e) { Log.e("Presentation window","media player error"); } } @Override public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { } @Override public void onPrepared(MediaPlayer mp) { mp.start(); } @Override public void onCompletion(MediaPlayer mp) { if (mp!=null) { if (mp.isPlaying()) { mp.stop(); } mp.reset(); } try { reloadVideo(); } catch (IOException e) { e.printStackTrace(); } } }