package allen.town.podcast.view;

/*
 * Copyright (C) Google Inc.  All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import android.content.Context;
import android.util.AttributeSet;
import android.widget.VideoView;

public class AspectRatioVideoView extends VideoView {


    private int mVideoWidth;
    private int mVideoHeight;
    private float mAvailableWidth = -1;
    private float mAvailableHeight = -1;

    public AspectRatioVideoView(Context context) {
        this(context, null);
    }

    public AspectRatioVideoView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public AspectRatioVideoView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        mVideoWidth = 0;
        mVideoHeight = 0;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (mVideoWidth <= 0 || mVideoHeight <= 0) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            return;
        }

        if (mAvailableWidth < 0 || mAvailableHeight < 0) {
            mAvailableWidth = getWidth();
            mAvailableHeight = getHeight();
        }

        float heightRatio = (float) mVideoHeight / mAvailableHeight;
        float widthRatio = (float) mVideoWidth / mAvailableWidth;

        int scaledHeight;
        int scaledWidth;

        if (heightRatio > widthRatio) {
            scaledHeight = (int) Math.ceil((float) mVideoHeight
                    / heightRatio);
            scaledWidth = (int) Math.ceil((float) mVideoWidth
                    / heightRatio);
        } else {
            scaledHeight = (int) Math.ceil((float) mVideoHeight
                    / widthRatio);
            scaledWidth = (int) Math.ceil((float) mVideoWidth
                    / widthRatio);
        }

        setMeasuredDimension(scaledWidth, scaledHeight);
    }

    /**
     * Source code originally from:
     * http://clseto.mysinablog.com/index.php?op=ViewArticle&articleId=2992625
     *
     * @param videoWidth
     * @param videoHeight
     */
    public void setVideoSize(int videoWidth, int videoHeight) {
        // Set the new video size
        mVideoWidth = videoWidth;
        mVideoHeight = videoHeight;

        /*
         * If this isn't set the video is stretched across the
         * SurfaceHolders display surface (i.e. the SurfaceHolder
         * as the same size and the video is drawn to fit this
         * display area). We want the size to be the video size
         * and allow the aspectratio to handle how the surface is shown
         */
        getHolder().setFixedSize(videoWidth, videoHeight);

        requestLayout();
        invalidate();
    }

    /**
     * Sets the maximum size that the view might expand to
     * @param width
     * @param height
     */
    public void setAvailableSize(float width, float height) {
        mAvailableWidth = width;
        mAvailableHeight = height;
        requestLayout();
    }

}
