content: package com.yalantis.starwars;
  
  import android.annotation.TargetApi;
  import android.app.ActivityManager;
  import android.content.Context;
  import android.content.pm.ConfigurationInfo;
  import android.content.res.TypedArray;
  import android.graphics.Bitmap;
  import android.graphics.Canvas;
  import android.graphics.Color;
  import android.graphics.PixelFormat;
  import android.opengl.GLSurfaceView;
  import android.os.Build;
  import android.os.Handler;
  import android.os.Looper;
  import android.util.AttributeSet;
  import android.widget.FrameLayout;
  
  import com.yalantis.starwars.interfaces.TilesFrameLayoutListener;
  import com.yalantis.starwars.render.StarWarsRenderer;
  import com.yalantis.starwars.widget.StarWarsTilesGLSurfaceView;
  
  /**
   * Created by Artem Kholodnyi on 11/9/15.
   */
  public class TilesFrameLayout extends FrameLayout {
  
      private StarWarsTilesGLSurfaceView mGLSurfaceView;
      private StarWarsRenderer mRenderer;
      private TilesFrameLayoutListener mListener;
      private int mAnimationDuration;
      private int mNumberOfTilesX;
  
      public TilesFrameLayout(Context context) {
          super(context);
          init(context, null, 0);
      }
  
      public TilesFrameLayout(Context context, AttributeSet attrs) {
          super(context, attrs);
          init(context, attrs, 0);
      }
  
      public TilesFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
          super(context, attrs, defStyleAttr);
          init(context, attrs, defStyleAttr);
      }
  
      @TargetApi(Build.VERSION_CODES.LOLLIPOP)
      public TilesFrameLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
          super(context, attrs, defStyleAttr, defStyleRes);
          init(context, attrs, defStyleAttr);
      }
  
  
      private void init(Context context, AttributeSet attrs, int defStyle) {
          TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.sw_StarWarsTilesFrameLayout, defStyle, 0);
  
          mAnimationDuration = a.getInt(R.styleable.sw_StarWarsTilesFrameLayout_sw_animationDuration, 1500);
          mNumberOfTilesX = a.getInt(R.styleable.sw_StarWarsTilesFrameLayout_sw_numberOfTilesX, 35);
  
          a.recycle();
          initGlSurfaceView();
      }
  
      @Override
      protected void onFinishInflate() {
          super.onFinishInflate();
          addView(mGLSurfaceView);
      }
  
      @Override
      protected void onDraw(Canvas canvas) {
          super.onDraw(canvas);
      }
  
      private void initGlSurfaceView() {
          mGLSurfaceView = new StarWarsTilesGLSurfaceView(getContext());
          mGLSurfaceView.setBackgroundColor(Color.TRANSPARENT);
  
          // Check if the system supports OpenGL ES 2.0.
          final ActivityManager activityManager = (ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE);
          final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
          final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000;
  
          if (supportsEs2) {
              // Request an OpenGL ES 2.0 compatible context.
              mGLSurfaceView.setEGLContextClientVersion(2);
  
              mRenderer = new StarWarsRenderer(mGLSurfaceView, this, mAnimationDuration, mNumberOfTilesX);
              mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
              mGLSurfaceView.getHolder().setFormat(PixelFormat.TRANSPARENT);
              mGLSurfaceView.setRenderer(mRenderer);
              mGLSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
              mGLSurfaceView.setZOrderOnTop(true);
          } else {
              throw new UnsupportedOperationException();
          }
      }
  
      public void startAnimation() {
          drawToTexture();
      }
  
      private void drawToTexture() {
          Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_4444);
          Canvas canvas = new Canvas(bitmap);
          super.draw(canvas);
          mRenderer.updateTexture(bitmap);
      }
  
      public void reveal() {
          mGLSurfaceView.queueEvent(new Runnable() {
              @Override
              public void run() {
                  new Handler(Looper.getMainLooper()).post(new Runnable() {
                      @Override
                      public void run() {
                          mRenderer.startAnimation();
                          removeViewAt(0);
                      }
                  });
              }
          });
      }
  
      @Override
      protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
          super.onLayout(changed, left, top, right, bottom);
      }
  
      public void onResume() {
          mGLSurfaceView.onResume();
      }
  
      public void onPause() {
          mGLSurfaceView.onPause();
      }
  
      public void onAnimationFinished() {
          if (mListener != null) {
              mListener.onAnimationFinished();
          }
      }
  
      public void setOnAnimationFinishedListener(TilesFrameLayoutListener listener) {
          this.mListener = listener;
      }
  }
  